From 427aef8cc48d6a9c555e5cc6022553b618c1f52d Mon Sep 17 00:00:00 2001 From: Cary R Date: Sun, 6 Feb 2011 19:47:11 -0800 Subject: [PATCH] Add more file/line and scope information to the ivl interface, etc. This patch adds/fixes the following: Adds file/line information to a UDP definition. Prints an error message if a UDP is passed signals wider than 1 bit. A UDP should supports a range, but the compiler currently does not. Add scope information for constants. Fix the Icarus extension UDP table entry element 'h' to use h. The ivl_udp_init() value is a char not unsigned. Add FILE_NAME() for a bunch more of the ivl interface objects. --- PUdp.h | 5 +++-- elaborate.cc | 18 +++++++++++++++-- ivl.def | 3 +++ ivl_target.h | 10 +++++++-- netlist.h | 2 ++ parse.y | 2 +- pform.cc | 2 ++ t-dll-api.cc | 21 ++++++++++++++++--- t-dll-expr.cc | 20 ++++++++++-------- t-dll-proc.cc | 1 + t-dll.cc | 54 +++++++++++++++++++++++++++++++++---------------- t-dll.h | 41 ++++++++++++++++++++++++++++--------- tgt-stub/stub.c | 6 +++--- 13 files changed, 137 insertions(+), 48 deletions(-) diff --git a/PUdp.h b/PUdp.h index a0fbfdfe2..77226286d 100644 --- a/PUdp.h +++ b/PUdp.h @@ -1,7 +1,7 @@ #ifndef __PUdp_H #define __PUdp_H /* - * Copyright (c) 1998-2004 Stephen Williams (steve@picturel.com) + * Copyright (c) 1998-2011 Stephen Williams (steve@picturel.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 @@ -20,6 +20,7 @@ */ # include +# include "LineInfo.h" # include "StringHeap.h" # include "svector.h" # include "verinum.h" @@ -47,7 +48,7 @@ class PExpr; * If the UDP is sequential, the "initial" member is taken to be the * initial value assigned in the source, or 'x' if none is given. */ -class PUdp { +class PUdp : public LineInfo { public: explicit PUdp(perm_string n, unsigned nports); diff --git a/elaborate.cc b/elaborate.cc index a1fcd6e80..311a1d2a1 100644 --- a/elaborate.cc +++ b/elaborate.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2010 Stephen Williams (steve@icarus.com) + * Copyright (c) 1998-2011 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 @@ -1867,6 +1867,13 @@ void PGModule::elaborate_udp_(Design*des, PUdp*udp, NetScope*scope) const } else { connect(sig->pin(0), net->pin(0)); } + if (sig->vector_width() != 1) { + cerr << get_fileline() << ": error: " + << "Output port expression " << *pins[0] + << " is too wide (" << sig->vector_width() + << ") expected 1." << endl; + des->errors += 1; + } } /* Run through the pins, making netlists for the pin @@ -1879,7 +1886,7 @@ void PGModule::elaborate_udp_(Design*des, PUdp*udp, NetScope*scope) const NetExpr*expr_tmp = elab_and_eval(des, scope, pins[idx], 1, 1); if (expr_tmp == 0) { cerr << "internal error: Expression too complicated " - "for elaboration:" << pins[idx] << endl; + "for elaboration:" << *pins[idx] << endl; continue; } NetNet*sig = expr_tmp->synthesize(des, scope, expr_tmp); @@ -1889,6 +1896,13 @@ void PGModule::elaborate_udp_(Design*des, PUdp*udp, NetScope*scope) const delete expr_tmp; connect(sig->pin(0), net->pin(idx)); + if (sig->vector_width() != 1) { + cerr << get_fileline() << ": error: " + << "Input port expression " << *pins[idx] + << " is too wide (" << sig->vector_width() + << ") expected 1." << endl; + des->errors += 1; + } } // All done. Add the object to the design. diff --git a/ivl.def b/ivl.def index eae17a736..5535f2240 100644 --- a/ivl.def +++ b/ivl.def @@ -19,6 +19,7 @@ ivl_const_delay ivl_const_file ivl_const_lineno ivl_const_real +ivl_const_scope ivl_const_signed ivl_const_type ivl_const_width @@ -281,6 +282,8 @@ ivl_switch_type ivl_switch_width ivl_udp_init +ivl_udp_file +ivl_udp_lineno ivl_udp_name ivl_udp_nin ivl_udp_row diff --git a/ivl_target.h b/ivl_target.h index 9986a6693..5e1fc3c41 100644 --- a/ivl_target.h +++ b/ivl_target.h @@ -561,6 +561,9 @@ extern ivl_discipline_t ivl_design_discipline(ivl_design_t des, unsigned idx); * ivl_const_nex * Return the ivl_nexus_t of the output for the constant. * + * ivl_const_scope + * Return the scope this constant was defined in. + * ivl_const_signed * Return true (!0) if the constant is a signed value, 0 otherwise. * @@ -587,6 +590,7 @@ extern ivl_variable_type_t ivl_const_type(ivl_net_const_t net); extern const char* ivl_const_bits(ivl_net_const_t net); extern ivl_expr_t ivl_const_delay(ivl_net_const_t net, unsigned transition); extern ivl_nexus_t ivl_const_nex(ivl_net_const_t net); +extern ivl_scope_t ivl_const_scope(ivl_net_const_t net); extern int ivl_const_signed(ivl_net_const_t net); extern unsigned ivl_const_width(ivl_net_const_t net); extern double ivl_const_real(ivl_net_const_t net); @@ -1025,13 +1029,15 @@ extern ivl_attribute_t ivl_logic_attr_val(ivl_net_logic_t net, unsigned idx); extern int ivl_udp_sequ(ivl_udp_t net); extern unsigned ivl_udp_nin(ivl_udp_t net); -extern unsigned ivl_udp_init(ivl_udp_t net); +extern char ivl_udp_init(ivl_udp_t net); extern const char* ivl_udp_row(ivl_udp_t net, unsigned idx); extern unsigned ivl_udp_rows(ivl_udp_t net); extern const char* ivl_udp_name(ivl_udp_t net); +extern const char* ivl_udp_file(ivl_udp_t net); +extern unsigned ivl_udp_lineno(ivl_udp_t net); extern const char* ivl_lpm_file(ivl_lpm_t net); -extern unsigned ivl_lpm_lineno(ivl_lpm_t net); +extern unsigned ivl_lpm_lineno(ivl_lpm_t net); /* LPM * These functions support access to the properties of LPM diff --git a/netlist.h b/netlist.h index 859173702..403ad6a4a 100644 --- a/netlist.h +++ b/netlist.h @@ -2165,6 +2165,8 @@ class NetUDP : public NetNode { unsigned nin() const { return pin_count()-1; } bool is_sequential() const { return udp->sequential; } perm_string udp_name() const { return udp->name_; } + perm_string udp_file() const { return udp->get_file(); } + unsigned udp_lineno() const { return udp->get_lineno(); } char get_initial() const; private: diff --git a/parse.y b/parse.y index 948b9d35e..9ad2c3e4f 100644 --- a/parse.y +++ b/parse.y @@ -4803,7 +4803,7 @@ udp_input_sym | 'f' { $$ = 'f'; } | 'F' { $$ = 'F'; } | 'l' { $$ = 'l'; } - | 'h' { $$ = 'H'; } + | 'h' { $$ = 'h'; } | 'B' { $$ = 'B'; } | 'r' { $$ = 'r'; } | 'R' { $$ = 'R'; } diff --git a/pform.cc b/pform.cc index 5e4ea3c23..e800e1de7 100644 --- a/pform.cc +++ b/pform.cc @@ -1312,6 +1312,7 @@ void pform_make_udp(perm_string name, list*parms, } else { PUdp*udp = new PUdp(name, parms->size()); + FILE_NAME(udp, file, lineno); // Detect sequential udp. if (pins[0]->get_wire_type() == NetNet::REG) @@ -1392,6 +1393,7 @@ void pform_make_udp(perm_string name, bool synchronous_flag, } else { PUdp*udp = new PUdp(name, pins.count()); + FILE_NAME(udp, file, lineno); // Detect sequential udp. udp->sequential = synchronous_flag; diff --git a/t-dll-api.cc b/t-dll-api.cc index 65a23ef62..48b2435b4 100644 --- a/t-dll-api.cc +++ b/t-dll-api.cc @@ -211,6 +211,12 @@ extern "C" double ivl_const_real(ivl_net_const_t net) return net->b.real_value; } +extern "C" ivl_scope_t ivl_const_scope(ivl_net_const_t net) +{ + assert(net); + return net->scope; +} + extern "C" int ivl_const_signed(ivl_net_const_t net) { assert(net); @@ -838,12 +844,12 @@ extern "C" int ivl_udp_sequ(ivl_udp_t net) return net->sequ; } -extern "C" unsigned ivl_udp_nin(ivl_udp_t net) +extern "C" unsigned ivl_udp_nin(ivl_udp_t net) { return net->nin; } -extern "C" unsigned ivl_udp_init(ivl_udp_t net) +extern "C" char ivl_udp_init(ivl_udp_t net) { return net->init; } @@ -867,6 +873,16 @@ extern "C" const char* ivl_udp_name(ivl_udp_t net) return net->name; } +extern "C" const char* ivl_udp_file(ivl_udp_t net) +{ + return net->file.str(); +} + +extern "C" unsigned ivl_udp_lineno(ivl_udp_t net) +{ + return net->lineno; +} + extern "C" const char* ivl_lpm_basename(ivl_lpm_t net) { return net->name; @@ -1010,7 +1026,6 @@ extern "C" ivl_nexus_t ivl_lpm_enable(ivl_lpm_t net) } } -/* The file name and line number are only set for system functions! */ extern "C" const char* ivl_lpm_file(ivl_lpm_t net) { return net->file.str(); diff --git a/t-dll-expr.cc b/t-dll-expr.cc index ef8b106a9..3c3b3030a 100644 --- a/t-dll-expr.cc +++ b/t-dll-expr.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2010 Stephen Williams (steve@icarus.com) + * Copyright (c) 2000-2011 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 @@ -158,11 +158,10 @@ void dll_target::expr_access_func(const NetEAccess*net) expr_ = (ivl_expr_t)calloc(1, sizeof(struct ivl_expr_s)); expr_->type_ = IVL_EX_BACCESS; expr_->value_ = IVL_VT_REAL; - expr_->file = net->get_file(); - expr_->lineno = net->get_lineno(); expr_->width_ = 1; expr_->signed_= 1; expr_->sized_ = 1; + FILE_NAME(expr_, net); expr_->u_.branch_.branch = net->get_branch()->target_obj(); expr_->u_.branch_.nature = net->get_nature(); @@ -186,6 +185,7 @@ void dll_target::expr_binary(const NetEBinary*net) expr_->width_= net->expr_width(); expr_->signed_ = net->has_sign()? 1 : 0; expr_->sized_= 1; + FILE_NAME(expr_, net); expr_->u_.binary_.op_ = net->op(); expr_->u_.binary_.lef_ = left; @@ -204,6 +204,7 @@ void dll_target::expr_concat(const NetEConcat*net) cur->width_ = net->expr_width(); cur->signed_ = net->has_sign() ? 1 : 0; cur->sized_ = 1; + FILE_NAME(cur, net); cur->u_.concat_.rept = net->repeat(); cur->u_.concat_.parms = net->nparms(); @@ -336,6 +337,7 @@ void dll_target::expr_scope(const NetEScope*net) expr_ = (ivl_expr_t)calloc(1, sizeof(struct ivl_expr_s)); expr_->type_ = IVL_EX_SCOPE; + FILE_NAME(expr_, net); expr_->value_= IVL_VT_VOID; expr_->u_.scope_.scope = lookup_scope_(net->scope()); } @@ -347,6 +349,7 @@ void dll_target::expr_netenum(const NetENetenum*net) expr_ = (ivl_expr_t)calloc(1, sizeof(struct ivl_expr_s)); expr_->type_ = IVL_EX_ENUMTYPE; + FILE_NAME(expr_, net); expr_->value_= IVL_VT_VOID; expr_->u_.enumtype_.type = net->netenum(); } @@ -365,13 +368,13 @@ void dll_target::expr_select(const NetESelect*net) ivl_expr_t rght = expr_; expr_ = (ivl_expr_t)calloc(1, sizeof(struct ivl_expr_s)); - FILE_NAME(expr_, net); expr_->type_ = IVL_EX_SELECT; expr_->value_= IVL_VT_VECTOR; expr_->width_= net->expr_width(); expr_->signed_ = net->has_sign()? 1 : 0; expr_->sized_= 1; + FILE_NAME(expr_, net); expr_->u_.binary_.lef_ = left; expr_->u_.binary_.rig_ = rght; @@ -389,6 +392,7 @@ void dll_target::expr_sfunc(const NetESFunc*net) expr->width_= net->expr_width(); expr->signed_ = net->has_sign()? 1 : 0; expr->sized_= 1; + FILE_NAME(expr, net); /* system function names are lex_strings strings. */ expr->u_.sfunc_.name_ = net->name(); @@ -414,11 +418,11 @@ void dll_target::expr_ternary(const NetETernary*net) ivl_expr_t expr = (ivl_expr_t)calloc(1, sizeof(struct ivl_expr_s)); expr->type_ = IVL_EX_TERNARY; - FILE_NAME(expr, net); expr->value_= net->expr_type(); expr->width_ = net->expr_width(); expr->signed_ = net->has_sign()? 1 : 0; expr->sized_ = 1; + FILE_NAME(expr, net); net->cond_expr()->expr_scan(this); assert(expr_); @@ -456,11 +460,10 @@ void dll_target::expr_signal(const NetESignal*net) expr_->type_ = IVL_EX_SIGNAL; expr_->value_= net->expr_type(); - expr_->file = net->get_file(); - expr_->lineno= net->get_lineno(); expr_->width_= net->expr_width(); expr_->signed_ = net->has_sign()? 1 : 0; expr_->sized_= 1; + FILE_NAME(expr_, net); expr_->u_.signal_.word = word_expr; expr_->u_.signal_.sig = sig; @@ -483,11 +486,11 @@ void dll_target::expr_ufunc(const NetEUFunc*net) ivl_expr_t expr = (ivl_expr_t)calloc(1, sizeof(struct ivl_expr_s)); expr->type_ = IVL_EX_UFUNC; - FILE_NAME(expr, net); expr->value_= net->expr_type(); expr->width_= net->expr_width(); expr->signed_ = net->has_sign()? 1 : 0; expr->sized_= 1; + FILE_NAME(expr, net); expr->u_.ufunc_.def = lookup_scope_(net->func()); assert(expr->u_.ufunc_.def->type_ == IVL_SCT_FUNCTION); @@ -522,6 +525,7 @@ void dll_target::expr_unary(const NetEUnary*net) expr_->width_ = net->expr_width(); expr_->signed_ = net->has_sign()? 1 : 0; expr_->sized_ = 1; + FILE_NAME(expr_, net); expr_->u_.unary_.op_ = net->op(); expr_->u_.unary_.sub_ = sub; } diff --git a/t-dll-proc.cc b/t-dll-proc.cc index 0db09dcae..0f5fb8852 100644 --- a/t-dll-proc.cc +++ b/t-dll-proc.cc @@ -600,6 +600,7 @@ bool dll_target::proc_force(const NetForce*net) assert(stmt_cur_); assert(stmt_cur_->type_ == IVL_ST_NONE); + FILE_NAME(stmt_cur_, net); stmt_cur_->type_ = IVL_ST_FORCE; diff --git a/t-dll.cc b/t-dll.cc index a864650ec..4bbcead29 100644 --- a/t-dll.cc +++ b/t-dll.cc @@ -479,8 +479,7 @@ void dll_target::make_scope_parameters(ivl_scope_t scop, const NetScope*net) ivl_parameter_t cur_par = scop->param_ + idx; cur_par->basename = (*cur_pit).first; cur_par->scope = scop; - cur_par->file = (*cur_pit).second.get_file(); - cur_par->lineno = (*cur_pit).second.get_lineno(); + FILE_NAME(cur_par, &((*cur_pit).second)); NetExpr*etmp = (*cur_pit).second.val; make_scope_param_expr(cur_par, etmp); @@ -493,8 +492,7 @@ void dll_target::make_scope_parameters(ivl_scope_t scop, const NetScope*net) ivl_parameter_t cur_par = scop->param_ + idx; cur_par->basename = (*cur_pit).first; cur_par->scope = scop; - cur_par->file = (*cur_pit).second.get_file(); - cur_par->lineno = (*cur_pit).second.get_lineno(); + FILE_NAME(cur_par, &((*cur_pit).second)); NetExpr*etmp = (*cur_pit).second.val; make_scope_param_expr(cur_par, etmp); @@ -756,6 +754,7 @@ bool dll_target::bufz(const NetBUFZ*net) obj->width_= net->width(); obj->npins_= 2; obj->pins_ = new ivl_nexus_t[2]; + FILE_NAME(obj, net); /* Get the ivl_nexus_t objects connected to the two pins. @@ -844,6 +843,8 @@ void dll_target::logic(const NetLogic*net) obj->width_ = net->width(); + FILE_NAME(obj, net); + switch (net->type()) { case NetLogic::AND: obj->type_ = IVL_LO_AND; @@ -942,9 +943,6 @@ void dll_target::logic(const NetLogic*net) make_logic_delays_(obj, net); - obj->file = net->get_file(); - obj->lineno = net->get_lineno(); - scope_add_logic(scop, obj); } @@ -960,6 +958,7 @@ bool dll_target::tran(const NetTran*net) obj->island = net->get_island(); assert(obj->scope); assert(obj->island); + FILE_NAME(obj, net); const Nexus*nex; @@ -989,9 +988,6 @@ bool dll_target::tran(const NetTran*net) obj->offset= net->part_offset(); } - obj->file = net->get_file(); - obj->lineno = net->get_lineno(); - switch_attributes(obj, net); make_switch_delays_(obj, net); scope_add_switch(obj->scope, obj); @@ -1007,6 +1003,7 @@ bool dll_target::sign_extend(const NetSignExtend*net) obj->name = net->name(); obj->scope = find_scope(des_, net->scope()); assert(obj->scope); + FILE_NAME(obj, net); const Nexus*nex; @@ -1059,6 +1056,7 @@ bool dll_target::ureduce(const NetUReduce*net) obj->name = net->name(); obj->scope = find_scope(des_, net->scope()); assert(obj->scope); + FILE_NAME(obj, net); obj->width = net->width(); @@ -1090,6 +1088,7 @@ void dll_target::net_case_cmp(const NetCaseCmp*net) obj->name = net->name(); obj->scope = find_scope(des_, net->scope()); assert(obj->scope); + FILE_NAME(obj, net); obj->width = net->width(); obj->u_.arith.signed_flag = 0; @@ -1160,10 +1159,10 @@ bool dll_target::net_sysfunction(const NetSysFunc*net) struct ivl_lpm_s*obj = new struct ivl_lpm_s; obj->type = IVL_LPM_SFUNC; - FILE_NAME(obj, net); obj->name = net->name(); obj->scope = find_scope(des_, net->scope()); assert(obj->scope); + FILE_NAME(obj, net); obj->u_.sfunc.ports = net->pin_count(); @@ -1212,6 +1211,7 @@ bool dll_target::net_function(const NetUserFunc*net) obj->name = net->name(); obj->scope = find_scope(des_, net->scope()); assert(obj->scope); + FILE_NAME(obj, net); /* Get the definition of the function and save it. */ const NetScope*def = net->def(); @@ -1259,6 +1259,7 @@ void dll_target::udp(const NetUDP*net) struct ivl_net_logic_s *obj = new struct ivl_net_logic_s; obj->type_ = IVL_LO_UDP; + FILE_NAME(obj, net); /* The NetUDP class hasn't learned about width yet, so we assume a width of 1. */ @@ -1279,6 +1280,8 @@ void dll_target::udp(const NetUDP*net) u->table[u->nrows] = 0x0; u->nin = net->nin(); u->sequ = net->is_sequential(); + u->file = net->udp_file(); + u->lineno = net->udp_lineno(); if (u->sequ) u->init = net->get_initial(); else @@ -1327,6 +1330,7 @@ void dll_target::udp(const NetUDP*net) obj->scope_= scop; obj->name_ = net->name(); + FILE_NAME(obj, net); make_logic_delays_(obj, net); @@ -1344,6 +1348,7 @@ void dll_target::lpm_abs(const NetAbs*net) assert(net->scope()); obj->scope = find_scope(des_, net->scope()); assert(obj->scope); + FILE_NAME(obj, net); obj->u_.arith.signed_flag = 0; obj->width = net->width(); @@ -1379,6 +1384,7 @@ void dll_target::lpm_add_sub(const NetAddSub*net) assert(net->scope()); obj->scope = find_scope(des_, net->scope()); assert(obj->scope); + FILE_NAME(obj, net); obj->u_.arith.signed_flag = 0; @@ -1431,6 +1437,7 @@ bool dll_target::lpm_array_dq(const NetArrayDq*net) assert(obj->u_.array.sig); obj->scope = find_scope(des_, net->scope()); assert(obj->scope); + FILE_NAME(obj, net); obj->width = net->width(); obj->u_.array.swid = net->awidth(); @@ -1466,6 +1473,7 @@ void dll_target::lpm_clshift(const NetCLShift*net) assert(net->scope()); obj->scope = find_scope(des_, net->scope()); assert(obj->scope); + FILE_NAME(obj, net); /* Look at the direction input of the device, and select the shift direction accordingly. */ @@ -1512,6 +1520,7 @@ bool dll_target::lpm_arith1_(ivl_lpm_type_t lpm_type, unsigned width, bool signe assert(net->scope()); obj->scope = find_scope(des_, net->scope()); assert(obj->scope); + FILE_NAME(obj, net); obj->width = width; obj->u_.arith.signed_flag = signed_flag? 1 : 0; @@ -1564,6 +1573,7 @@ void dll_target::lpm_compare(const NetCompare*net) assert(net->scope()); obj->scope = find_scope(des_, net->scope()); assert(obj->scope); + FILE_NAME(obj, net); bool swap_operands = false; @@ -1667,6 +1677,7 @@ void dll_target::lpm_divide(const NetDivide*net) assert(net->scope()); obj->scope = find_scope(des_, net->scope()); assert(obj->scope); + FILE_NAME(obj, net); unsigned wid = net->width_r(); @@ -1706,6 +1717,7 @@ void dll_target::lpm_modulo(const NetModulo*net) assert(net->scope()); obj->scope = find_scope(des_, net->scope()); assert(obj->scope); + FILE_NAME(obj, net); unsigned wid = net->width_r(); @@ -1744,6 +1756,7 @@ void dll_target::lpm_ff(const NetFF*net) obj->name = net->name(); obj->scope = find_scope(des_, net->scope()); assert(obj->scope); + FILE_NAME(obj, net); obj->width = net->width(); @@ -1831,7 +1844,6 @@ void dll_target::lpm_ff(const NetFF*net) assert(nex->t_cookie()); obj->u_.ff.d.pin = nex->t_cookie(); nexus_lpm_add(obj->u_.ff.d.pin, obj, 0, IVL_DR_HiZ, IVL_DR_HiZ); - } /* @@ -1845,6 +1857,7 @@ void dll_target::lpm_mult(const NetMult*net) assert(net->scope()); obj->scope = find_scope(des_, net->scope()); assert(obj->scope); + FILE_NAME(obj, net); unsigned wid = net->width_r(); @@ -1887,6 +1900,7 @@ void dll_target::lpm_mux(const NetMux*net) obj->name = net->name(); // The NetMux permallocates its name. obj->scope = find_scope(des_, net->scope()); assert(obj->scope); + FILE_NAME(obj, net); obj->width = net->width(); obj->u_.mux.size = net->size(); @@ -1938,6 +1952,7 @@ void dll_target::lpm_pow(const NetPow*net) assert(net->scope()); obj->scope = find_scope(des_, net->scope()); assert(obj->scope); + FILE_NAME(obj, net); unsigned wid = net->width_r(); obj->u_.arith.signed_flag = net->get_signed()? 1 : 0; @@ -1977,6 +1992,7 @@ bool dll_target::concat(const NetConcat*net) assert(net->scope()); obj->scope = find_scope(des_, net->scope()); assert(obj->scope); + FILE_NAME(obj, net); obj->width = net->width(); @@ -2010,11 +2026,11 @@ bool dll_target::part_select(const NetPartSelect*net) obj->type = IVL_LPM_PART_PV; break; } - FILE_NAME(obj, net); obj->name = net->name(); // NetPartSelect names are permallocated. assert(net->scope()); obj->scope = find_scope(des_, net->scope()); assert(obj->scope); + FILE_NAME(obj, net); /* Part selects are always unsigned, so we use this to indicate * if the part select base signal is signed or not. */ @@ -2093,6 +2109,7 @@ bool dll_target::replicate(const NetReplicate*net) assert(net->scope()); obj->scope = find_scope(des_, net->scope()); assert(obj->scope); + FILE_NAME(obj, net); obj->width = net->width(); obj->u_.repeat.count = net->repeat(); @@ -2136,6 +2153,9 @@ bool dll_target::net_const(const NetConst*net) struct ivl_net_const_s *obj = new struct ivl_net_const_s; obj->type = IVL_VT_BOOL; + assert(net->scope()); + obj->scope = find_scope(des_, net->scope()); + FILE_NAME(obj, net); /* constants have a single vector output. */ assert(net->pin_count() == 1); @@ -2192,9 +2212,6 @@ bool dll_target::net_const(const NetConst*net) des_.consts.resize( des_.consts.size() + 1 ); des_.consts[des_.consts.size()-1] = obj; - obj->file = net->get_file(); - obj->lineno = net->get_lineno(); - make_const_delays_(obj, net); return true; @@ -2206,6 +2223,9 @@ bool dll_target::net_literal(const NetLiteral*net) struct ivl_net_const_s *obj = new struct ivl_net_const_s; obj->type = IVL_VT_REAL; + assert(net->scope()); + obj->scope = find_scope(des_, net->scope()); + FILE_NAME(obj, net); obj->width_ = 1; obj->signed_ = 1; obj->b.real_value = net->value_real().as_double(); @@ -2322,8 +2342,8 @@ void dll_target::signal(const NetNet*net) object, or creating the sigs_ array if this is the first signal. */ obj->scope_ = find_scope(des_, net->scope()); - FILE_NAME(obj, net); assert(obj->scope_); + FILE_NAME(obj, net); if (obj->scope_->nsigs_ == 0) { assert(obj->scope_->sigs_ == 0); diff --git a/t-dll.h b/t-dll.h index a42b9e89d..a3b6a6aa2 100644 --- a/t-dll.h +++ b/t-dll.h @@ -444,6 +444,7 @@ struct ivl_net_const_s { unsigned signed_ : 1; perm_string file; unsigned lineno; + ivl_scope_t scope; union { double real_value; @@ -512,6 +513,8 @@ struct ivl_udp_s { unsigned nrows; typedef const char*ccharp_t; ccharp_t*table; // zero terminated array of pointers + perm_string file; + unsigned lineno; }; /* @@ -797,12 +800,6 @@ struct ivl_statement_s { * The FILE_NAME function is a shorthand for attaching file/line * information to the statement object. */ -static inline void FILE_NAME(ivl_statement_t stmt, const LineInfo*info) -{ - stmt->file = info->get_file(); - stmt->lineno = info->get_lineno(); -} - static inline void FILE_NAME(ivl_expr_t expr, const LineInfo*info) { expr->file = info->get_file(); @@ -815,6 +812,30 @@ static inline void FILE_NAME(ivl_lpm_t lpm, const LineInfo*info) lpm->lineno = info->get_lineno(); } +static inline void FILE_NAME(ivl_net_const_t net, const LineInfo*info) +{ + net->file = info->get_file(); + net->lineno = info->get_lineno(); +} + +static inline void FILE_NAME(ivl_net_logic_t net, const LineInfo*info) +{ + net->file = info->get_file(); + net->lineno = info->get_lineno(); +} + +static inline void FILE_NAME(ivl_parameter_t net, const LineInfo*info) +{ + net->file = info->get_file(); + net->lineno = info->get_lineno(); +} + +static inline void FILE_NAME(ivl_process_t net, const LineInfo*info) +{ + net->file = info->get_file(); + net->lineno = info->get_lineno(); +} + static inline void FILE_NAME(ivl_scope_t scope, const NetScope*info) { scope->file = info->get_file(); @@ -823,13 +844,13 @@ static inline void FILE_NAME(ivl_scope_t scope, const NetScope*info) scope->def_lineno = info->get_def_lineno(); } -static inline void FILE_NAME(ivl_switch_t net, const LineInfo*info) +static inline void FILE_NAME(ivl_statement_t stmt, const LineInfo*info) { - net->file = info->get_file(); - net->lineno = info->get_lineno(); + stmt->file = info->get_file(); + stmt->lineno = info->get_lineno(); } -static inline void FILE_NAME(ivl_process_t net, const LineInfo*info) +static inline void FILE_NAME(ivl_switch_t net, const LineInfo*info) { net->file = info->get_file(); net->lineno = info->get_lineno(); diff --git a/tgt-stub/stub.c b/tgt-stub/stub.c index 2587454e1..7976c3de7 100644 --- a/tgt-stub/stub.c +++ b/tgt-stub/stub.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2010 Stephen Williams (steve@icarus.com) + * Copyright (c) 2000-2011 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 @@ -36,7 +36,7 @@ static const char*version_string = "Icarus Verilog STUB Code Generator " VERSION " (" VERSION_TAG ")\n\n" -"Copyright (c) 2000-2009 Stephen Williams (steve@icarus.com)\n\n" +"Copyright (c) 2000-2011 Stephen Williams (steve@icarus.com)\n\n" " This program is free software; you can redistribute it and/or modify\n" " it under the terms of the GNU General Public License as published by\n" " the Free Software Foundation; either version 2 of the License, or\n" @@ -1641,7 +1641,7 @@ static void show_primitive(ivl_udp_t net, unsigned ref_count) ivl_udp_name(net), ref_count); if (ivl_udp_sequ(net)) - fprintf(out, " reg out = %u;\n", ivl_udp_init(net)); + fprintf(out, " reg out = %c;\n", ivl_udp_init(net)); else fprintf(out, " wire out;\n"); fprintf(out, " table\n");