From 361d4f21479ec06e3ecd96f1ec6660965666915e Mon Sep 17 00:00:00 2001 From: steve Date: Sat, 12 Jan 2002 04:03:39 +0000 Subject: [PATCH] Drive strengths for continuous assignments. --- parse.y | 28 ++++++++------------- pform.cc | 10 ++++---- pform.h | 6 ++++- tgt-vvp/vvp_scope.c | 61 ++++++++++++++++++++++++++++++++++++++------- 4 files changed, 73 insertions(+), 32 deletions(-) diff --git a/parse.y b/parse.y index 6a4fb78c6..4488516e4 100644 --- a/parse.y +++ b/parse.y @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: parse.y,v 1.143 2001/12/31 05:23:13 steve Exp $" +#ident "$Id: parse.y,v 1.144 2002/01/12 04:03:39 steve Exp $" #endif # include "config.h" @@ -31,12 +31,11 @@ extern void lex_start_table(); extern void lex_end_table(); /* - * These are the strengths to use for net declaration - * assignments. They are stored here so that scope that contains the - * net_decl_assigns can change them during specific statements. + * These are some common strength pairs that are used as defaults when + * the user is not otherwise specific. */ -static struct str_pair_t decl_strength = { PGate::STRONG, PGate::STRONG }; -static struct str_pair_t pull_strength = { PGate::PULL, PGate::PULL }; +const static struct str_pair_t pull_strength = { PGate::PULL, PGate::PULL }; +const static struct str_pair_t str_strength = { PGate::STRONG, PGate::STRONG }; %} %union { @@ -1204,16 +1203,11 @@ module_item } } | net_type range_delay net_decl_assigns ';' - { pform_makewire(@1, $2.range, $2.delay, $3, $1); + { pform_makewire(@1, $2.range, $2.delay, str_strength, + $3, $1); } - | net_type drive_strength { decl_strength = $2;} net_decl_assigns ';' - { pform_makewire(@1, 0, 0, $4, $1); - /* The strengths are handled in the - net_decl_assigns using the decl_strength that I - set in the rule. Right here, just restore the - defaults for other rules. */ - decl_strength.str0 = PGate::STRONG; - decl_strength.str1 = PGate::STRONG; + | net_type drive_strength net_decl_assigns ';' + { pform_makewire(@1, 0, 0, $2, $3, $1); } | K_trireg charge_strength_opt range_delay list_of_variables ';' { yyerror(@1, "sorry: trireg nets not supported."); @@ -1241,11 +1235,11 @@ module_item three-value delay. These rules handle the different cases. */ | gatetype gate_instance_list ';' - { pform_makegates($1, decl_strength, 0, $2); + { pform_makegates($1, str_strength, 0, $2); } | gatetype delay3 gate_instance_list ';' - { pform_makegates($1, decl_strength, $2, $3); + { pform_makegates($1, str_strength, $2, $3); } | gatetype drive_strength gate_instance_list ';' diff --git a/pform.cc b/pform.cc index 2bdc853fe..c55110c9a 100644 --- a/pform.cc +++ b/pform.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: pform.cc,v 1.87 2001/12/07 05:03:13 steve Exp $" +#ident "$Id: pform.cc,v 1.88 2002/01/12 04:03:39 steve Exp $" #endif # include "config.h" @@ -769,16 +769,13 @@ void pform_makewire(const vlltype&li, void pform_makewire(const vlltype&li, svector*range, svector*delay, + str_pair_t str, net_decl_assign_t*decls, NetNet::Type type) { net_decl_assign_t*first = decls->next; decls->next = 0; - struct str_pair_t str; - str.str0 = PGate::STRONG; - str.str1 = PGate::STRONG; - while (first) { net_decl_assign_t*next = first->next; @@ -1158,6 +1155,9 @@ int pform_parse(const char*path, FILE*file) /* * $Log: pform.cc,v $ + * Revision 1.88 2002/01/12 04:03:39 steve + * Drive strengths for continuous assignments. + * * Revision 1.87 2001/12/07 05:03:13 steve * Support integer for function return value. * diff --git a/pform.h b/pform.h index 2d7a50321..4ca317e14 100644 --- a/pform.h +++ b/pform.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: pform.h,v 1.54 2001/12/07 05:03:13 steve Exp $" +#ident "$Id: pform.h,v 1.55 2002/01/12 04:03:39 steve Exp $" #endif # include "netlist.h" @@ -147,6 +147,7 @@ extern void pform_makewire(const struct vlltype&li, extern void pform_makewire(const struct vlltype&li, svector*range, svector*delay, + str_pair_t str, net_decl_assign_t*assign_list, NetNet::Type type); extern void pform_make_reginit(const struct vlltype&li, @@ -218,6 +219,9 @@ extern void pform_dump(ostream&out, Module*mod); /* * $Log: pform.h,v $ + * Revision 1.55 2002/01/12 04:03:39 steve + * Drive strengths for continuous assignments. + * * Revision 1.54 2001/12/07 05:03:13 steve * Support integer for function return value. * diff --git a/tgt-vvp/vvp_scope.c b/tgt-vvp/vvp_scope.c index 13e68d501..d43f83d9a 100644 --- a/tgt-vvp/vvp_scope.c +++ b/tgt-vvp/vvp_scope.c @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: vvp_scope.c,v 1.62 2002/01/06 03:15:43 steve Exp $" +#ident "$Id: vvp_scope.c,v 1.63 2002/01/12 04:03:40 steve Exp $" #endif # include "vvp_priv.h" @@ -151,6 +151,27 @@ ivl_signal_type_t signal_type_of_nexus(ivl_nexus_t nex) return out; } +ivl_nexus_ptr_t ivl_logic_pin_ptr(ivl_net_logic_t net, unsigned pin) +{ + ivl_nexus_t nex = ivl_logic_pin(net, pin); + unsigned idx; + + for (idx = 0 ; idx < ivl_nexus_ptrs(nex) ; idx += 1) { + ivl_nexus_ptr_t ptr = ivl_nexus_ptr(nex, idx); + ivl_net_logic_t tmp = ivl_nexus_ptr_log(ptr); + if (tmp == 0) + continue; + if (tmp != net) + continue; + if (ivl_nexus_ptr_pin(ptr) != pin) + continue; + + return ptr; + } + assert(0); + return 0; +} + const char*drive_string(ivl_drive_t drive) { switch (drive) { @@ -221,10 +242,16 @@ static const char* draw_net_input_drive(ivl_nexus_t nex, ivl_nexus_ptr_t nptr) ivl_lpm_t lpm; lptr = ivl_nexus_ptr_log(nptr); - if (lptr && (ivl_logic_type(lptr) == IVL_LO_BUFZ) && - (nptr_pin == 0)) { - return draw_net_input(ivl_logic_pin(lptr, 1)); - } + if (lptr && (ivl_logic_type(lptr) == IVL_LO_BUFZ) && (nptr_pin == 0)) + do { + if (ivl_nexus_ptr_drive0(nptr) != IVL_DR_STRONG) + break; + + if (ivl_nexus_ptr_drive1(nptr) != IVL_DR_STRONG) + break; + + return draw_net_input(ivl_logic_pin(lptr, 1)); + } while(0); if (lptr && (ivl_logic_type(lptr) == IVL_LO_PULLDOWN)) { return "C"; @@ -645,10 +672,23 @@ static void draw_logic_in_scope(ivl_net_logic_t lptr) draw_udp_in_scope(lptr); return; - case IVL_LO_BUFZ: - /* Skip BUFZ objects. Things that have a bufz as input - will use the input to bufz instead. */ - return; + case IVL_LO_BUFZ: { + /* Draw bufz objects, but only if the output drive + is different from the input. */ + ivl_nexus_ptr_t nptr = ivl_logic_pin_ptr(lptr,0); + ivl_drive_t dr0 = ivl_nexus_ptr_drive0(nptr); + ivl_drive_t dr1 = ivl_nexus_ptr_drive1(nptr); + + ltype = "BUFZ"; + + if (dr0 != IVL_DR_STRONG) + break; + + if (dr1 != IVL_DR_STRONG) + break; + + return; + } case IVL_LO_PULLDOWN: case IVL_LO_PULLUP: @@ -1364,6 +1404,9 @@ int draw_scope(ivl_scope_t net, ivl_scope_t parent) /* * $Log: vvp_scope.c,v $ + * Revision 1.63 2002/01/12 04:03:40 steve + * Drive strengths for continuous assignments. + * * Revision 1.62 2002/01/06 03:15:43 steve * Constant values have drive strengths. *