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

Reply via email to