diff --git a/PDelays.cc b/PDelays.cc index 76a34e8b9..85c6e42ac 100644 --- a/PDelays.cc +++ b/PDelays.cc @@ -119,6 +119,20 @@ static NetExpr* make_delay_nets(Design*des, NetScope*scope, NetExpr*expr) return expr; } +static NetExpr* calc_decay_time(NetExpr *rise, NetExpr *fall) +{ + NetEConst *c_rise = dynamic_cast(rise); + NetEConst *c_fall = dynamic_cast(fall); + if (c_rise && c_fall) { + if (c_rise->value() < c_fall->value()) return rise; + else return fall; + } + + cerr << fall->get_fileline() << ": sorry: can not calculate the " + << "decay time from " << *rise << " and " << *fall << endl; + return 0; +} + void PDelays::eval_delays(Design*des, NetScope*scope, NetExpr*&rise_time, NetExpr*&fall_time, @@ -140,14 +154,14 @@ void PDelays::eval_delays(Design*des, NetScope*scope, if (delay_[2]) { decay_time = calculate_val(des, scope, delay_[2]); - if (as_nets_flag) - decay_time = make_delay_nets(des, scope, decay_time); + if (as_nets_flag) + decay_time = make_delay_nets(des, scope, + decay_time); } else { - if (rise_time < fall_time) - decay_time = rise_time; - else - decay_time = fall_time; + // If this is zero then we need to do the min() + // at run time. + decay_time = calc_decay_time(rise_time, fall_time); } } else { assert(delay_[2] == 0); diff --git a/tgt-vvp/draw_mux.c b/tgt-vvp/draw_mux.c index a3a32e11b..0ccd46cf7 100644 --- a/tgt-vvp/draw_mux.c +++ b/tgt-vvp/draw_mux.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002-2008 Stephen Williams (steve@icarus.com) + * Copyright (c) 2002-2009 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 @@ -53,10 +53,13 @@ static void draw_lpm_mux_ab(ivl_lpm_t net, const char*muxz) number_is_immediate(d_decay, 64, 0)) { fprintf(vvp_out, "L_%p .delay (%lu,%lu,%lu) L_%p/d;\n", net, get_number_immediate(d_rise), - get_number_immediate(d_rise), - get_number_immediate(d_rise), net); + get_number_immediate(d_fall), + get_number_immediate(d_decay), net); } else { ivl_signal_t sig; + // We do not currently support calculating the decay from + // the rise and fall variable delays. + assert(d_decay != 0); assert(ivl_expr_type(d_rise) == IVL_EX_SIGNAL); assert(ivl_expr_type(d_fall) == IVL_EX_SIGNAL); assert(ivl_expr_type(d_decay) == IVL_EX_SIGNAL); diff --git a/tgt-vvp/draw_net_input.c b/tgt-vvp/draw_net_input.c index 6d527077d..5f1394a8e 100644 --- a/tgt-vvp/draw_net_input.c +++ b/tgt-vvp/draw_net_input.c @@ -391,11 +391,14 @@ static char* draw_net_input_drive(ivl_nexus_t nex, ivl_nexus_ptr_t nptr) fprintf(vvp_out, "L_%p .delay " "(%" PRIu64 ",%" PRIu64 ",%" PRIu64 ") L_%p/d;\n", cptr, get_number_immediate64(d_rise), - get_number_immediate64(d_rise), - get_number_immediate64(d_rise), cptr); + get_number_immediate64(d_fall), + get_number_immediate64(d_decay), cptr); } else { ivl_signal_t sig; + // We do not currently support calculating the decay + // from the rise and fall variable delays. + assert(d_decay != 0); assert(ivl_expr_type(d_rise) == IVL_EX_SIGNAL); assert(ivl_expr_type(d_fall) == IVL_EX_SIGNAL); assert(ivl_expr_type(d_decay) == IVL_EX_SIGNAL); diff --git a/tgt-vvp/vvp_scope.c b/tgt-vvp/vvp_scope.c index 441a3479f..eea3ab47b 100644 --- a/tgt-vvp/vvp_scope.c +++ b/tgt-vvp/vvp_scope.c @@ -877,10 +877,13 @@ static void draw_logic_in_scope(ivl_net_logic_t lptr) fprintf(vvp_out, "L_%p .delay (%lu,%lu,%lu) L_%p/d;\n", lptr, get_number_immediate(rise_exp), - get_number_immediate(rise_exp), - get_number_immediate(rise_exp), lptr); + get_number_immediate(fall_exp), + get_number_immediate(decay_exp), lptr); } else { ivl_signal_t sig; + // We do not currently support calculating the decay from + // the rise and fall variable delays. + assert(decay_exp != 0); assert(ivl_expr_type(rise_exp) == IVL_EX_SIGNAL); assert(ivl_expr_type(fall_exp) == IVL_EX_SIGNAL); assert(ivl_expr_type(decay_exp) == IVL_EX_SIGNAL); @@ -1080,8 +1083,8 @@ static const char* draw_lpm_output_delay(ivl_lpm_t net) dly = "/d"; fprintf(vvp_out, "L_%p .delay (%lu,%lu,%lu) L_%p/d;\n", net, get_number_immediate(d_rise), - get_number_immediate(d_rise), - get_number_immediate(d_rise), net); + get_number_immediate(d_fall), + get_number_immediate(d_decay), net); } return dly;