Hi,
The attached patch adds support for IEEE 1149.6 2003 AIO statements to
the BSDL parser. No further functionality or extraction of data for
urjtag is added, though.
Tested with BSDL files for AMD's XC7Z007S devices.
Cheers,
Arnim
From 3d2ca8a8271a922df5c77b6ab77f1bf9b125939c Mon Sep 17 00:00:00 2001
From: devsaurus <devsau...@users.noreply.github.com>
Date: Tue, 25 Mar 2025 20:56:51 +0100
Subject: [PATCH] add support for IEEE 1149.6 2003 AIO
---
urjtag/src/bsdl/bsdl_bison.y | 67 ++++++++++++++++++++++++++++++++++--
urjtag/src/bsdl/bsdl_flex.l | 33 ++++++++++++++++--
urjtag/src/bsdl/bsdl_types.h | 1 +
urjtag/src/bsdl/vhdl_bison.y | 52 +++++++++++++++++++++-------
urjtag/src/bsdl/vhdl_flex.l | 5 ++-
5 files changed, 139 insertions(+), 19 deletions(-)
diff --git a/urjtag/src/bsdl/bsdl_bison.y b/urjtag/src/bsdl/bsdl_bison.y
index c00d3fd7..b633e289 100644
--- a/urjtag/src/bsdl/bsdl_bison.y
+++ b/urjtag/src/bsdl/bsdl_bison.y
@@ -117,12 +117,12 @@ LEGAL NOTICES:
*/
-%pure-parser
+%define api.pure
%parse-param {urj_bsdl_parser_priv_t *priv_data}
/* See https://lists.gnu.org/archive/html/bug-bison/2014-02/msg00002.html */
%lex-param {void *HACK}
%defines
-%name-prefix "urj_bsdl_"
+%define api.prefix {urj_bsdl_}
%{
#include <stdlib.h>
@@ -224,6 +224,10 @@ void yyerror (urj_bsdl_parser_priv_t *, const char *);
%token ISC_PROCEDURE
%token ISC_ACTION PROPRIETARY OPTIONAL RECOMMENDED
%token ISC_ILLEGAL_EXIT
+%token AIO_COMPONENT_CONFORMANCE STD_1149_6_2003
+%token AIO_EXTEST_PULSE_EXECUTION WAIT_DURATION
+%token AIO_EXTEST_TRAIN_EXECUTION TRAIN MAXIMUM_TIME
+%token AIO_PIN_BEHAVIOR SEMICOLON AC_SELECT LP_TIME HP_TIME ON_CHIP
%token ILLEGAL
%type <str> HEX_STRING
@@ -265,6 +269,7 @@ BSDL_Statement : BSDL_Pin_Map
| BSDL_Compliance_Patterns
| BSDL_Component_Conformance
| ISC_Extension
+ | AIO_Extension
| error
{
Print_Error (priv_data, _("Unsupported BSDL construct found"));
@@ -881,7 +886,63 @@ Exit_Instruction_List : IDENTIFIER
| Exit_Instruction_List COMMA IDENTIFIER
{ free ($3); }
;
-
+/****************************************************************************/
+AIO_Extension : AIO_Conformance
+ | AIO_EXTEST_PULSE_EXECUTION AIO_EXTEST_Pulse_Spec
+ | AIO_EXTEST_TRAIN_EXECUTION AIO_EXTEST_Train_Spec
+ | AIO_PIN_BEHAVIOR AC_Pin_Info_List
+;
+AIO_Conformance : AIO_COMPONENT_CONFORMANCE STD_1149_6_2003
+ { priv_data->jtag_ctrl->conformance = URJ_BSDL_CONF_6_2003; }
+;
+/****************************************************************************/
+AIO_EXTEST_Pulse_Spec : WAIT_DURATION Time_Spec
+;
+Time_Spec : REAL_NUMBER
+ { free ($1); }
+ | Clock_Cycles
+;
+/****************************************************************************/
+AIO_EXTEST_Train_Spec : Min_Pulse_Count
+ | Min_Pulse_Count COMMA Max_Time_Spec
+;
+Min_Pulse_Count : TRAIN DECIMAL_NUMBER
+;
+Max_Time_Spec : MAXIMUM_TIME REAL_NUMBER
+ { free ($2); }
+;
+/****************************************************************************/
+AC_Pin_Info_List : AC_Pin_Info
+ | AC_Pin_Info_List SEMICOLON AC_Pin_Info
+;
+AC_Pin_Info : AC_Port_List
+ | AC_Port_List COLON ACDC_Select_Cell
+ | AC_Port_List COLON ACDC_Select_Cell Time_Constants
+ | AC_Port_List COLON Time_Constants
+;
+AC_Port_List : AC_Port
+ | AC_Port_List COMMA AC_Port
+;
+AC_Port : Port_Id
+ | Port_Id LBRACKET Input_Cell_List RBRACKET
+;
+Input_Cell_List : DECIMAL_NUMBER
+ | Input_Cell_List COMMA DECIMAL_NUMBER
+;
+ACDC_Select_Cell : AC_SELECT EQUAL DECIMAL_NUMBER
+;
+Time_Constants : LP_Time_Constant
+ | HP_Time_Constant
+ | LP_Time_Constant HP_Time_Constant
+;
+LP_Time_Constant : LP_TIME EQUAL Time_Constant
+;
+HP_Time_Constant : HP_TIME EQUAL Time_Constant
+ | HP_TIME EQUAL Time_Constant ON_CHIP
+;
+Time_Constant : REAL_NUMBER
+ { free ($1); }
+;
%% /* End rules, begin programs */
/*----------------------------------------------------------------------*/
diff --git a/urjtag/src/bsdl/bsdl_flex.l b/urjtag/src/bsdl/bsdl_flex.l
index 1f7b98c9..d8c481ba 100644
--- a/urjtag/src/bsdl/bsdl_flex.l
+++ b/urjtag/src/bsdl/bsdl_flex.l
@@ -139,6 +139,7 @@ LEGAL NOTICES:
#endif
#define YY_EXTRA_TYPE urj_bsdl_scan_extra_t *
+#define YYSTYPE URJ_BSDL_STYPE
static char *new_string (urj_bsdl_scan_extra_t *, const char *);
@@ -159,7 +160,7 @@ static char *new_string (urj_bsdl_scan_extra_t *, const char *);
%n 520
%k 140
%o 3000
-%START RES BOU REG PAC ISC
+%START RES BOU REG PAC ISC AIO
White [ \t\b\r]*
VHDL_Comment \-\-[^\n]*
Binary_Pattern [0-1]+
@@ -177,6 +178,7 @@ Rparen [\)]
Lbracket [\[]
Rbracket [\]]
Colon [\:]
+Semicolon [\;]
Asterisk [\*]
Dollar [\$]
Equal [\=]
@@ -243,6 +245,7 @@ Component_Conformance COMPONENT_CONFORMANCE
Std_1149_1_1990 STD_1149_1_1990
Std_1149_1_1993 STD_1149_1_1993
Std_1149_1_2001 STD_1149_1_2001
+Std_1149_6_2003 STD_1149_6_2003
ISC_Conformance ISC_CONFORMANCE
Std_1532_2001 STD_1532_2001
Std_1532_2002 STD_1532_2002
@@ -276,6 +279,17 @@ Proprierary PROPRIETARY
Optional OPTIONAL
Recommended RECOMMENDED
ISC_Illegal_Exit ISC_ILLEGAL_EXIT
+AIO_Component_Conformance AIO_COMPONENT_CONFORMANCE
+AIO_EXTEST_Pulse_Execution AIO_EXTEST_PULSE_EXECUTION
+Wait_Duration WAIT_DURATION
+AIO_EXTEST_Train_Execution AIO_EXTEST_TRAIN_EXECUTION
+Train TRAIN
+Maximum_Time MAXIMUM_TIME
+AIO_Pin_Behavior AIO_PIN_BEHAVIOR
+AC_Select AC_SELECT
+LP_Time LP_TIME
+HP_Time HP_TIME
+On_Chip ON_CHIP
%%
{Constant} {yyextra->Base = DECIMAL; return( CONSTANT ); }
{Pin_Map} {return( PIN_MAP ); }
@@ -306,6 +320,7 @@ ISC_Illegal_Exit ISC_ILLEGAL_EXIT
{Std_1149_1_1990} {return( STD_1149_1_1990 ); }
{Std_1149_1_1993} {return( STD_1149_1_1993 ); }
{Std_1149_1_2001} {return( STD_1149_1_2001 ); }
+{Std_1149_6_2003} {return( STD_1149_6_2003 ); }
{ISC_Conformance} {yyextra->Base = DECIMAL; return( ISC_CONFORMANCE ); }
{Std_1532_2001} {return( STD_1532_2001 ); }
{Std_1532_2002} {return( STD_1532_2002 ); }
@@ -335,7 +350,7 @@ ISC_Illegal_Exit ISC_ILLEGAL_EXIT
<ISC>{Crc} {return( CRC ); }
<ISC>{Ost} {return( OST ); }
<ISC>{Dollar} {return( DOLLAR ); }
-<ISC>{Equal} {return( EQUAL ); }
+<ISC><AIO>{Equal} {return( EQUAL ); }
<ISC>{Plus} {return( PLUS ); }
<ISC>{Minus} {return( MINUS ); }
<ISC>{Sh_Right} {return( SH_RIGHT ); }
@@ -350,6 +365,17 @@ ISC_Illegal_Exit ISC_ILLEGAL_EXIT
<ISC>{Optional} {return( OPTIONAL ); }
<ISC>{Recommended} {return( RECOMMENDED ); }
{ISC_Illegal_Exit} {return( ISC_ILLEGAL_EXIT ); }
+{AIO_Component_Conformance} {return( AIO_COMPONENT_CONFORMANCE ); }
+{AIO_EXTEST_Pulse_Execution} {BEGIN(AIO); return( AIO_EXTEST_PULSE_EXECUTION ); }
+<AIO>{Wait_Duration} {return( WAIT_DURATION ); }
+{AIO_EXTEST_Train_Execution} {BEGIN(AIO); return( AIO_EXTEST_TRAIN_EXECUTION ); }
+<AIO>{Train} {return( TRAIN ); }
+<AIO>{Maximum_Time} {return( MAXIMUM_TIME ); }
+{AIO_Pin_Behavior} {BEGIN(AIO); return( AIO_PIN_BEHAVIOR ); }
+<AIO>{AC_Select} {return( AC_SELECT ); }
+<AIO>{LP_Time} {return( LP_TIME ); }
+<AIO>{HP_Time} {return( HP_TIME ); }
+<AIO>{On_Chip} {return( ON_CHIP ); }
<REG,ISC>{Bypass} {return( BYPASS ); }
<REG,ISC>{Boundary} {return( BOUNDARY ); }
<REG,ISC>{Clamp} {return( CLAMP ); }
@@ -386,6 +412,7 @@ ISC_Illegal_Exit ISC_ILLEGAL_EXIT
{Lbracket} {return( LBRACKET ); }
{Rbracket} {return( RBRACKET ); }
{Colon} {return( COLON ); }
+{Semicolon} {return( SEMICOLON ); }
{Asterisk} {return( ASTERISK ); }
{White} { /* Do Nothing on White Space */ }
{VHDL_Comment} { /* Do Nothing on Comments */ }
@@ -532,7 +559,7 @@ new_string (urj_bsdl_scan_extra_t *extra, const char *str)
n_str_size = strlen (str) + 1;
if ((n_str = malloc (n_str_size)))
{
- strncpy (n_str, str, n_str_size - 1);
+ strncpy (n_str, str, n_str_size);
n_str[n_str_size - 1] = '\0'; /* set very last element to EOS */
}
else
diff --git a/urjtag/src/bsdl/bsdl_types.h b/urjtag/src/bsdl/bsdl_types.h
index efe09579..226e6ed6 100644
--- a/urjtag/src/bsdl/bsdl_types.h
+++ b/urjtag/src/bsdl/bsdl_types.h
@@ -128,6 +128,7 @@ typedef enum
URJ_BSDL_CONF_1990,
URJ_BSDL_CONF_1993,
URJ_BSDL_CONF_2001,
+ URJ_BSDL_CONF_6_2003,
URJ_BSDL_CONF_UNKNOWN
} urj_bsdl_conformance_t;
diff --git a/urjtag/src/bsdl/vhdl_bison.y b/urjtag/src/bsdl/vhdl_bison.y
index 4d057df5..4d9d33a7 100644
--- a/urjtag/src/bsdl/vhdl_bison.y
+++ b/urjtag/src/bsdl/vhdl_bison.y
@@ -117,12 +117,12 @@ LEGAL NOTICES:
*/
-%pure-parser
+%define api.pure
%parse-param {urj_vhdl_parser_priv_t *priv_data}
/* See https://lists.gnu.org/archive/html/bug-bison/2014-02/msg00002.html */
%lex-param {void *HACK}
%defines
-%name-prefix "urj_vhdl_"
+%define api.prefix {urj_vhdl_}
%{
#include <stdlib.h>
@@ -212,6 +212,7 @@ void yyerror (urj_vhdl_parser_priv_t *, const char *);
%token BSDL_EXTENSION
%token OBSERVE_ONLY
%token STD_1532_2001 STD_1532_2002
+%token STD_1149_6_2003
%type <str> BIN_X_PATTERN
%type <str> IDENTIFIER
@@ -286,8 +287,10 @@ Vector_Range : DECIMAL_NUMBER TO DECIMAL_NUMBER
{ urj_vhdl_port_add_range (priv_data, $3, $1); }
;
VHDL_Use_Part : ISC_Use
+ | AIO_Use
| Standard_Use
| Standard_Use ISC_Use
+ | Standard_Use AIO_Use
| Standard_Use VHDL_Use_List
| error
{
@@ -302,13 +305,13 @@ Standard_Use : USE IDENTIFIER
}
PERIOD ALL SEMICOLON
{
- priv_data->Reading_Package = 1;
+ priv_data->Reading_Package++;
urj_vhdl_flex_switch_file (priv_data->scanner,
priv_data->Package_File_Name);
}
Standard_Package
{
- priv_data->Reading_Package = 0;
+ priv_data->Reading_Package--;
}
;
Standard_Package : PACKAGE IDENTIFIER IS Standard_Decls Defered_Constants
@@ -470,13 +473,13 @@ VHDL_Use : USE IDENTIFIER
}
PERIOD ALL SEMICOLON
{
- priv_data->Reading_Package = 1;
+ priv_data->Reading_Package++;
urj_vhdl_flex_switch_file (priv_data->scanner,
priv_data->Package_File_Name);
}
User_Package
{
- priv_data->Reading_Package = 0;
+ priv_data->Reading_Package--;
}
;
User_Package : PACKAGE IDENTIFIER
@@ -569,13 +572,13 @@ Quoted_String : QUOTED_STRING
;
ISC_Use : USE ISC_Packages PERIOD ALL SEMICOLON
{
- priv_data->Reading_Package = 1;
+ priv_data->Reading_Package++;
urj_vhdl_flex_switch_file (priv_data->scanner,
priv_data->Package_File_Name);
}
ISC_Package
{
- priv_data->Reading_Package = 0;
+ priv_data->Reading_Package--;
}
;
ISC_Packages : STD_1532_2001
@@ -591,15 +594,40 @@ ISC_Package : ISC_Package_Header ISC_Package_Body
;
ISC_Package_Header : PACKAGE ISC_Packages IS
Standard_Use
- {
- priv_data->Reading_Package = 1;
- }
Standard_Decls
END ISC_Packages SEMICOLON
;
ISC_Package_Body : PACKAGE BODY ISC_Packages IS
END ISC_Packages SEMICOLON
;
+AIO_Use : USE AIO_Packages PERIOD ALL SEMICOLON
+ {
+ priv_data->Reading_Package++;
+ urj_vhdl_flex_switch_file (priv_data->scanner,
+ priv_data->Package_File_Name);
+ }
+ AIO_Package
+ {
+ priv_data->Reading_Package--;
+ }
+;
+AIO_Packages : STD_1149_6_2003
+ {
+ strcpy (priv_data->Package_File_Name, "STD_1149_6_2003");
+ }
+;
+AIO_Package : AIO_Package_Header AIO_Package_Body
+;
+AIO_Package_Header : PACKAGE AIO_Packages IS
+ Standard_Use
+ Standard_Decls Defered_Constants
+ END AIO_Packages SEMICOLON
+;
+AIO_Package_Body : PACKAGE BODY AIO_Packages IS
+ Standard_Use
+ Constant_List
+ END AIO_Packages SEMICOLON
+;
%% /* End rules, begin programs */
/*****************************************************************************
* void Init_Text( urj_vhdl_parser_priv_t *priv )
@@ -666,7 +694,7 @@ Print_Error (urj_vhdl_parser_priv_t *priv_data, const char *Errmess)
{
urj_bsdl_jtag_ctrl_t *jc = priv_data->jtag_ctrl;
- if (priv_data->Reading_Package)
+ if (priv_data->Reading_Package > 0)
urj_bsdl_err (jc->proc_mode,
_("In Package %s, Line %d, %s.\n"),
priv_data->Package_File_Name,
diff --git a/urjtag/src/bsdl/vhdl_flex.l b/urjtag/src/bsdl/vhdl_flex.l
index 771a84fb..d49b5163 100644
--- a/urjtag/src/bsdl/vhdl_flex.l
+++ b/urjtag/src/bsdl/vhdl_flex.l
@@ -146,6 +146,7 @@ LEGAL NOTICES:
#endif
#define YY_EXTRA_TYPE urj_bsdl_scan_extra_t *
+#define YYSTYPE URJ_VHDL_STYPE
static char *new_string (urj_bsdl_scan_extra_t *, const char *);
@@ -249,6 +250,7 @@ One ONE
Bsdl_Extension BSDL_EXTENSION
Std_1532_2001 STD_1532_2001
Std_1532_2002 STD_1532_2002
+Std_1149_6_2003 STD_1149_6_2003
%%
{Entity} {return (ENTITY); }
{Port} {yyextra->Base = DECIMAL; /* Default number base */
@@ -292,6 +294,7 @@ Std_1532_2002 STD_1532_2002
{Bsdl_Extension} {return (BSDL_EXTENSION); }
{Std_1532_2001} {return (STD_1532_2001); }
{Std_1532_2002} {return (STD_1532_2002); }
+{Std_1149_6_2003} {return (STD_1149_6_2003); }
<BOU,PAC>{Input} {return (INPUT); }
<BOU,PAC>{Output2} {return (OUTPUT2); }
<BOU,PAC>{Output3} {return (OUTPUT3); }
@@ -469,7 +472,7 @@ new_string (urj_bsdl_scan_extra_t *extra, const char *str)
n_str_size = strlen (str) + 1;
if ((n_str = malloc (n_str_size)))
{
- strncpy (n_str, str, n_str_size - 1);
+ strncpy (n_str, str, n_str_size);
n_str[n_str_size - 1] = '\0'; /* set very last element to EOS */
}
else
--
2.49.0
_______________________________________________
UrJTAG-development mailing list
UrJTAG-development@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/urjtag-development