diff --git a/PWire.cc b/PWire.cc index 3e74a44c9..da424e6d4 100644 --- a/PWire.cc +++ b/PWire.cc @@ -198,13 +198,13 @@ void PWire::set_memory_idx(PExpr*ldx, PExpr*rdx) } } -void PWire::set_discipline(discipline_t*d) +void PWire::set_discipline(ivl_discipline_t d) { assert(discipline_ == 0); discipline_ = d; } -discipline_t* PWire::get_discipline(void) const +ivl_discipline_t PWire::get_discipline(void) const { return discipline_; } diff --git a/PWire.h b/PWire.h index 9ff597552..697fd732e 100644 --- a/PWire.h +++ b/PWire.h @@ -18,9 +18,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ -#ifdef HAVE_CVS_IDENT -#ident "$Id: PWire.h,v 1.21 2007/05/24 04:07:11 steve Exp $" -#endif # include "netlist.h" # include "LineInfo.h" @@ -36,7 +33,6 @@ class ostream; class PExpr; class Design; -class discipline_t; /* * The different type of PWire::set_range() calls. @@ -82,8 +78,8 @@ class PWire : public LineInfo { void set_memory_idx(PExpr*ldx, PExpr*rdx); - void set_discipline(discipline_t*); - discipline_t* get_discipline(void) const; + void set_discipline(ivl_discipline_t); + ivl_discipline_t get_discipline(void) const; map attributes; @@ -115,7 +111,7 @@ class PWire : public LineInfo { PExpr*lidx_; PExpr*ridx_; - discipline_t*discipline_; + ivl_discipline_t discipline_; private: // not implemented PWire(const PWire&); diff --git a/design_dump.cc b/design_dump.cc index 633a9e56d..5a2d3b8cb 100644 --- a/design_dump.cc +++ b/design_dump.cc @@ -189,7 +189,7 @@ void NetNet::dump_net(ostream&o, unsigned ind) const break; } - if (discipline_t*dis = get_discipline()) + if (ivl_discipline_t dis = get_discipline()) o << " discipline=" << dis->name(); o << " (eref=" << peek_eref() << ", lref=" << peek_lref() << ")"; diff --git a/discipline.cc b/discipline.cc index 19486a748..455f59d42 100644 --- a/discipline.cc +++ b/discipline.cc @@ -28,12 +28,12 @@ nature_t::~nature_t() { } -discipline_t::discipline_t(perm_string name__, ddomain_t domain__, - nature_t*pot, nature_t*flow__) +ivl_discipline_s::ivl_discipline_s(perm_string name__, ivl_dis_domain_t domain__, + nature_t*pot, nature_t*flow__) : name_(name__), domain_(domain__), potential_(pot), flow_(flow__) { } -discipline_t::~discipline_t() +ivl_discipline_s::~ivl_discipline_s() { } diff --git a/discipline.h b/discipline.h index a79e538d2..118625a2b 100644 --- a/discipline.h +++ b/discipline.h @@ -28,10 +28,10 @@ # include "StringHeap.h" # include # include +# include "ivl_target.h" # include "LineInfo.h" -typedef enum { DD_NONE, DD_DISCRETE, DD_CONTINUOUS } ddomain_t; -extern std::ostream& operator << (std::ostream&, ddomain_t); +extern std::ostream& operator << (std::ostream&, ivl_dis_domain_t); class nature_t : public LineInfo { public: @@ -47,30 +47,30 @@ class nature_t : public LineInfo { perm_string access_; }; -class discipline_t : public LineInfo { +class ivl_discipline_s : public LineInfo { public: - explicit discipline_t (perm_string name, ddomain_t dom, - nature_t*pot, nature_t*flow); - ~discipline_t(); + explicit ivl_discipline_s (perm_string name, ivl_dis_domain_t dom, + nature_t*pot, nature_t*flow); + ~ivl_discipline_s(); perm_string name() const { return name_; } - ddomain_t domain() const { return domain_; } + ivl_dis_domain_t domain() const { return domain_; } const nature_t*potential() const { return potential_; } const nature_t*flow() const { return flow_; } private: perm_string name_; - ddomain_t domain_; + ivl_dis_domain_t domain_; nature_t*potential_; nature_t*flow_; private: // not implemented - discipline_t(const discipline_t&); - discipline_t& operator = (const discipline_t&); + ivl_discipline_s(const ivl_discipline_s&); + ivl_discipline_s& operator = (const ivl_discipline_s&); }; extern map natures; -extern map disciplines; +extern map disciplines; // Map access function name to the nature that it accesses. extern map access_function_nature; diff --git a/elab_expr.cc b/elab_expr.cc index 0513c1a43..a6c5850dc 100644 --- a/elab_expr.cc +++ b/elab_expr.cc @@ -1241,7 +1241,7 @@ NetExpr* PECallFunction::elaborate_access_func_(Design*des, NetScope*scope, NetNet*sig = scope->find_signal(name); ivl_assert(*this, sig); - discipline_t*dis = sig->get_discipline(); + ivl_discipline_t dis = sig->get_discipline(); ivl_assert(*this, dis); ivl_assert(*this, nature == dis->potential() || nature == dis->flow()); diff --git a/elab_sig.cc b/elab_sig.cc index 359985b51..88466637f 100644 --- a/elab_sig.cc +++ b/elab_sig.cc @@ -1055,7 +1055,7 @@ NetNet* PWire::elaborate_sig(Design*des, NetScope*scope) const sig->set_signed(get_signed()); sig->set_isint(get_isint()); - if (discipline_t*dis = get_discipline()) { + if (ivl_discipline_t dis = get_discipline()) { sig->set_discipline(dis); } diff --git a/ivl.def b/ivl.def index 22260e7e9..6d46f4beb 100644 --- a/ivl.def +++ b/ivl.def @@ -15,6 +15,9 @@ ivl_const_signed ivl_const_type ivl_const_width +ivl_discipline_domain +ivl_discipline_name + ivl_event_any ivl_event_basename ivl_event_name @@ -172,6 +175,7 @@ ivl_signal_attr_val ivl_signal_basename ivl_signal_data_type ivl_signal_dimensions +ivl_signal_discipline ivl_signal_file ivl_signal_integer ivl_signal_lineno diff --git a/ivl_target.h b/ivl_target.h index bc5498a52..9c6c73d7e 100644 --- a/ivl_target.h +++ b/ivl_target.h @@ -151,6 +151,7 @@ _BEGIN_DECL typedef struct ivl_array_s *ivl_array_t; typedef struct ivl_delaypath_s*ivl_delaypath_t; typedef struct ivl_design_s *ivl_design_t; +typedef struct ivl_discipline_s*ivl_discipline_t; typedef struct ivl_event_s *ivl_event_t; typedef struct ivl_expr_s *ivl_expr_t; typedef struct ivl_island_s *ivl_island_t; @@ -159,6 +160,7 @@ typedef struct ivl_lval_s *ivl_lval_t; typedef struct ivl_net_const_s*ivl_net_const_t; typedef struct ivl_net_logic_s*ivl_net_logic_t; typedef struct ivl_udp_s *ivl_udp_t; +typedef struct ivl_nature_s *ivl_nature_t; typedef struct ivl_net_probe_s*ivl_net_probe_t; typedef struct ivl_nexus_s *ivl_nexus_t; typedef struct ivl_nexus_ptr_s*ivl_nexus_ptr_t; @@ -176,6 +178,12 @@ typedef struct ivl_statement_s*ivl_statement_t; * changes and additions to the enumerations. */ +typedef enum ivl_dis_domain_e { + IVL_DIS_NONE = 0, + IVL_DIS_DISCRETE = 1, + IVL_DIS_CONTINUOUS = 2 +} ivl_dis_domain_t; + typedef enum ivl_drive_e { IVL_DR_HiZ = 0, IVL_DR_SMALL = 1, @@ -543,6 +551,13 @@ extern double ivl_const_real(ivl_net_const_t net); /* extern ivl_nexus_t ivl_const_pin(ivl_net_const_t net, unsigned idx); */ /* extern unsigned ivl_const_pins(ivl_net_const_t net); */ +/* DISCIPLINES + * + * Disciplines are a Verilog-AMS construct. + */ +extern const char*ivl_discipline_name(ivl_discipline_t net); +extern ivl_dis_domain_t ivl_discipline_domain(ivl_discipline_t net); + /* EVENTS * * Events are a unification of named events and implicit events @@ -1584,6 +1599,8 @@ extern int ivl_scope_time_units(ivl_scope_t net); * The signal may be an array (of vectors) in which case this * function returns >0, the number of dimensions of the array. * + * ivl_signal_discipline + * * ivl_signal_msb * ivl_signal_lsb * ivl_signal_width @@ -1651,6 +1668,7 @@ extern ivl_nexus_t ivl_signal_nex(ivl_signal_t net, unsigned word); extern int ivl_signal_array_base(ivl_signal_t net); extern unsigned ivl_signal_array_count(ivl_signal_t net); extern unsigned ivl_signal_dimensions(ivl_signal_t net); +extern ivl_discipline_t ivl_signal_discipline(ivl_signal_t net); extern int ivl_signal_msb(ivl_signal_t net); extern int ivl_signal_lsb(ivl_signal_t net); extern unsigned ivl_signal_width(ivl_signal_t net); diff --git a/lexor.lex b/lexor.lex index 34eca1c0b..0b4bebd2c 100644 --- a/lexor.lex +++ b/lexor.lex @@ -247,7 +247,7 @@ S [afpnumkKMGT] value instead. */ if (rc == IDENTIFIER && gn_verilog_ams_flag) { perm_string tmp = lex_strings.make(yylval.text); - map::iterator cur = disciplines.find(tmp); + map::iterator cur = disciplines.find(tmp); if (cur != disciplines.end()) { yylval.discipline = (*cur).second; rc = DISCIPLINE_IDENTIFIER; diff --git a/main.cc b/main.cc index fb4ec97ef..abdb03245 100644 --- a/main.cc +++ b/main.cc @@ -705,7 +705,7 @@ int main(int argc, char*argv[]) pform_dump(out, (*cur).second); } out << "PFORM DUMP DISCIPLINES:" << endl; - for (map::iterator cur = disciplines.begin() + for (map::iterator cur = disciplines.begin() ; cur != disciplines.end() ; cur ++ ) { pform_dump(out, (*cur).second); } diff --git a/netlist.cc b/netlist.cc index 6209a2f9b..072112256 100644 --- a/netlist.cc +++ b/netlist.cc @@ -242,7 +242,7 @@ NetNode::~NetNode() design_->del_node(this); } -NetBranch::NetBranch(discipline_t*dis) +NetBranch::NetBranch(ivl_discipline_t dis) : NetPins(2), discipline_(dis) { pin(0).set_dir(Link::PASSIVE); @@ -647,12 +647,12 @@ void NetNet::set_isint(bool flag) isint_ = flag; } -discipline_t* NetNet::get_discipline() const +ivl_discipline_t NetNet::get_discipline() const { return discipline_; } -void NetNet::set_discipline(discipline_t*dis) +void NetNet::set_discipline(ivl_discipline_t dis) { ivl_assert(*this, discipline_ == 0); discipline_ = dis; diff --git a/netlist.h b/netlist.h index d97faed80..022953ff4 100644 --- a/netlist.h +++ b/netlist.h @@ -69,7 +69,6 @@ class NetEvTrig; class NetEvWait; class nature_t; -class discipline_t; struct target; struct functor_t; @@ -173,12 +172,12 @@ class IslandBranch { class NetBranch : public NetPins { public: - explicit NetBranch(discipline_t*dis); - explicit NetBranch(discipline_t*dis, perm_string name); + explicit NetBranch(ivl_discipline_t dis); + explicit NetBranch(ivl_discipline_t dis, perm_string name); ~NetBranch(); private: - discipline_t*discipline_; + ivl_discipline_t discipline_; perm_string name_; }; @@ -555,8 +554,8 @@ class NetNet : public NetObj { void set_isint(bool); /* Attach a discipline to the net. */ - discipline_t* get_discipline() const; - void set_discipline(discipline_t*dis); + ivl_discipline_t get_discipline() const; + void set_discipline(ivl_discipline_t dis); /* These methods return the msb and lsb indices for the most significant and least significant bits. These are signed @@ -620,7 +619,7 @@ class NetNet : public NetObj { ivl_variable_type_t data_type_; bool signed_; bool isint_; // original type of integer - discipline_t*discipline_; + ivl_discipline_t discipline_; long msb_, lsb_; const unsigned dimensions_; diff --git a/parse.y b/parse.y index a4bc148a3..f5b1a1988 100644 --- a/parse.y +++ b/parse.y @@ -142,7 +142,7 @@ static PECallFunction*make_call_function(perm_string tn, PExpr*arg1, PExpr*arg2) list*perm_strings; pform_name_t*pform_name; - discipline_t*discipline; + ivl_discipline_t discipline; hname_t*hier; @@ -704,9 +704,9 @@ discipline_items discipline_item : K_domain K_discrete ';' - { pform_discipline_domain(@1, DD_DISCRETE); } + { pform_discipline_domain(@1, IVL_DIS_DISCRETE); } | K_domain K_continuous ';' - { pform_discipline_domain(@1, DD_CONTINUOUS); } + { pform_discipline_domain(@1, IVL_DIS_CONTINUOUS); } | K_potential IDENTIFIER ';' { pform_discipline_potential(@1, $2); delete[] $2; } | K_flow IDENTIFIER ';' diff --git a/pform.h b/pform.h index 14fc2f875..03f2065fd 100644 --- a/pform.h +++ b/pform.h @@ -373,7 +373,6 @@ extern void pform_error_nested_modules(); * Functions for handling the parse of natures and disciplines. These * functions are in pform_disciplines.cc */ -class discipline_t; extern void pform_start_nature(const char*name); extern void pform_end_nature(const struct vlltype&loc); @@ -383,15 +382,15 @@ extern void pform_nature_access(const struct vlltype&loc, const char*name); extern void pform_start_discipline(const char*name); extern void pform_end_discipline(const struct vlltype&loc); -extern void pform_discipline_domain(const struct vlltype&loc, ddomain_t use_domain); +extern void pform_discipline_domain(const struct vlltype&loc, ivl_dis_domain_t use_domain); extern void pform_discipline_potential(const struct vlltype&loc, const char*name); extern void pform_discipline_flow(const struct vlltype&loc, const char*name); extern void pform_attach_discipline(const struct vlltype&loc, - discipline_t*discipline, list*names); + ivl_discipline_t discipline, list*names); extern void pform_dump(ostream&out, const nature_t*); -extern void pform_dump(ostream&out, const discipline_t*); +extern void pform_dump(ostream&out, const ivl_discipline_s*); /* ** pform_analog.cc */ diff --git a/pform_disciplines.cc b/pform_disciplines.cc index 5660a8fe5..71c91a185 100644 --- a/pform_disciplines.cc +++ b/pform_disciplines.cc @@ -24,7 +24,7 @@ # include "discipline.h" map natures; -map disciplines; +map disciplines; map access_function_nature; static perm_string nature_name = perm_string::perm_string(); @@ -88,21 +88,21 @@ void pform_end_nature(const struct vlltype&loc) static perm_string discipline_name; -static ddomain_t discipline_domain = DD_NONE; +static ivl_dis_domain_t discipline_domain = IVL_DIS_NONE; static nature_t* discipline_potential = 0; static nature_t* discipline_flow = 0; void pform_start_discipline(const char*name) { discipline_name = lex_strings.make(name); - discipline_domain = DD_NONE; + discipline_domain = IVL_DIS_NONE; } -void pform_discipline_domain(const struct vlltype&loc, ddomain_t use_domain) +void pform_discipline_domain(const struct vlltype&loc, ivl_dis_domain_t use_domain) { - assert(use_domain != DD_NONE); + assert(use_domain != IVL_DIS_NONE); - if (discipline_domain != DD_NONE) { + if (discipline_domain != IVL_DIS_NONE) { cerr << loc.text << ":" << loc.first_line << ": error: " << "Too many domain attributes for discipline " << discipline_name << "." << endl; @@ -159,18 +159,20 @@ void pform_end_discipline(const struct vlltype&loc) { // If the domain is not otherwise specified, then take it to // be continuous if potential or flow natures are given. - if (discipline_domain == DD_NONE && (discipline_potential||discipline_flow)) - discipline_domain = DD_CONTINUOUS; + if (discipline_domain == IVL_DIS_NONE && (discipline_potential||discipline_flow)) + discipline_domain = IVL_DIS_CONTINUOUS; - discipline_t*tmp = new discipline_t(discipline_name, discipline_domain, - discipline_potential, discipline_flow); + ivl_discipline_t tmp = new ivl_discipline_s(discipline_name, + discipline_domain, + discipline_potential, + discipline_flow); disciplines[discipline_name] = tmp; FILE_NAME(tmp, loc); /* Clear the static variables for the next item. */ discipline_name = perm_string::perm_string(); - discipline_domain = DD_NONE; + discipline_domain = IVL_DIS_NONE; discipline_potential = 0; discipline_flow = 0; } @@ -183,7 +185,7 @@ void pform_end_discipline(const struct vlltype&loc) * in the current lexical scope. */ void pform_attach_discipline(const struct vlltype&loc, - discipline_t*discipline, list*names) + ivl_discipline_t discipline, list*names) { for (list::iterator cur = names->begin() ; cur != names->end() ; cur ++ ) { @@ -197,7 +199,7 @@ void pform_attach_discipline(const struct vlltype&loc, assert(cur_net); } - if (discipline_t*tmp = cur_net->get_discipline()) { + if (ivl_discipline_t tmp = cur_net->get_discipline()) { cerr << loc.text << ":" << loc.first_line << ": error: " << "discipline " << discipline->name() << " cannot override existing discipline " << tmp->name() diff --git a/pform_dump.cc b/pform_dump.cc index 4dca440d2..438c5c88a 100644 --- a/pform_dump.cc +++ b/pform_dump.cc @@ -148,16 +148,16 @@ std::ostream& operator << (std::ostream&out, ivl_process_type_t pt) return out; } -std::ostream& operator << (std::ostream&out, ddomain_t dom) +std::ostream& operator << (std::ostream&out, ivl_dis_domain_t dom) { switch (dom) { - case DD_NONE: + case IVL_DIS_NONE: out << "no-domain"; break; - case DD_DISCRETE: + case IVL_DIS_DISCRETE: out << "discrete"; break; - case DD_CONTINUOUS: + case IVL_DIS_CONTINUOUS: out << "continuous"; break; default: @@ -1300,7 +1300,7 @@ void pform_dump(std::ostream&out, const nature_t*nat) out << "endnature" << endl; } -void pform_dump(std::ostream&out, const discipline_t*dis) +void pform_dump(std::ostream&out, const ivl_discipline_s*dis) { out << "discipline " << dis->name() << endl; out << " domain " << dis->domain() << ";" << endl; diff --git a/t-dll-api.cc b/t-dll-api.cc index ebfee98e5..d9a5e4346 100644 --- a/t-dll-api.cc +++ b/t-dll-api.cc @@ -20,6 +20,7 @@ # include "config.h" # include "StringHeap.h" # include "t-dll.h" +# include "discipline.h" # include # include #ifdef HAVE_MALLOC_H @@ -81,6 +82,16 @@ extern "C" ivl_net_const_t ivl_design_const(ivl_design_t des, unsigned idx) return des->consts[idx]; } +extern "C" ivl_dis_domain_t ivl_discipline_domain(ivl_discipline_t net) +{ + return net->domain(); +} + +extern "C" const char* ivl_discipline_name(ivl_discipline_t net) +{ + return net->name(); +} + extern "C" ivl_expr_type_t ivl_expr_type(ivl_expr_t net) { if (net == 0) @@ -1729,6 +1740,11 @@ extern "C" unsigned ivl_signal_dimensions(ivl_signal_t net) return net->array_dimensions_; } +extern "C" ivl_discipline_t ivl_signal_discipline(ivl_signal_t net) +{ + return net->discipline; +} + extern "C" const char* ivl_signal_attr(ivl_signal_t net, const char*key) { if (net->nattr == 0) diff --git a/t-dll.cc b/t-dll.cc index c452f4be0..37a949270 100644 --- a/t-dll.cc +++ b/t-dll.cc @@ -2410,6 +2410,7 @@ void dll_target::signal(const NetNet*net) obj->lsb_dist = net->msb() >= net->lsb() ? 1 : -1; obj->isint_ = false; obj->local_ = net->local_flag()? 1 : 0; + obj->discipline = net->get_discipline(); obj->array_dimensions_ = net->array_dimensions(); diff --git a/t-dll.h b/t-dll.h index 7989ab8f9..d5d149eb8 100644 --- a/t-dll.h +++ b/t-dll.h @@ -623,6 +623,7 @@ struct ivl_signal_s { ivl_signal_type_t type_; ivl_signal_port_t port_; ivl_variable_type_t data_type; + ivl_discipline_t discipline; perm_string file; unsigned lineno; diff --git a/tgt-stub/stub.c b/tgt-stub/stub.c index 22f647e12..5e352dca3 100644 --- a/tgt-stub/stub.c +++ b/tgt-stub/stub.c @@ -1238,17 +1238,24 @@ static void show_signal(ivl_signal_t net) break; } + const char*discipline_txt = "NONE"; + if (ivl_signal_discipline(net)) { + ivl_discipline_t dis = ivl_signal_discipline(net); + discipline_txt = ivl_discipline_name(dis); + } + for (idx = 0 ; idx < ivl_signal_array_count(net) ; idx += 1) { nex = ivl_signal_nex(net, idx); - fprintf(out, " %s %s %s%s[%d:%d] %s[word=%u, adr=%d] nexus=%s\n", + fprintf(out, " %s %s %s%s[%d:%d] %s[word=%u, adr=%d] nexus=%s\n", type, sign, port, data_type, ivl_signal_msb(net), ivl_signal_lsb(net), ivl_signal_basename(net), idx, ivl_signal_array_base(net)+idx, ivl_signal_width(net), ivl_signal_local(net)? ", local":"", + discipline_txt, ivl_nexus_name(nex)); show_nexus_details(net, nex);