From f9774758a32ac4f7980d33e585c7eb266ba32a2a Mon Sep 17 00:00:00 2001 From: Cary R Date: Mon, 3 Aug 2009 20:21:50 -0700 Subject: [PATCH] UDPs can only take two delay values. Check in the compiler that a UDP is only given two delay values. (cherry picked from commit 7916e148f87166614d8672bf96323997ab159ba6) --- elaborate.cc | 55 +++++++++++++++++++++------------------------------ pform_dump.cc | 2 ++ 2 files changed, 25 insertions(+), 32 deletions(-) diff --git a/elaborate.cc b/elaborate.cc index 935d1b846..3061aa144 100644 --- a/elaborate.cc +++ b/elaborate.cc @@ -1571,43 +1571,34 @@ void PGModule::elaborate_udp_(Design*des, PUdp*udp, NetScope*scope) const module or primitive, it interprets them as parameter overrides. Correct that misconception here. */ if (overrides_) { - PDelays tmp_del; - tmp_del.set_delays(overrides_, false); - tmp_del.eval_delays(des, scope, rise_expr, fall_expr, decay_expr); - - if (dynamic_cast (rise_expr)) { - - } else { - cerr << get_fileline() << ": error: Delay expressions must be " - << "constant for primitives." << endl; - cerr << get_fileline() << ": : Cannot calculate " - << *rise_expr << endl; + if (overrides_->count() > 2) { + cerr << get_fileline() << ": error: UDPs take at most two " + "delay arguments." << endl; des->errors += 1; - } - - if (dynamic_cast (fall_expr)) { - } else { - cerr << get_fileline() << ": error: Delay expressions must be " - << "constant for primitives." << endl; - cerr << get_fileline() << ": : Cannot calculate " - << *rise_expr << endl; - des->errors += 1; + PDelays tmp_del; + tmp_del.set_delays(overrides_, false); + tmp_del.eval_delays(des, scope, rise_expr, fall_expr, + decay_expr); + + if (! dynamic_cast (rise_expr)) { + cerr << get_fileline() << ": error: UDP rising delay " + "expression must be constant." << endl; + cerr << get_fileline() << ": : Cannot calculate " + << *rise_expr << endl; + des->errors += 1; + } + + if (! dynamic_cast (fall_expr)) { + cerr << get_fileline() << ": error: UDP falling delay " + "expression must be constant." << endl; + cerr << get_fileline() << ": : Cannot calculate " + << *fall_expr << endl; + des->errors += 1; + } } - - if (dynamic_cast (decay_expr)) { - - } else { - cerr << get_fileline() << ": error: Delay expressions must be " - << "constant for primitives." << endl; - cerr << get_fileline() << ": : Cannot calculate " - << *rise_expr << endl; - des->errors += 1; - } - } - assert(udp); NetUDP*net = new NetUDP(scope, my_name, udp->ports.count(), udp); net->rise_time(rise_expr); diff --git a/pform_dump.cc b/pform_dump.cc index a522eb8ac..d21fbc121 100644 --- a/pform_dump.cc +++ b/pform_dump.cc @@ -410,6 +410,8 @@ void PDelays::dump_delays(ostream&out) const if (delay_[0] && delay_[1] && delay_[2]) out << "#(" << *delay_[0] << "," << *delay_[1] << "," << *delay_[2] << ")"; + else if (delay_[0] && delay_[1]) + out << "#(" << *delay_[0] << "," << *delay_[1] << ")"; else if (delay_[0]) out << "#" << *delay_[0]; else