From 368c27c9e4e531df4750f8a6cf9d8d85ef28c2d0 Mon Sep 17 00:00:00 2001 From: steve Date: Tue, 3 Jan 2006 05:22:14 +0000 Subject: [PATCH] Handle complex net node delays. --- PDelays.cc | 27 +++++++++++++++++++++++++-- PDelays.h | 8 ++++++-- PGate.cc | 12 +++++++++--- PGate.h | 8 ++++++-- elaborate.cc | 7 +++++-- 5 files changed, 51 insertions(+), 11 deletions(-) diff --git a/PDelays.cc b/PDelays.cc index 5e5862567..65669d172 100644 --- a/PDelays.cc +++ b/PDelays.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: PDelays.cc,v 1.12 2006/01/02 05:33:19 steve Exp $" +#ident "$Id: PDelays.cc,v 1.13 2006/01/03 05:22:14 steve Exp $" #endif # include "config.h" @@ -106,22 +106,42 @@ static NetExpr*calculate_val(Design*des, NetScope*scope, const PExpr*expr) return dex; } +static NetExpr* make_delay_nets(Design*des, NetExpr*expr) +{ + if (dynamic_cast (expr)) + return expr; + + if (dynamic_cast (expr)) + return expr; + + NetNet*sig = expr->synthesize(des); + expr = new NetESignal(sig); + return expr; +} + void PDelays::eval_delays(Design*des, NetScope*scope, NetExpr*&rise_time, NetExpr*&fall_time, - NetExpr*&decay_time) const + NetExpr*&decay_time, + bool as_nets_flag) const { assert(scope); if (delay_[0]) { rise_time = calculate_val(des, scope, delay_[0]); + if (as_nets_flag) + rise_time = make_delay_nets(des, rise_time); if (delay_[1]) { fall_time = calculate_val(des, scope, delay_[1]); + if (as_nets_flag) + fall_time = make_delay_nets(des, fall_time); if (delay_[2]) { decay_time = calculate_val(des, scope, delay_[2]); + if (as_nets_flag) + decay_time = make_delay_nets(des, decay_time); } else { if (rise_time < fall_time) @@ -143,6 +163,9 @@ void PDelays::eval_delays(Design*des, NetScope*scope, /* * $Log: PDelays.cc,v $ + * Revision 1.13 2006/01/03 05:22:14 steve + * Handle complex net node delays. + * * Revision 1.12 2006/01/02 05:33:19 steve * Node delays can be more general expressions in structural contexts. * diff --git a/PDelays.h b/PDelays.h index 3c9349869..644c4bd02 100644 --- a/PDelays.h +++ b/PDelays.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: PDelays.h,v 1.8 2006/01/02 05:33:19 steve Exp $" +#ident "$Id: PDelays.h,v 1.9 2006/01/03 05:22:14 steve Exp $" #endif # include "svector.h" @@ -56,7 +56,8 @@ class PDelays { void eval_delays(Design*des, NetScope*scope, NetExpr*&rise_time, NetExpr*&fall_time, - NetExpr*&decay_time) const; + NetExpr*&decay_time, + bool as_nets_flag =false) const; void dump_delays(ostream&out) const; @@ -73,6 +74,9 @@ ostream& operator << (ostream&o, const PDelays&); /* * $Log: PDelays.h,v $ + * Revision 1.9 2006/01/03 05:22:14 steve + * Handle complex net node delays. + * * Revision 1.8 2006/01/02 05:33:19 steve * Node delays can be more general expressions in structural contexts. * diff --git a/PGate.cc b/PGate.cc index f96242d30..058cf2998 100644 --- a/PGate.cc +++ b/PGate.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: PGate.cc,v 1.17 2006/01/02 05:33:19 steve Exp $" +#ident "$Id: PGate.cc,v 1.18 2006/01/03 05:22:14 steve Exp $" #endif # include "config.h" @@ -94,9 +94,12 @@ void PGate::elaborate_scope(Design*, NetScope*) const void PGate::eval_delays(Design*des, NetScope*scope, NetExpr*&rise_expr, NetExpr*&fall_expr, - NetExpr*&decay_expr) const + NetExpr*&decay_expr, + bool as_net_flag) const { - delay_.eval_delays(des, scope, rise_expr, fall_expr, decay_expr); + delay_.eval_delays(des, scope, + rise_expr, fall_expr, decay_expr, + as_net_flag); } void PGate::eval_delays(Design*des, NetScope*scope, @@ -245,6 +248,9 @@ perm_string PGModule::get_type() /* * $Log: PGate.cc,v $ + * Revision 1.18 2006/01/03 05:22:14 steve + * Handle complex net node delays. + * * Revision 1.17 2006/01/02 05:33:19 steve * Node delays can be more general expressions in structural contexts. * diff --git a/PGate.h b/PGate.h index 2e84604dc..29f14aa8c 100644 --- a/PGate.h +++ b/PGate.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: PGate.h,v 1.30 2006/01/02 05:33:19 steve Exp $" +#ident "$Id: PGate.h,v 1.31 2006/01/03 05:22:14 steve Exp $" #endif # include "svector.h" @@ -80,7 +80,8 @@ class PGate : public LineInfo { void eval_delays(Design*des, NetScope*scope, NetExpr*&rise_time, NetExpr*&fall_time, - NetExpr*&decay_time) const; + NetExpr*&decay_time, + bool as_net_flag =false) const; unsigned pin_count() const { return pins_? pins_->count() : 0; } const PExpr*pin(unsigned idx) const { return (*pins_)[idx]; } @@ -238,6 +239,9 @@ class PGModule : public PGate { /* * $Log: PGate.h,v $ + * Revision 1.31 2006/01/03 05:22:14 steve + * Handle complex net node delays. + * * Revision 1.30 2006/01/02 05:33:19 steve * Node delays can be more general expressions in structural contexts. * diff --git a/elaborate.cc b/elaborate.cc index b979a2f46..5b554b9ae 100644 --- a/elaborate.cc +++ b/elaborate.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: elaborate.cc,v 1.333 2006/01/02 05:33:19 steve Exp $" +#ident "$Id: elaborate.cc,v 1.334 2006/01/03 05:22:14 steve Exp $" #endif # include "config.h" @@ -76,7 +76,7 @@ void PGAssign::elaborate(Design*des, NetScope*scope) const assert(scope); NetExpr* rise_time, *fall_time, *decay_time; - eval_delays(des, scope, rise_time, fall_time, decay_time); + eval_delays(des, scope, rise_time, fall_time, decay_time, true); Link::strength_t drive0 = drive_type(strength0()); Link::strength_t drive1 = drive_type(strength1()); @@ -3069,6 +3069,9 @@ Design* elaborate(listroots) /* * $Log: elaborate.cc,v $ + * Revision 1.334 2006/01/03 05:22:14 steve + * Handle complex net node delays. + * * Revision 1.333 2006/01/02 05:33:19 steve * Node delays can be more general expressions in structural contexts. *