From 9adbdcb7c5104809e01b9a352615fc7857304143 Mon Sep 17 00:00:00 2001 From: steve Date: Sun, 2 Feb 2003 19:02:39 +0000 Subject: [PATCH] Add support for signed ports and nets. --- parse.y | 50 ++++++++++++++++++++++---------------------------- pform.cc | 14 ++++++++++---- pform.h | 11 +++++++++-- 3 files changed, 41 insertions(+), 34 deletions(-) diff --git a/parse.y b/parse.y index 9ff679e4d..e8f66af93 100644 --- a/parse.y +++ b/parse.y @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ -#if !defined(WINNT) && !defined(macintosh) -#ident "$Id: parse.y,v 1.170 2003/01/26 21:15:59 steve Exp $" +#if HAVE_CVS_IDENT +#ident "$Id: parse.y,v 1.171 2003/02/02 19:02:39 steve Exp $" #endif # include "config.h" @@ -282,17 +282,11 @@ attribute integers. This rule matches those declarations. The containing rule has presumably set up the scope. */ block_item_decl - : K_reg range register_variable_list ';' - { pform_set_net_range($3, $2, false); + : K_reg signed_opt range register_variable_list ';' + { pform_set_net_range($4, $3, $2); } - | K_reg register_variable_list ';' - { pform_set_net_range($2, 0, false); - } - | K_reg K_signed range register_variable_list ';' - { pform_set_net_range($4, $3, true); - } - | K_reg K_signed register_variable_list ';' - { pform_set_net_range($3, 0, true); + | K_reg signed_opt register_variable_list ';' + { pform_set_net_range($3, 0, $2); } | K_integer register_variable_list ';' { pform_set_reg_integer($2); @@ -1366,27 +1360,27 @@ range_delay : range_opt delay3_opt module_item - : attribute_list_opt net_type range_delay list_of_identifiers ';' - { pform_makewire(@2, $3.range, $4, $2, $1); - if ($3.delay != 0) { - yyerror(@3, "sorry: net delays not supported."); - delete $3.delay; + : attribute_list_opt net_type signed_opt range_delay list_of_identifiers ';' + { pform_makewire(@2, $4.range, $3, $5, $2, $1); + if ($4.delay != 0) { + yyerror(@4, "sorry: net delays not supported."); + delete $4.delay; } if ($1) delete $1; } - | attribute_list_opt net_type range_delay net_decl_assigns ';' - { pform_makewire(@2, $3.range, $3.delay, str_strength, - $4, $2); + | attribute_list_opt net_type signed_opt range_delay net_decl_assigns ';' + { pform_makewire(@2, $4.range, $3, $4.delay, + str_strength, $5, $2); if ($1) { yyerror(@3, "sorry: Attributes not supported " "on net declaration assignments."); delete $1; } } - | attribute_list_opt net_type drive_strength net_decl_assigns ';' - { pform_makewire(@2, 0, 0, $3, $4, $2); + | attribute_list_opt net_type signed_opt drive_strength net_decl_assigns ';' + { pform_makewire(@2, 0, $3, 0, $4, $5, $2); if ($1) { - yyerror(@3, "sorry: Attributes not supported " + yyerror(@4, "sorry: Attributes not supported " "on net declaration assignments."); delete $1; } @@ -1397,14 +1391,14 @@ module_item delete $3.delay; } - | port_type range_delay list_of_identifiers ';' - { pform_set_port_type(@1, $3, $2.range, $1); + | port_type signed_opt range_delay list_of_identifiers ';' + { pform_set_port_type(@1, $4, $3.range, $2, $1); } - | port_type range_delay error ';' + | port_type signed_opt range_delay error ';' { yyerror(@3, "error: Invalid variable list" " in port declaration."); - if ($2.range) delete $2.range; - if ($2.delay) delete $2.delay; + if ($3.range) delete $3.range; + if ($3.delay) delete $3.delay; yyerrok; } | block_item_decl diff --git a/pform.cc b/pform.cc index 856c813b9..ed8be73c5 100644 --- a/pform.cc +++ b/pform.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: pform.cc,v 1.107 2003/01/26 21:15:59 steve Exp $" +#ident "$Id: pform.cc,v 1.108 2003/02/02 19:02:39 steve Exp $" #endif # include "config.h" @@ -941,6 +941,7 @@ void pform_makewire(const vlltype&li, const char*nm, void pform_makewire(const vlltype&li, svector*range, + bool signed_flag, list*names, NetNet::Type type, svector*attr) @@ -950,7 +951,7 @@ void pform_makewire(const vlltype&li, ; cur ++ ) { char*txt = *cur; pform_makewire(li, txt, type, attr); - pform_set_net_range(txt, range, false); + pform_set_net_range(txt, range, signed_flag); free(txt); } @@ -961,6 +962,7 @@ void pform_makewire(const vlltype&li, void pform_makewire(const vlltype&li, svector*range, + bool signed_flag, svector*delay, str_pair_t str, net_decl_assign_t*decls, @@ -973,7 +975,7 @@ void pform_makewire(const vlltype&li, net_decl_assign_t*next = first->next; pform_makewire(li, first->name, type, 0); - pform_set_net_range(first->name, range, false); + pform_set_net_range(first->name, range, signed_flag); hname_t name = hier_name(first->name); PWire*cur = pform_cur_module->get_wire(name); @@ -1238,6 +1240,7 @@ void pform_set_defparam(const hname_t&name, PExpr*expr) void pform_set_port_type(const struct vlltype&li, list*names, svector*range, + bool signed_flag, NetNet::PortType pt) { for (list::iterator cur = names->begin() @@ -1246,7 +1249,7 @@ void pform_set_port_type(const struct vlltype&li, char*txt = *cur; pform_set_port_type(txt, pt, li.text, li.first_line); if (range) - pform_set_net_range(txt, range, false); + pform_set_net_range(txt, range, signed_flag); free(txt); } @@ -1393,6 +1396,9 @@ int pform_parse(const char*path, FILE*file) /* * $Log: pform.cc,v $ + * Revision 1.108 2003/02/02 19:02:39 steve + * Add support for signed ports and nets. + * * Revision 1.107 2003/01/26 21:15:59 steve * Rework expression parsing and elaboration to * accommodate real/realtime values and expressions. diff --git a/pform.h b/pform.h index 93c879a01..5ddcea069 100644 --- a/pform.h +++ b/pform.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: pform.h,v 1.66 2003/01/30 16:23:08 steve Exp $" +#ident "$Id: pform.h,v 1.67 2003/02/02 19:02:40 steve Exp $" #endif # include "netlist.h" @@ -158,11 +158,13 @@ extern void pform_makewire(const struct vlltype&li, const char*name, extern void pform_makewire(const struct vlltype&li, svector*range, + bool signed_flag, list*names, NetNet::Type type, svector*attr); extern void pform_makewire(const struct vlltype&li, svector*range, + bool signed_flag, svector*delay, str_pair_t str, net_decl_assign_t*assign_list, @@ -174,7 +176,9 @@ extern void pform_make_reginit(const struct vlltype&li, i.e. input, output or inout. If the wire does not exist, create it. The second form takes a single name. */ extern void pform_set_port_type(const struct vlltype&li, - list*names, svector*, + list*names, + svector*range, + bool signed_flag, NetNet::PortType); extern void pform_set_port_type(const char*nm, NetNet::PortType pt, const char*file, unsigned lineno); @@ -264,6 +268,9 @@ extern void pform_dump(ostream&out, Module*mod); /* * $Log: pform.h,v $ + * Revision 1.67 2003/02/02 19:02:40 steve + * Add support for signed ports and nets. + * * Revision 1.66 2003/01/30 16:23:08 steve * Spelling fixes. *