Skip to content
This repository
Newer
Older
100644 755 lines (652 sloc) 23.391 kb
e1bbbe56 » steve
1999-10-31 Include subtraction in LPM_ADD_SUB device.
1 /*
f9559371 » martinwhitaker
2010-01-12 Fix for pr2924354.
2 * Copyright (c) 1999-2010 Stephen Williams (steve@icarus.com)
e1bbbe56 » steve
1999-10-31 Include subtraction in LPM_ADD_SUB device.
3 *
4 * This source code is free software; you can redistribute it
5 * and/or modify it in source code form under the terms of the GNU
6 * General Public License as published by the Free Software
7 * Foundation; either version 2 of the License, or (at your option)
8 * any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
18 */
19
b825f8d2 » steve
2001-07-25 Create a config.h.in file to hold all the config
20 # include "config.h"
21
e1bbbe56 » steve
1999-10-31 Include subtraction in LPM_ADD_SUB device.
22 # include "PExpr.h"
23 # include "netlist.h"
b354cf68 » steve
2000-02-16 Fix up width matching in structural bitwise operators.
24 # include "netmisc.h"
48de7395 » steve
2000-03-17 Switch to control warnings.
25 # include "compiler.h"
e1bbbe56 » steve
1999-10-31 Include subtraction in LPM_ADD_SUB device.
26
8ea3b6b0 » ldoolitt
2008-01-04 header includes for gcc-4.3 compatibility
27 # include <cstdlib>
28 # include <cstring>
b825f8d2 » steve
2001-07-25 Create a config.h.in file to hold all the config
29 # include <iostream>
b2e1db6a » steve
2007-01-31 Add method to bind assertions to verilog source lines.
30 # include "ivl_assert.h"
b825f8d2 » steve
2001-07-25 Create a config.h.in file to hold all the config
31
d1f0bcf6 » steve
2003-09-23 Catch unsized expressions in continuous assigns.
32 /*
cfd8cbf8 » steve
2002-11-09 Port expressions for output ports are lnets, not nets.
33 * The concatenation is also OK an an l-value. This method elaborates
65e9b6be » steve
2004-12-11 Rework of internals to carry vectors through nexus instead
34 * it as a structural l-value. The return values is the *input* net of
35 * the l-value, which may feed via part selects to the final
36 * destination. The caller can connect gate outputs to this signal to
37 * make the l-value connections.
cfd8cbf8 » steve
2002-11-09 Port expressions for output ports are lnets, not nets.
38 */
a2c036d5 » steve
2006-04-28 Allow concatenations as arguments to inout ports.
39 NetNet* PEConcat::elaborate_lnet_common_(Design*des, NetScope*scope,
40 bool bidirectional_flag) const
cfd8cbf8 » steve
2002-11-09 Port expressions for output ports are lnets, not nets.
41 {
42 assert(scope);
43
cced1e77 »
2010-10-25 Remove some uses of the svector template.
44 svector<NetNet*>nets (parms_.size());
65e9b6be » steve
2004-12-11 Rework of internals to carry vectors through nexus instead
45 unsigned width = 0;
cfd8cbf8 » steve
2002-11-09 Port expressions for output ports are lnets, not nets.
46 unsigned errors = 0;
47
48 if (repeat_) {
7975e14b »
2007-12-20 LineInfo uses perm_string for path.
49 cerr << get_fileline() << ": sorry: I do not know how to"
cfd8cbf8 » steve
2002-11-09 Port expressions for output ports are lnets, not nets.
50 " elaborate repeat concatenation nets." << endl;
51 return 0;
52 }
53
54 /* Elaborate the operands of the concatenation. */
55 for (unsigned idx = 0 ; idx < nets.count() ; idx += 1) {
07a427bf » steve
2003-01-19 Detect null arguments to concatenation operator.
56
65e9b6be » steve
2004-12-11 Rework of internals to carry vectors through nexus instead
57 if (debug_elaborate) {
7975e14b »
2007-12-20 LineInfo uses perm_string for path.
58 cerr << get_fileline() << ": debug: Elaborate subexpression "
65e9b6be » steve
2004-12-11 Rework of internals to carry vectors through nexus instead
59 << idx << " of " << nets.count() << " l-values: "
60 << *parms_[idx] << endl;
61 }
62
07a427bf » steve
2003-01-19 Detect null arguments to concatenation operator.
63 if (parms_[idx] == 0) {
7975e14b »
2007-12-20 LineInfo uses perm_string for path.
64 cerr << get_fileline() << ": error: Empty expressions "
07a427bf » steve
2003-01-19 Detect null arguments to concatenation operator.
65 << "not allowed in concatenations." << endl;
66 errors += 1;
67 continue;
68 }
69
a2c036d5 » steve
2006-04-28 Allow concatenations as arguments to inout ports.
70 if (bidirectional_flag) {
71 nets[idx] = parms_[idx]->elaborate_bi_net(des, scope);
72 } else {
d26ae866 »
2008-03-18 Move implicit net creation from elaboration to elaborate_sig
73 nets[idx] = parms_[idx]->elaborate_lnet(des, scope);
a2c036d5 » steve
2006-04-28 Allow concatenations as arguments to inout ports.
74 }
464310f5 » caryr
2009-04-02 Report an error when trying to take the concatenation of a real value.
75
76 if (nets[idx] == 0) errors += 1;
77 else if (nets[idx]->data_type() == IVL_VT_REAL) {
78 cerr << parms_[idx]->get_fileline() << ": error: "
79 << "concatenation operand can no be real: "
80 << *parms_[idx] << endl;
cfd8cbf8 » steve
2002-11-09 Port expressions for output ports are lnets, not nets.
81 errors += 1;
464310f5 » caryr
2009-04-02 Report an error when trying to take the concatenation of a real value.
82 continue;
83 } else width += nets[idx]->vector_width();
84
cfd8cbf8 » steve
2002-11-09 Port expressions for output ports are lnets, not nets.
85 }
86
87 /* If any of the sub expressions failed to elaborate, then
88 delete all those that did and abort myself. */
89 if (errors) {
90 for (unsigned idx = 0 ; idx < nets.count() ; idx += 1) {
91 if (nets[idx]) delete nets[idx];
92 }
fac1cc5a » caryr
2008-02-22 Add user function synth and clean up expression code.
93 des->errors += errors;
cfd8cbf8 » steve
2002-11-09 Port expressions for output ports are lnets, not nets.
94 return 0;
95 }
96
97 /* Make the temporary signal that connects to all the
98 operands, and connect it up. Scan the operands of the
65e9b6be » steve
2004-12-11 Rework of internals to carry vectors through nexus instead
99 concat operator from most significant to least significant,
100 which is the order they are given in the concat list. */
101
badad63a » steve
2003-03-06 All NetObj objects have lex_string base names.
102 NetNet*osig = new NetNet(scope, scope->local_symbol(),
65e9b6be » steve
2004-12-11 Rework of internals to carry vectors through nexus instead
103 NetNet::IMPLICIT, width);
104
0c9fb766 » steve
2006-04-30 Get the data type of part select results right.
105 /* Assume that the data types of the nets are all the same, so
106 we can take the data type of any, the first will do. */
107 osig->data_type(nets[0]->data_type());
326329d4 » steve
2007-02-05 Set some missing local flags.
108 osig->local_flag(true);
109 osig->set_line(*this);
65e9b6be » steve
2004-12-11 Rework of internals to carry vectors through nexus instead
110
73e2b297 »
2008-06-03 Replace the NetPartSelect:BI with NetTran(VP).
111 if (bidirectional_flag) {
112 if (debug_elaborate) {
113 cerr << get_fileline() << ": debug: Generating tran(VP) "
114 << "to connect input l-value to subexpressions."
115 << endl;
116 }
cfd8cbf8 » steve
2002-11-09 Port expressions for output ports are lnets, not nets.
117
73e2b297 »
2008-06-03 Replace the NetPartSelect:BI with NetTran(VP).
118 for (unsigned idx = 0 ; idx < nets.count() ; idx += 1) {
119 unsigned wid = nets[idx]->vector_width();
120 unsigned off = width - wid;
121 NetTran*ps = new NetTran(scope, scope->local_symbol(),
122 osig->vector_width(), wid, off);
123 des->add_node(ps);
124 ps->set_line(*this);
a2c036d5 » steve
2006-04-28 Allow concatenations as arguments to inout ports.
125
73e2b297 »
2008-06-03 Replace the NetPartSelect:BI with NetTran(VP).
126 connect(ps->pin(0), osig->pin(0));
127 connect(ps->pin(1), nets[idx]->pin(0));
128
129 ivl_assert(*this, wid <= width);
130 width -= wid;
131 }
132
133 } else {
134 if (debug_elaborate) {
135 cerr << get_fileline() << ": debug: Generating part selects "
136 << "to connect input l-value to subexpressions."
137 << endl;
138 }
139
140 NetPartSelect::dir_t part_dir = NetPartSelect::VP;
141
142 for (unsigned idx = 0 ; idx < nets.count() ; idx += 1) {
143 unsigned wid = nets[idx]->vector_width();
144 unsigned off = width - wid;
145 NetPartSelect*ps = new NetPartSelect(osig, off, wid, part_dir);
146 des->add_node(ps);
147 ps->set_line(*this);
65e9b6be » steve
2004-12-11 Rework of internals to carry vectors through nexus instead
148
73e2b297 »
2008-06-03 Replace the NetPartSelect:BI with NetTran(VP).
149 connect(ps->pin(1), osig->pin(0));
150 connect(ps->pin(0), nets[idx]->pin(0));
65e9b6be » steve
2004-12-11 Rework of internals to carry vectors through nexus instead
151
73e2b297 »
2008-06-03 Replace the NetPartSelect:BI with NetTran(VP).
152 assert(wid <= width);
153 width -= wid;
154 }
155 assert(width == 0);
65e9b6be » steve
2004-12-11 Rework of internals to carry vectors through nexus instead
156 }
157
a8b86ea3 » steve
2006-05-01 More explicit datatype setup.
158 osig->data_type(nets[0]->data_type());
cfd8cbf8 » steve
2002-11-09 Port expressions for output ports are lnets, not nets.
159 osig->local_flag(true);
160 return osig;
161 }
162
d26ae866 »
2008-03-18 Move implicit net creation from elaboration to elaborate_sig
163 NetNet* PEConcat::elaborate_lnet(Design*des, NetScope*scope) const
a2c036d5 » steve
2006-04-28 Allow concatenations as arguments to inout ports.
164 {
d26ae866 »
2008-03-18 Move implicit net creation from elaboration to elaborate_sig
165 return elaborate_lnet_common_(des, scope, false);
a2c036d5 » steve
2006-04-28 Allow concatenations as arguments to inout ports.
166 }
167
168 NetNet* PEConcat::elaborate_bi_net(Design*des, NetScope*scope) const
169 {
d26ae866 »
2008-03-18 Move implicit net creation from elaboration to elaborate_sig
170 return elaborate_lnet_common_(des, scope, true);
a2c036d5 » steve
2006-04-28 Allow concatenations as arguments to inout ports.
171 }
172
cfd8cbf8 » steve
2002-11-09 Port expressions for output ports are lnets, not nets.
173 /*
9e94afe3 » steve
2005-01-09 Use PartSelect/PV and VP to handle part selects through ports.
174 * This private method evaluates the part selects (if any) for the
175 * signal. The sig argument is the NetNet already located for the
176 * PEIdent name. The midx and lidx arguments are loaded with the
177 * results, which may be the whole vector, or a single bit, or
178 * anything in between. The values are in canonical indices.
179 */
180 bool PEIdent::eval_part_select_(Design*des, NetScope*scope, NetNet*sig,
dfb7bf52 »
2008-05-09 Handle part selects of nets that fall of the ends of the identifier.
181 long&midx, long&lidx) const
9e94afe3 » steve
2005-01-09 Use PartSelect/PV and VP to handle part selects through ports.
182 {
ddd36ecb » steve
2007-05-24 Rework the heirarchical identifier parse syntax and pform
183 const name_component_t&name_tail = path_.back();
184 // Only treat as part/bit selects any index that is beyond the
185 // word selects for an array. This is not an array, then
186 // dimensions==0 and any index is treated as a select.
187 if (name_tail.index.size() <= sig->array_dimensions()) {
188 midx = sig->vector_width()-1;
189 lidx = 0;
190 return true;
191 }
192
193 ivl_assert(*this, !name_tail.index.empty());
194
195 const index_component_t&index_tail = name_tail.index.back();
196
197 switch (index_tail.sel) {
c2ff3d50 » steve
2006-04-24 Fix support for indexed part select in continuous assign l-values.
198 default:
7975e14b »
2007-12-20 LineInfo uses perm_string for path.
199 cerr << get_fileline() << ": internal error: "
ddd36ecb » steve
2007-05-24 Rework the heirarchical identifier parse syntax and pform
200 << "Unexpected sel_ value = " << index_tail.sel << endl;
201 ivl_assert(*this, 0);
c2ff3d50 » steve
2006-04-24 Fix support for indexed part select in continuous assign l-values.
202 break;
9e94afe3 » steve
2005-01-09 Use PartSelect/PV and VP to handle part selects through ports.
203
ddd36ecb » steve
2007-05-24 Rework the heirarchical identifier parse syntax and pform
204 case index_component_t::SEL_IDX_DO:
205 case index_component_t::SEL_IDX_UP: {
46a22e9e »
2010-04-23 Make binary expressions use their tested width in self-determined con…
206 // These are not used, but they need to have a default value.
207 ivl_variable_type_t expr_type_tmp = IVL_VT_NO_TYPE;
208 bool unsized_flag_tmp = false;
209 index_tail.msb->test_width(des, scope,
210 integer_width, integer_width,
211 expr_type_tmp, unsized_flag_tmp);
944495b9 » caryr
2009-03-02 More constant function not supported warnings.
212 need_constant_expr = true;
ddd36ecb » steve
2007-05-24 Rework the heirarchical identifier parse syntax and pform
213 NetExpr*tmp_ex = elab_and_eval(des, scope, index_tail.msb, -1);
944495b9 » caryr
2009-03-02 More constant function not supported warnings.
214 need_constant_expr = false;
c2ff3d50 » steve
2006-04-24 Fix support for indexed part select in continuous assign l-values.
215 NetEConst*tmp = dynamic_cast<NetEConst*>(tmp_ex);
e26b9e72 » caryr
2007-11-07 More array fixes and down indexed part selects can be a lval.
216 if (!tmp) {
7975e14b »
2007-12-20 LineInfo uses perm_string for path.
217 cerr << get_fileline() << ": error: indexed part select of "
e26b9e72 » caryr
2007-11-07 More array fixes and down indexed part selects can be a lval.
218 << sig->name()
219 << " must be a constant in this context." << endl;
220 des->errors += 1;
221 return 0;
222 }
9e94afe3 » steve
2005-01-09 Use PartSelect/PV and VP to handle part selects through ports.
223
018f1a6e »
2007-07-02 Handle indexed part select in continuous assign.
224 /* The width (a constant) is calculated here. */
225 unsigned long wid = 0;
226 bool flag = calculate_up_do_width_(des, scope, wid);
2b17366a » caryr
2009-08-28 Major rewrite of indexed part selects.
227 if (! flag) return false;
228
229 /* We have an undefined index and that is out of range. */
230 if (! tmp->value().is_defined()) {
231 if (warn_ob_select) {
232 cerr << get_fileline() << ": warning: "
233 << sig->name();
234 if (sig->array_dimensions() > 0) cerr << "[]";
235 cerr << "['bx";
236 if (index_tail.sel ==
237 index_component_t::SEL_IDX_UP) {
238 cerr << "+:";
239 } else {
240 cerr << "-:";
241 }
242 cerr << wid << "] is always outside vector."
243 << endl;
244 }
018f1a6e »
2007-07-02 Handle indexed part select in continuous assign.
245 return false;
2b17366a » caryr
2009-08-28 Major rewrite of indexed part selects.
246 }
247
248 long midx_val = tmp->value().as_long();
249 midx = sig->sb_to_idx(midx_val);
250 delete tmp_ex;
c2ff3d50 » steve
2006-04-24 Fix support for indexed part select in continuous assign l-values.
251
ddd36ecb » steve
2007-05-24 Rework the heirarchical identifier parse syntax and pform
252 if (index_tail.sel == index_component_t::SEL_IDX_UP)
c2ff3d50 » steve
2006-04-24 Fix support for indexed part select in continuous assign l-values.
253 lidx = sig->sb_to_idx(midx_val+wid-1);
254 else
255 lidx = sig->sb_to_idx(midx_val-wid+1);
256
257 if (midx < lidx) {
3adcbb56 » ldoolitt
2008-10-13 Shadow reduction part 2
258 long tmpx = midx;
c2ff3d50 » steve
2006-04-24 Fix support for indexed part select in continuous assign l-values.
259 midx = lidx;
3adcbb56 » ldoolitt
2008-10-13 Shadow reduction part 2
260 lidx = tmpx;
c2ff3d50 » steve
2006-04-24 Fix support for indexed part select in continuous assign l-values.
261 }
262
b0e57a1a » caryr
2008-10-14 Ignore PS that are outside the signal and allow PS to extend past the…
263 /* Warn about an indexed part select that is out of range. */
2b17366a » caryr
2009-08-28 Major rewrite of indexed part selects.
264 if (warn_ob_select && (lidx < 0)) {
265 cerr << get_fileline() << ": warning: " << sig->name();
266 if (sig->array_dimensions() > 0) cerr << "[]";
267 cerr << "[" << midx_val;
268 if (index_tail.sel == index_component_t::SEL_IDX_UP) {
269 cerr << "+:";
270 } else {
271 cerr << "-:";
272 }
273 cerr << wid << "] is selecting before vector." << endl;
274 }
275 if (warn_ob_select && (midx >= (long)sig->vector_width())) {
276 cerr << get_fileline() << ": warning: " << sig->name();
b0e57a1a » caryr
2008-10-14 Ignore PS that are outside the signal and allow PS to extend past the…
277 if (sig->array_dimensions() > 0) {
278 cerr << "[]";
279 }
280 cerr << "[" << midx_val;
281 if (index_tail.sel == index_component_t::SEL_IDX_UP) {
282 cerr << "+:";
283 } else {
284 cerr << "-:";
285 }
2b17366a » caryr
2009-08-28 Major rewrite of indexed part selects.
286 cerr << wid << "] is selecting after vector." << endl;
b0e57a1a » caryr
2008-10-14 Ignore PS that are outside the signal and allow PS to extend past the…
287 }
288
289 /* This is completely out side the signal so just skip it. */
290 if (lidx >= (long)sig->vector_width() || midx < 0) {
291 return false;
292 }
293
c2ff3d50 » steve
2006-04-24 Fix support for indexed part select in continuous assign l-values.
294 break;
295 }
296
ddd36ecb » steve
2007-05-24 Rework the heirarchical identifier parse syntax and pform
297 case index_component_t::SEL_PART: {
c2ff3d50 » steve
2006-04-24 Fix support for indexed part select in continuous assign l-values.
298
018f1a6e »
2007-07-02 Handle indexed part select in continuous assign.
299 long msb, lsb;
b45834f0 »
2009-01-01 Handle part selects with bad (xz) bits.
300 bool part_defined_flag;
301 /* bool flag = */ calculate_parts_(des, scope, msb, lsb, part_defined_flag);
302 ivl_assert(*this, part_defined_flag);
c2ff3d50 » steve
2006-04-24 Fix support for indexed part select in continuous assign l-values.
303
dfb7bf52 »
2008-05-09 Handle part selects of nets that fall of the ends of the identifier.
304 long lidx_tmp = sig->sb_to_idx(lsb);
305 long midx_tmp = sig->sb_to_idx(msb);
c2ff3d50 » steve
2006-04-24 Fix support for indexed part select in continuous assign l-values.
306 /* Detect reversed indices of a part select. */
dfb7bf52 »
2008-05-09 Handle part selects of nets that fall of the ends of the identifier.
307 if (lidx_tmp > midx_tmp) {
7975e14b »
2007-12-20 LineInfo uses perm_string for path.
308 cerr << get_fileline() << ": error: Part select "
018f1a6e »
2007-07-02 Handle indexed part select in continuous assign.
309 << sig->name() << "[" << msb << ":"
310 << lsb << "] indices reversed." << endl;
7975e14b »
2007-12-20 LineInfo uses perm_string for path.
311 cerr << get_fileline() << ": : Did you mean "
018f1a6e »
2007-07-02 Handle indexed part select in continuous assign.
312 << sig->name() << "[" << lsb << ":"
313 << msb << "]?" << endl;
dfb7bf52 »
2008-05-09 Handle part selects of nets that fall of the ends of the identifier.
314 long tmp = midx_tmp;
315 midx_tmp = lidx_tmp;
316 lidx_tmp = tmp;
c2ff3d50 » steve
2006-04-24 Fix support for indexed part select in continuous assign l-values.
317 des->errors += 1;
318 }
319
b0e57a1a » caryr
2008-10-14 Ignore PS that are outside the signal and allow PS to extend past the…
320 /* Warn about a part select that is out of range. */
dfb7bf52 »
2008-05-09 Handle part selects of nets that fall of the ends of the identifier.
321 if (midx_tmp >= (long)sig->vector_width() || lidx_tmp < 0) {
322 cerr << get_fileline() << ": warning: Part select "
b0e57a1a » caryr
2008-10-14 Ignore PS that are outside the signal and allow PS to extend past the…
323 << sig->name();
324 if (sig->array_dimensions() > 0) {
325 cerr << "[]";
326 }
327 cerr << "[" << msb << ":" << lsb
328 << "] is out of range." << endl;
dfb7bf52 »
2008-05-09 Handle part selects of nets that fall of the ends of the identifier.
329 #if 0
330 midx_tmp = sig->vector_width() - 1;
331 lidx_tmp = 0;
c2ff3d50 » steve
2006-04-24 Fix support for indexed part select in continuous assign l-values.
332 des->errors += 1;
dfb7bf52 »
2008-05-09 Handle part selects of nets that fall of the ends of the identifier.
333 #endif
c2ff3d50 » steve
2006-04-24 Fix support for indexed part select in continuous assign l-values.
334 }
b0e57a1a » caryr
2008-10-14 Ignore PS that are outside the signal and allow PS to extend past the…
335 /* This is completely out side the signal so just skip it. */
336 if (lidx_tmp >= (long)sig->vector_width() || midx_tmp < 0) {
337 return false;
338 }
dfb7bf52 »
2008-05-09 Handle part selects of nets that fall of the ends of the identifier.
339
340 midx = midx_tmp;
341 lidx = lidx_tmp;
c2ff3d50 » steve
2006-04-24 Fix support for indexed part select in continuous assign l-values.
342 break;
343 }
344
ddd36ecb » steve
2007-05-24 Rework the heirarchical identifier parse syntax and pform
345 case index_component_t::SEL_BIT:
346 if (name_tail.index.size() > sig->array_dimensions()) {
129a064e » steve
2007-06-04 Handle bit/part select of array words in nets.
347 verinum*mval = index_tail.msb->eval_const(des, scope);
c2ff3d50 » steve
2006-04-24 Fix support for indexed part select in continuous assign l-values.
348 if (mval == 0) {
7975e14b »
2007-12-20 LineInfo uses perm_string for path.
349 cerr << get_fileline() << ": error: Index of " << path_ <<
c2ff3d50 » steve
2006-04-24 Fix support for indexed part select in continuous assign l-values.
350 " needs to be constant in this context." <<
351 endl;
7975e14b »
2007-12-20 LineInfo uses perm_string for path.
352 cerr << get_fileline() << ": : Index expression is: "
129a064e » steve
2007-06-04 Handle bit/part select of array words in nets.
353 << *index_tail.msb << endl;
7975e14b »
2007-12-20 LineInfo uses perm_string for path.
354 cerr << get_fileline() << ": : Context scope is: "
8ec6d998 » steve
2007-06-12 Put instantiated modules in the proper generated scope.
355 << scope_path(scope) << endl;
c2ff3d50 » steve
2006-04-24 Fix support for indexed part select in continuous assign l-values.
356 des->errors += 1;
357 return false;
358 }
359 assert(mval);
360
361 midx = sig->sb_to_idx(mval->as_long());
dfb7bf52 »
2008-05-09 Handle part selects of nets that fall of the ends of the identifier.
362 if (midx >= (long)sig->vector_width()) {
7975e14b »
2007-12-20 LineInfo uses perm_string for path.
363 cerr << get_fileline() << ": error: Index " << sig->name()
b0e57a1a » caryr
2008-10-14 Ignore PS that are outside the signal and allow PS to extend past the…
364 << "[" << mval->as_long() << "] is out of range."
c2ff3d50 » steve
2006-04-24 Fix support for indexed part select in continuous assign l-values.
365 << endl;
366 des->errors += 1;
367 midx = 0;
368 }
369 lidx = midx;
370
371 } else {
7975e14b »
2007-12-20 LineInfo uses perm_string for path.
372 cerr << get_fileline() << ": internal error: "
ddd36ecb » steve
2007-05-24 Rework the heirarchical identifier parse syntax and pform
373 << "Bit select " << path_ << endl;
374 ivl_assert(*this, 0);
c2ff3d50 » steve
2006-04-24 Fix support for indexed part select in continuous assign l-values.
375 midx = sig->vector_width() - 1;
376 lidx = 0;
377 }
378 break;
9e94afe3 » steve
2005-01-09 Use PartSelect/PV and VP to handle part selects through ports.
379 }
380
381 return true;
382 }
383
384 /*
4a8be3db » steve
2005-08-06 Implement bi-directional part selects.
385 * This is the common code for l-value nets and bi-directional
386 * nets. There is very little that is different between the two cases,
387 * so most of the work for both is done here.
a81dcd79 » steve
1999-11-21 Support memories in continuous assignments.
388 */
4a8be3db » steve
2005-08-06 Implement bi-directional part selects.
389 NetNet* PEIdent::elaborate_lnet_common_(Design*des, NetScope*scope,
390 bool bidirectional_flag) const
a81dcd79 » steve
1999-11-21 Support memories in continuous assignments.
391 {
69379455 » steve
2003-09-19 Remove find_memory method from Design class.
392 assert(scope);
393
394 NetNet* sig = 0;
395 const NetExpr*par = 0;
396 NetEvent* eve = 0;
397
18edf2f1 » Martin Whitaker
2008-10-28 Rework of automatic task/function support.
398 symbol_search(this, des, scope, path_, sig, par, eve);
69379455 » steve
2003-09-19 Remove find_memory method from Design class.
399
400 if (eve != 0) {
7975e14b »
2007-12-20 LineInfo uses perm_string for path.
401 cerr << get_fileline() << ": error: named events (" << path_
69379455 » steve
2003-09-19 Remove find_memory method from Design class.
402 << ") cannot be l-values in continuous "
403 << "assignments." << endl;
404 des->errors += 1;
405 return 0;
406 }
407
a81dcd79 » steve
1999-11-21 Support memories in continuous assignments.
408 if (sig == 0) {
d26ae866 »
2008-03-18 Move implicit net creation from elaboration to elaborate_sig
409 cerr << get_fileline() << ": error: Net " << path_
410 << " is not defined in this context." << endl;
411 des->errors += 1;
412 return 0;
a81dcd79 » steve
1999-11-21 Support memories in continuous assignments.
413 }
414
415 assert(sig);
416
568ee443 »
2010-10-07 Allow variables to implicitly convert to unresolved nets.
417 /* If this is SystemVerilog and the variable is not yet
418 assigned by anything, then convert it to an unresolved
419 wire. */
420 if (gn_var_can_be_uwire()
421 && (sig->type() == NetNet::REG)
422 && (sig->peek_eref() == 0) ) {
423 sig->type(NetNet::UNRESOLVED_WIRE);
424 }
425
426 if (sig->type() == NetNet::UNRESOLVED_WIRE && sig->pin(0).is_linked()) {
427 cerr << get_fileline() << ": error: Unresolved net " << sig->name()
428 << " cannot have multiple drivers." << endl;
429 des->errors += 1;
430 return 0;
431 }
432
a81dcd79 » steve
1999-11-21 Support memories in continuous assignments.
433 /* Don't allow registers as assign l-values. */
434 if (sig->type() == NetNet::REG) {
7975e14b »
2007-12-20 LineInfo uses perm_string for path.
435 cerr << get_fileline() << ": error: reg " << sig->name()
c96598a4 » steve
2003-08-05 Primitive outputs have same limitations as continuous assignment.
436 << "; cannot be driven by primitives"
437 << " or continuous assignment." << endl;
438 des->errors += 1;
a81dcd79 » steve
1999-11-21 Support memories in continuous assignments.
439 return 0;
440 }
441
4d0b840c » steve
2001-11-10 Coerse input to inout when assigned to.
442 if (sig->port_type() == NetNet::PINPUT) {
443 sig->port_type(NetNet::PINOUT);
69f3219f »
2009-12-09 Suppress redundant warning messages about input coerced to inout
444 // This map mask prevents an error message being
445 // repeated endlessly.
446 static map<string,bool> mask_map;
447 bool&flag = mask_map[sig->get_fileline() + ":" + string(sig->name())];
448 if (! flag) {
449 cerr << get_fileline() << ": warning: L-value ``"
450 << sig->name() << "'' is also an input port." << endl;
451 cerr << sig->get_fileline() << ": warning: input "
452 << sig->name() << "; is coerced to inout." << endl;
453 flag = true;
454 }
4d0b840c » steve
2001-11-10 Coerse input to inout when assigned to.
455 }
456
91d84e7d » steve
2007-01-16 Major rework of array handling. Memories are replaced with the
457 // Default part select is the entire word.
458 unsigned midx = sig->vector_width()-1, lidx = 0;
459 // The default word select is the first.
c9f6bd68 » caryr
2009-07-03 Add compiler warnings for more constant out of bounds array accesses.
460 long widx = 0;
37b11e03 »
2009-08-06 Fix index out of bounds error message.
461 // The widx_val is the word select as entered in the source
462 // code. It's used for error messages.
463 long widx_val = 0;
91d84e7d » steve
2007-01-16 Major rework of array handling. Memories are replaced with the
464
ddd36ecb » steve
2007-05-24 Rework the heirarchical identifier parse syntax and pform
465 const name_component_t&name_tail = path_.back();
466
91d84e7d » steve
2007-01-16 Major rework of array handling. Memories are replaced with the
467 if (sig->array_dimensions() > 0) {
468
e26b9e72 » caryr
2007-11-07 More array fixes and down indexed part selects can be a lval.
469 if (name_tail.index.empty()) {
7975e14b »
2007-12-20 LineInfo uses perm_string for path.
470 cerr << get_fileline() << ": error: array " << sig->name()
e26b9e72 » caryr
2007-11-07 More array fixes and down indexed part selects can be a lval.
471 << " must be used with an index." << endl;
472 des->errors += 1;
473 return 0;
474 }
ddd36ecb » steve
2007-05-24 Rework the heirarchical identifier parse syntax and pform
475
476 const index_component_t&index_head = name_tail.index.front();
e39b3fea » caryr
2007-11-06 Display a warning for a part select of an array.
477 if (index_head.sel == index_component_t::SEL_PART) {
7975e14b »
2007-12-20 LineInfo uses perm_string for path.
478 cerr << get_fileline() << ": error: cannot perform a part "
e39b3fea » caryr
2007-11-06 Display a warning for a part select of an array.
479 << "select on array " << sig->name() << "." << endl;
480 des->errors += 1;
481 return 0;
482 }
ddd36ecb » steve
2007-05-24 Rework the heirarchical identifier parse syntax and pform
483 ivl_assert(*this, index_head.sel == index_component_t::SEL_BIT);
484
c9f6bd68 » caryr
2009-07-03 Add compiler warnings for more constant out of bounds array accesses.
485 // These are not used, but they need to have a default value.
486 ivl_variable_type_t expr_type_tmp = IVL_VT_NO_TYPE;
487 bool unsized_flag_tmp = false;
488 index_head.msb->test_width(des, scope,
489 integer_width, integer_width,
490 expr_type_tmp, unsized_flag_tmp);
944495b9 » caryr
2009-03-02 More constant function not supported warnings.
491 need_constant_expr = true;
ddd36ecb » steve
2007-05-24 Rework the heirarchical identifier parse syntax and pform
492 NetExpr*tmp_ex = elab_and_eval(des, scope, index_head.msb, -1);
944495b9 » caryr
2009-03-02 More constant function not supported warnings.
493 need_constant_expr = false;
91d84e7d » steve
2007-01-16 Major rework of array handling. Memories are replaced with the
494 NetEConst*tmp = dynamic_cast<NetEConst*>(tmp_ex);
51293b6e » caryr
2007-11-06 Fix/enhance array part select code.
495 if (!tmp) {
7975e14b »
2007-12-20 LineInfo uses perm_string for path.
496 cerr << get_fileline() << ": error: array " << sig->name()
51293b6e » caryr
2007-11-06 Fix/enhance array part select code.
497 << " index must be a constant in this context." << endl;
498 des->errors += 1;
499 return 0;
500 }
91d84e7d » steve
2007-01-16 Major rework of array handling. Memories are replaced with the
501
37b11e03 »
2009-08-06 Fix index out of bounds error message.
502 widx_val = tmp->value().as_long();
503 if (sig->array_index_is_valid(widx_val))
504 widx = sig->array_index_to_address(widx_val);
505 else
506 widx = -1;
91d84e7d » steve
2007-01-16 Major rework of array handling. Memories are replaced with the
507 delete tmp_ex;
508
509 if (debug_elaborate)
7975e14b »
2007-12-20 LineInfo uses perm_string for path.
510 cerr << get_fileline() << ": debug: Use [" << widx << "]"
91d84e7d » steve
2007-01-16 Major rework of array handling. Memories are replaced with the
511 << " to index l-value array." << endl;
512
51293b6e » caryr
2007-11-06 Fix/enhance array part select code.
513 /* The array has a part/bit select at the end. */
e26b9e72 » caryr
2007-11-07 More array fixes and down indexed part selects can be a lval.
514 if (name_tail.index.size() > sig->array_dimensions()) {
b1dd0b1f » caryr
2009-04-14 It is an error to select part of a scalar value.
515 if (sig->get_scalar()) {
ec49f10e »
2010-10-02 Revert bad merge from vhdl branch
516 cerr << get_fileline() << ": error: "
b1dd0b1f » caryr
2009-04-14 It is an error to select part of a scalar value.
517 << "can not select part of ";
518 if (sig->data_type() == IVL_VT_REAL) cerr << "real";
519 else cerr << "scalar";
520 cerr << " array word: " << sig->name()
521 << "[" << widx_val << "]" << endl;
5852f1eb » caryr
2009-04-01 Report an error when trying to take the select of a real value.
522 des->errors += 1;
523 return 0;
524 }
525
dfb7bf52 »
2008-05-09 Handle part selects of nets that fall of the ends of the identifier.
526 long midx_tmp, lidx_tmp;
527 if (! eval_part_select_(des, scope, sig, midx_tmp, lidx_tmp))
51293b6e » caryr
2007-11-06 Fix/enhance array part select code.
528 return 0;
b0e57a1a » caryr
2008-10-14 Ignore PS that are outside the signal and allow PS to extend past the…
529
530 if (lidx_tmp < 0) {
ec49f10e »
2010-10-02 Revert bad merge from vhdl branch
531 cerr << get_fileline() << ": sorry: part selects "
b0e57a1a » caryr
2008-10-14 Ignore PS that are outside the signal and allow PS to extend past the…
532 "straddling the start of signal (" << path_
533 << ") are not currently supported." << endl;
534 des->errors += 1;
535 return 0;
536 }
dfb7bf52 »
2008-05-09 Handle part selects of nets that fall of the ends of the identifier.
537 midx = midx_tmp;
538 lidx = lidx_tmp;
51293b6e » caryr
2007-11-06 Fix/enhance array part select code.
539 }
ddd36ecb » steve
2007-05-24 Rework the heirarchical identifier parse syntax and pform
540 } else if (!name_tail.index.empty()) {
b1dd0b1f » caryr
2009-04-14 It is an error to select part of a scalar value.
541 if (sig->get_scalar()) {
ec49f10e »
2010-10-02 Revert bad merge from vhdl branch
542 cerr << get_fileline() << ": error: "
b1dd0b1f » caryr
2009-04-14 It is an error to select part of a scalar value.
543 << "can not select part of ";
544 if (sig->data_type() == IVL_VT_REAL) cerr << "real: ";
545 else cerr << "scalar: ";
546 cerr << sig->name() << endl;
5852f1eb » caryr
2009-04-01 Report an error when trying to take the select of a real value.
547 des->errors += 1;
548 return 0;
549 }
550
dfb7bf52 »
2008-05-09 Handle part selects of nets that fall of the ends of the identifier.
551 long midx_tmp, lidx_tmp;
552 if (! eval_part_select_(des, scope, sig, midx_tmp, lidx_tmp))
91d84e7d » steve
2007-01-16 Major rework of array handling. Memories are replaced with the
553 return 0;
dfb7bf52 »
2008-05-09 Handle part selects of nets that fall of the ends of the identifier.
554
b0e57a1a » caryr
2008-10-14 Ignore PS that are outside the signal and allow PS to extend past the…
555 if (lidx_tmp < 0) {
ec49f10e »
2010-10-02 Revert bad merge from vhdl branch
556 cerr << get_fileline() << ": sorry: part selects "
b0e57a1a » caryr
2008-10-14 Ignore PS that are outside the signal and allow PS to extend past the…
557 "straddling the start of signal (" << path_
558 << ") are not currently supported." << endl;
559 des->errors += 1;
560 return 0;
561 }
dfb7bf52 »
2008-05-09 Handle part selects of nets that fall of the ends of the identifier.
562 midx = midx_tmp;
563 lidx = lidx_tmp;
91d84e7d » steve
2007-01-16 Major rework of array handling. Memories are replaced with the
564 }
4eed86d5 » steve
2000-12-01 Detect part select errors on l-values.
565
9e94afe3 » steve
2005-01-09 Use PartSelect/PV and VP to handle part selects through ports.
566 unsigned subnet_wid = midx-lidx+1;
567
91d84e7d » steve
2007-01-16 Major rework of array handling. Memories are replaced with the
568 if (sig->pin_count() > 1) {
c9f6bd68 » caryr
2009-07-03 Add compiler warnings for more constant out of bounds array accesses.
569 if (widx < 0 || widx >= (long) sig->pin_count()) {
570 cerr << get_fileline() << ": warning: ignoring out of "
571 "bounds l-value array access "
37b11e03 »
2009-08-06 Fix index out of bounds error message.
572 << sig->name() << "[" << widx_val << "]." << endl;
c9f6bd68 » caryr
2009-07-03 Add compiler warnings for more constant out of bounds array accesses.
573 return 0;
574 }
91d84e7d » steve
2007-01-16 Major rework of array handling. Memories are replaced with the
575
576 NetNet*tmp = new NetNet(scope, scope->local_symbol(),
577 sig->type(), sig->vector_width());
578 tmp->set_line(*this);
579 tmp->local_flag(true);
4919b70d »
2008-09-25 Give l-value nets their proper type.
580 tmp->data_type( sig->data_type() );
91d84e7d » steve
2007-01-16 Major rework of array handling. Memories are replaced with the
581 connect(sig->pin(widx), tmp->pin(0));
582 sig = tmp;
583 }
584
9e94afe3 » steve
2005-01-09 Use PartSelect/PV and VP to handle part selects through ports.
585 /* If the desired l-value vector is narrower then the
586 signal itself, then use a NetPartSelect node to
587 arrange for connection to the desired bits. All this
588 can be skipped if the desired with matches the
589 original vector. */
590
591 if (subnet_wid != sig->vector_width()) {
4a8be3db » steve
2005-08-06 Implement bi-directional part selects.
592 /* If we are processing a tran or inout, then the
593 partselect is bi-directional. Otherwise, it is a
594 Part-to-Vector select. */
595
9e94afe3 » steve
2005-01-09 Use PartSelect/PV and VP to handle part selects through ports.
596 if (debug_elaborate)
7975e14b »
2007-12-20 LineInfo uses perm_string for path.
597 cerr << get_fileline() << ": debug: "
9e94afe3 » steve
2005-01-09 Use PartSelect/PV and VP to handle part selects through ports.
598 << "Elaborate lnet part select "
599 << sig->name()
600 << "[base=" << lidx
601 << " wid=" << subnet_wid <<"]"
602 << endl;
a81dcd79 » steve
1999-11-21 Support memories in continuous assignments.
603
9e94afe3 » steve
2005-01-09 Use PartSelect/PV and VP to handle part selects through ports.
604 NetNet*subsig = new NetNet(sig->scope(),
605 sig->scope()->local_symbol(),
606 NetNet::WIRE, subnet_wid);
9a16e030 » steve
2005-07-15 Match data type of PV select input/output.
607 subsig->data_type( sig->data_type() );
326329d4 » steve
2007-02-05 Set some missing local flags.
608 subsig->local_flag(true);
609 subsig->set_line(*this);
a81dcd79 » steve
1999-11-21 Support memories in continuous assignments.
610
73e2b297 »
2008-06-03 Replace the NetPartSelect:BI with NetTran(VP).
611 if (bidirectional_flag) {
612 // Make a tran(VP)
613 NetTran*sub = new NetTran(scope, scope->local_symbol(),
614 sig->vector_width(),
615 subnet_wid, lidx);
616 sub->set_line(*this);
617 des->add_node(sub);
618 connect(sub->pin(0), sig->pin(0));
619 connect(sub->pin(1), subsig->pin(0));
cd940197 » steve
2002-06-19 Remove NetTmp and add NetSubnet class.
620
73e2b297 »
2008-06-03 Replace the NetPartSelect:BI with NetTran(VP).
621 } else {
622 NetPartSelect*sub = new NetPartSelect(sig, lidx, subnet_wid,
623 NetPartSelect::PV);
624 des->add_node(sub);
625 sub->set_line(*this);
626 connect(sub->pin(0), subsig->pin(0));
627 }
9e94afe3 » steve
2005-01-09 Use PartSelect/PV and VP to handle part selects through ports.
628 sig = subsig;
a81dcd79 » steve
1999-11-21 Support memories in continuous assignments.
629 }
630
631 return sig;
632 }
633
206b37e5 » steve
1999-11-05 Fix NetConst being set to zero width, and clean
634 /*
4a8be3db » steve
2005-08-06 Implement bi-directional part selects.
635 * Identifiers in continuous assignment l-values are limited to wires
636 * and that ilk. Detect registers and memories here and report errors.
637 */
d26ae866 »
2008-03-18 Move implicit net creation from elaboration to elaborate_sig
638 NetNet* PEIdent::elaborate_lnet(Design*des, NetScope*scope) const
4a8be3db » steve
2005-08-06 Implement bi-directional part selects.
639 {
d26ae866 »
2008-03-18 Move implicit net creation from elaboration to elaborate_sig
640 return elaborate_lnet_common_(des, scope, false);
4a8be3db » steve
2005-08-06 Implement bi-directional part selects.
641 }
642
643 NetNet* PEIdent::elaborate_bi_net(Design*des, NetScope*scope) const
644 {
d26ae866 »
2008-03-18 Move implicit net creation from elaboration to elaborate_sig
645 return elaborate_lnet_common_(des, scope, true);
4a8be3db » steve
2005-08-06 Implement bi-directional part selects.
646 }
647
648 /*
3676d664 » steve
2000-05-16 Module ports are really special PEIdent
649 * This method is used to elaborate identifiers that are ports to a
650 * scope. The scope is presumed to be that of the module that has the
9e94afe3 » steve
2005-01-09 Use PartSelect/PV and VP to handle part selects through ports.
651 * port. This elaboration is done inside the module, and is only done
652 * to PEIdent objects. This method is used by elaboration of a module
653 * instantiation (PGModule::elaborate_mod_) to get NetNet objects for
654 * the port.
3676d664 » steve
2000-05-16 Module ports are really special PEIdent
655 */
656 NetNet* PEIdent::elaborate_port(Design*des, NetScope*scope) const
657 {
ab6c8cb4 » steve
2001-12-03 Parser and pform use hierarchical names as hname_t
658 NetNet*sig = des->find_signal(scope, path_);
3676d664 » steve
2000-05-16 Module ports are really special PEIdent
659 if (sig == 0) {
7975e14b »
2007-12-20 LineInfo uses perm_string for path.
660 cerr << get_fileline() << ": error: no wire/reg " << path_
c7d97f41 » steve
2007-06-02 Properly evaluate scope path expressions.
661 << " in module " << scope_path(scope) << "." << endl;
3676d664 » steve
2000-05-16 Module ports are really special PEIdent
662 des->errors += 1;
663 return 0;
664 }
665
9e94afe3 » steve
2005-01-09 Use PartSelect/PV and VP to handle part selects through ports.
666 /* Check the port_type of the signal to make sure it is really
667 a port, and its direction is resolved. */
a59bbdeb » steve
2000-08-18 Proper error messages when port direction is missing.
668 switch (sig->port_type()) {
669 case NetNet::PINPUT:
670 case NetNet::POUTPUT:
671 case NetNet::PINOUT:
672 break;
673
674 /* If the name matches, but the signal is not a port,
675 then the user declared the object but there is no
676 matching input/output/inout declaration. */
677
678 case NetNet::NOT_A_PORT:
7975e14b »
2007-12-20 LineInfo uses perm_string for path.
679 cerr << get_fileline() << ": error: signal " << path_ << " in"
c7d97f41 » steve
2007-06-02 Properly evaluate scope path expressions.
680 << " module " << scope_path(scope) << " is not a port." << endl;
7975e14b »
2007-12-20 LineInfo uses perm_string for path.
681 cerr << get_fileline() << ": : Are you missing an input/"
a59bbdeb » steve
2000-08-18 Proper error messages when port direction is missing.
682 << "output/inout declaration?" << endl;
683 des->errors += 1;
684 return 0;
685
686 /* This should not happen. A PWire can only become
1ff31db2 » caryr
2008-01-15 Add real comparisons in continuous assignments.
687 PIMPLICIT if this is a UDP reg port, and the make_udp
a59bbdeb » steve
2000-08-18 Proper error messages when port direction is missing.
688 function should turn it into an output.... I think. */
689
690 case NetNet::PIMPLICIT:
7975e14b »
2007-12-20 LineInfo uses perm_string for path.
691 cerr << get_fileline() << ": internal error: signal " << path_
c7d97f41 » steve
2007-06-02 Properly evaluate scope path expressions.
692 << " in module " << scope_path(scope) << " is left as "
a59bbdeb » steve
2000-08-18 Proper error messages when port direction is missing.
693 << "port type PIMPLICIT." << endl;
694 des->errors += 1;
695 return 0;
696 }
697
dfb7bf52 »
2008-05-09 Handle part selects of nets that fall of the ends of the identifier.
698 long midx;
699 long lidx;
3676d664 » steve
2000-05-16 Module ports are really special PEIdent
700
9e94afe3 » steve
2005-01-09 Use PartSelect/PV and VP to handle part selects through ports.
701 /* Evaluate the part/bit select expressions, to get the part
702 select of the signal that attaches to the port. Also handle
703 range and direction checking here. */
3676d664 » steve
2000-05-16 Module ports are really special PEIdent
704
9e94afe3 » steve
2005-01-09 Use PartSelect/PV and VP to handle part selects through ports.
705 if (! eval_part_select_(des, scope, sig, midx, lidx))
706 return 0;
cd940197 » steve
2002-06-19 Remove NetTmp and add NetSubnet class.
707
f7ee3fe1 »
2008-12-11 Fix elaboration of part-select ports.
708 /* If this is a part select of the entire signal (or no part
709 select at all) then we're done. */
710 if ((lidx == 0) && (midx == (long)sig->vector_width()-1))
711 return sig;
712
713 unsigned swid = abs(midx - lidx) + 1;
714 ivl_assert(*this, swid > 0 && swid < sig->vector_width());
715
716 NetNet*tmp = new NetNet(scope, scope->local_symbol(),
717 NetNet::WIRE, swid);
718 tmp->port_type(sig->port_type());
719 tmp->data_type(sig->data_type());
720 tmp->set_line(*this);
721 NetNode*ps = 0;
722 switch (sig->port_type()) {
723
724 case NetNet::PINPUT:
725 ps = new NetPartSelect(sig, sig->sb_to_idx(lidx), swid,
726 NetPartSelect::PV);
727 connect(tmp->pin(0), ps->pin(0));
728 sig = tmp;
729 break;
730
731 case NetNet::POUTPUT:
732 ps = new NetPartSelect(sig, sig->sb_to_idx(lidx), swid,
733 NetPartSelect::VP);
734 connect(tmp->pin(0), ps->pin(0));
735 sig = tmp;
736 break;
3676d664 » steve
2000-05-16 Module ports are really special PEIdent
737
f7ee3fe1 »
2008-12-11 Fix elaboration of part-select ports.
738 case NetNet::PINOUT:
739 ps = new NetTran(scope, scope->local_symbol(), sig->vector_width(),
740 swid, sig->sb_to_idx(lidx));
741 connect(sig->pin(0), ps->pin(0));
742 connect(tmp->pin(0), ps->pin(1));
743 sig = tmp;
744 break;
3676d664 » steve
2000-05-16 Module ports are really special PEIdent
745
f7ee3fe1 »
2008-12-11 Fix elaboration of part-select ports.
746 default:
747 ivl_assert(*this, 0);
748 break;
3676d664 » steve
2000-05-16 Module ports are really special PEIdent
749 }
750
f7ee3fe1 »
2008-12-11 Fix elaboration of part-select ports.
751 ps->set_line(*this);
752 des->add_node(ps);
753
3676d664 » steve
2000-05-16 Module ports are really special PEIdent
754 return sig;
755 }
Something went wrong with that request. Please try again.