diff --git a/vpi/Makefile.in b/vpi/Makefile.in index a6b1c1416..ea04009b5 100644 --- a/vpi/Makefile.in +++ b/vpi/Makefile.in @@ -55,7 +55,7 @@ O = sys_table.o sys_convert.o sys_countdrivers.o sys_darray.o sys_deposit.o sys_ sys_fileio.o sys_finish.o sys_icarus.o sys_plusargs.o sys_queue.o \ sys_random.o sys_random_mti.o sys_readmem.o sys_readmem_lex.o sys_scanf.o \ sys_sdf.o sys_time.o sys_vcd.o sys_vcdoff.o vcd_priv.o mt19937int.o \ - sys_priv.o sdf_lexor.o sdf_parse.o stringheap.o vams_simparam.o \ + sys_priv.o sdf_parse.o sdf_lexor.o stringheap.o vams_simparam.o \ table_mod.o table_mod_lexor.o table_mod_parse.o OPP = vcd_priv2.o diff --git a/vpi/sdf_lexor.lex b/vpi/sdf_lexor.lex index 523550db9..17d4eeaa1 100644 --- a/vpi/sdf_lexor.lex +++ b/vpi/sdf_lexor.lex @@ -5,7 +5,7 @@ %{ /* - * Copyright (c) 2007-2010 Stephen Williams (steve@icarus.com) + * Copyright (c) 2007-2014 Stephen Williams (steve@icarus.com) * * This source code is free software; you can redistribute it * and/or modify it in source code form under the terms of the GNU @@ -107,6 +107,11 @@ static int yywrap(void) "===" { return K_CEQ; } "!==" { return K_CNE; } + /* Other operators. */ + +"&&" { return K_LAND; } +"||" { return K_LOR; } + /* The HCHAR (hierarchy separator) is set by the SDF file itself. We recognize here the HCHAR. */ [./] { @@ -124,34 +129,36 @@ static struct { const char*name; int code; } keywords[] = { - { "ABSOLUTE", K_ABSOLUTE }, - { "CELL", K_CELL }, - { "CELLTYPE", K_CELLTYPE }, - { "DATE", K_DATE }, - { "DELAY", K_DELAY }, - { "DELAYFILE", K_DELAYFILE }, - { "DESIGN", K_DESIGN }, - { "DIVIDER", K_DIVIDER }, - { "HOLD", K_HOLD }, - { "INCREMENT", K_INCREMENT }, - { "INTERCONNECT",K_INTERCONNECT }, - { "INSTANCE", K_INSTANCE }, - { "IOPATH", K_IOPATH }, - { "PROCESS", K_PROCESS }, - { "PROGRAM", K_PROGRAM }, - { "RECREM", K_RECREM }, - { "RECOVERY", K_RECOVERY }, - { "REMOVAL", K_REMOVAL }, - { "SDFVERSION", K_SDFVERSION }, - { "SETUP", K_SETUP }, - { "SETUPHOLD", K_SETUPHOLD }, - { "TEMPERATURE",K_TEMPERATURE }, - { "TIMESCALE", K_TIMESCALE }, - { "TIMINGCHECK",K_TIMINGCHECK }, - { "VENDOR", K_VENDOR }, - { "VERSION", K_VERSION }, - { "VOLTAGE", K_VOLTAGE }, - { "WIDTH", K_WIDTH }, + { "ABSOLUTE", K_ABSOLUTE }, + { "CELL", K_CELL }, + { "CELLTYPE", K_CELLTYPE }, + { "DATE", K_DATE }, + { "COND", K_COND }, + { "CONDELSE", K_CONDELSE }, + { "DELAY", K_DELAY }, + { "DELAYFILE", K_DELAYFILE }, + { "DESIGN", K_DESIGN }, + { "DIVIDER", K_DIVIDER }, + { "HOLD", K_HOLD }, + { "INCREMENT", K_INCREMENT }, + { "INTERCONNECT", K_INTERCONNECT }, + { "INSTANCE", K_INSTANCE }, + { "IOPATH", K_IOPATH }, + { "PROCESS", K_PROCESS }, + { "PROGRAM", K_PROGRAM }, + { "RECREM", K_RECREM }, + { "RECOVERY", K_RECOVERY }, + { "REMOVAL", K_REMOVAL }, + { "SDFVERSION", K_SDFVERSION }, + { "SETUP", K_SETUP }, + { "SETUPHOLD", K_SETUPHOLD }, + { "TEMPERATURE", K_TEMPERATURE }, + { "TIMESCALE", K_TIMESCALE }, + { "TIMINGCHECK", K_TIMINGCHECK }, + { "VENDOR", K_VENDOR }, + { "VERSION", K_VERSION }, + { "VOLTAGE", K_VOLTAGE }, + { "WIDTH", K_WIDTH }, { 0, IDENTIFIER } }; diff --git a/vpi/sdf_parse.y b/vpi/sdf_parse.y index 793ad120c..e145abef6 100644 --- a/vpi/sdf_parse.y +++ b/vpi/sdf_parse.y @@ -1,7 +1,7 @@ %{ /* - * Copyright (c) 1998-2010 Stephen Williams (steve@icarus.com) + * Copyright (c) 1998-2014 Stephen Williams (steve@icarus.com) * * This source code is free software; you can redistribute it * and/or modify it in source code form under the terms of the GNU @@ -44,13 +44,15 @@ char sdf_use_hchar = '.'; struct sdf_delval_list_s delval_list; }; -%token K_ABSOLUTE K_CELL K_CELLTYPE K_COND K_DATE K_DELAYFILE K_DELAY K_DESIGN -%token K_DIVIDER K_HOLD K_INCREMENT K_INSTANCE K_INTERCONNECT K_IOPATH -%token K_NEGEDGE K_POSEDGE K_PROCESS K_PROGRAM K_RECREM K_RECOVERY -%token K_REMOVAL K_SDFVERSION K_SETUP K_SETUPHOLD K_TEMPERATURE -%token K_TIMESCALE K_TIMINGCHECK K_VENDOR K_VERSION K_VOLTAGE K_WIDTH +%token K_ABSOLUTE K_CELL K_CELLTYPE K_COND K_CONDELSE K_DATE K_DELAYFILE +%token K_DELAY K_DESIGN K_DIVIDER K_HOLD K_INCREMENT K_INSTANCE +%token K_INTERCONNECT K_IOPATH K_NEGEDGE K_POSEDGE K_PROCESS K_PROGRAM +%token K_RECREM K_RECOVERY K_REMOVAL K_SDFVERSION K_SETUP K_SETUPHOLD +%token K_TEMPERATURE K_TIMESCALE K_TIMINGCHECK K_VENDOR K_VERSION +%token K_VOLTAGE K_WIDTH %token K_01 K_10 K_0Z K_Z1 K_1Z K_Z0 %token K_EQ K_NE K_CEQ K_CNE K_LOGICAL_ONE K_LOGICAL_ZERO +%token K_LAND K_LOR %token HCHAR %token QSTRING IDENTIFIER @@ -70,6 +72,10 @@ char sdf_use_hchar = '.'; %type delval_list +%left K_LOR +%left K_LAND +%left K_EQ K_NE K_CEQ K_CNE + %% source_file @@ -261,6 +267,26 @@ del_def | '(' K_IOPATH error ')' { vpi_printf("%s:%d: SDF ERROR: Invalid/malformed IOPATH\n", sdf_parse_path, @2.first_line); } + | '(' K_COND conditional_port_expr + '(' K_IOPATH port_spec port_instance delval_list ')' ')' + { + /* Skip conditional path back annotation for now. */ + } + | '(' K_COND QSTRING conditional_port_expr + '(' K_IOPATH port_spec port_instance delval_list ')' ')' + { + /* Skip conditional path back annotation for now. */ + } + | '(' K_COND error ')' + { vpi_printf("%s:%d: SDF ERROR: Invalid/malformed COND\n", + sdf_parse_path, @2.first_line); } + | '(' K_CONDELSE '(' K_IOPATH port_spec port_instance delval_list ')' ')' + { + /* Skip ifnone back annotation for now. */ + } + | '(' K_CONDELSE error ')' + { vpi_printf("%s:%d: SDF ERROR: Invalid/malformed CONDELSE\n", + sdf_parse_path, @2.first_line); } /* | '(' K_INTERCONNECT port_instance port_instance delval_list ')' */ | '(' K_INTERCONNECT port_interconnect port_interconnect delval_list ')' { if (sdf_flag_warning) vpi_printf("%s:%d: SDF WARNING: " @@ -322,6 +348,19 @@ timing_check_condition | port_interconnect equality_operator scalar_constant ; + /* This is not complete! */ +conditional_port_expr + : port + | scalar_constant + | '(' conditional_port_expr ')' + | conditional_port_expr K_LAND conditional_port_expr + | conditional_port_expr K_LOR conditional_port_expr + | conditional_port_expr K_EQ conditional_port_expr + | conditional_port_expr K_NE conditional_port_expr + | conditional_port_expr K_CEQ conditional_port_expr + | conditional_port_expr K_CNE conditional_port_expr + ; + equality_operator : K_EQ | K_NE