From 008a4100b3a62c27fca2ee5b01a574bcd4d5f108 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Fri, 28 Aug 2009 20:32:33 -0700 Subject: [PATCH] Handle real wires as vvp_wire_real filters. --- vvp/words.cc | 89 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 83 insertions(+), 6 deletions(-) diff --git a/vvp/words.cc b/vvp/words.cc index e5a5a4b98..725031dd0 100644 --- a/vvp/words.cc +++ b/vvp/words.cc @@ -266,8 +266,6 @@ static void __compile_net(char*label, signed_flag, net8_flag, local_flag); resolv_submit(res); return; - cerr << __FILE__ << ":" << __LINE__ << ": Internal error: " - << "vvp_net_lookup fails: " << argv[0].text << endl; } assert(node); @@ -313,19 +311,84 @@ void compile_netw(char*label, char*array_label, unsigned long array_addr, argc, argv); } + +class __compile_real_net_resolv : public resolv_list_s { + + public: + explicit __compile_real_net_resolv(char*ref_label, char*my_label, char*name, + bool local_flag) + : resolv_list_s(ref_label) + { my_label_ = my_label; + name_ = name; + local_flag_ = local_flag; + } + + ~__compile_real_net_resolv() { } + + bool resolve(bool message_flag); + + private: + char*my_label_; + char*name_; + bool local_flag_; +}; + +static void __compile_real_net2(vvp_net_t*node, char*my_label, char*name, + bool local_flag) +{ + vvp_wire_base*fil = dynamic_cast (node->fil); + + if (fil == 0) { + fil = new vvp_wire_real; + node->fil = fil; + } + + vpiHandle obj = 0; + if (!local_flag) { + obj = vpip_make_real_var(name, node); + compile_vpi_symbol(my_label, obj); + } + + if (obj) vpip_attach_to_current_scope(obj); + + free(my_label); + delete[]name; +} + static void __compile_real(char*label, char*name, char*array_label, unsigned long array_addr, int msb, int lsb, bool local_flag, unsigned argc, struct symb_s*argv) { - vvp_net_t*net = new vvp_net_t; - +#if 0 vvp_array_t array = array_label ? array_find(array_label) : 0; assert(array_label ? array!=0 : true); - +#endif + // XXXX Forgot how to implement net arrays... + assert(array_label == 0); + + assert(argc == 1); + vvp_net_t*node = vvp_net_lookup(argv[0].text); + if (node == 0) { + /* No existing net, but the string value may be a + constant. In that case, we will wind up generating a + bufz node that can carry the constant value. */ + node = create_constant_node(label, argv[0].text); + } + if (node == 0) { + __compile_real_net_resolv*res + = new __compile_real_net_resolv(argv[0].text, label, + name, local_flag); + resolv_submit(res); + return; + } + + assert(node); + assert(name); + __compile_real_net2(node, label, name, local_flag); +#if 0 vvp_fun_signal_real*fun = new vvp_fun_signal_real_sa; net->fun = fun; - assert(0 /* Need to create a vvp_net_fil_t object: net->fil = fun; */); /* Add the label into the functor symbol table. */ define_functor_symbol(label, net); @@ -352,6 +415,20 @@ static void __compile_real(char*label, char*name, if (name) delete[] name; if (array_label) free(array_label); free(argv); +#endif +} + +bool __compile_real_net_resolv::resolve(bool msg_flag) +{ + vvp_net_t*node = vvp_net_lookup(label()); + if (node == 0) { + if (msg_flag) + cerr << "Unable to resolve label " << label() << endl; + return false; + } + + __compile_real_net2(node, my_label_, name_, local_flag_); + return true; } void compile_net_real(char*label, char*name, int msb, int lsb, bool local_flag,