2 * Copyright (c) 1999-2006 Stephen Williams (steve@icarus.com)
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)
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.
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
20 #ident "$Id: elab_expr.cc,v 1.126 2007/06/02 03:42:12 steve Exp $"
24 # include "compiler.h"
30 # include "ivl_assert.h"
33 * The default behavor for the test_width method is to just return the
34 * minimum width that is passed in.
36 unsigned PExpr::test_width(Design
*des
, NetScope
*scope
,
37 unsigned min
, unsigned lval
, bool&) const
39 if (debug_elaborate
) {
40 cerr
<< get_line() << ": debug: test_width defaults to "
41 << min
<< ", ignoring unsized_flag" << endl
;
46 NetExpr
* PExpr::elaborate_expr(Design
*des
, NetScope
*, int, bool) const
48 cerr
<< get_line() << ": internal error: I do not know how to elaborate"
49 << " expression. " << endl
;
50 cerr
<< get_line() << ": : Expression is: " << *this
56 unsigned PEBinary::test_width(Design
*des
, NetScope
*scope
,
57 unsigned min
, unsigned lval
, bool&unsized_flag
) const
59 bool flag_left
= false;
60 bool flag_right
= false;
61 unsigned wid_left
= left_
->test_width(des
,scope
, min
, lval
, flag_left
);
62 unsigned wid_right
= right_
->test_width(des
,scope
, min
, lval
, flag_right
);
64 if (flag_left
|| flag_right
)
78 if (lval
> 0 && min
> lval
)
94 * Elaborate binary expressions. This involves elaborating the left
95 * and right sides, and creating one of a variety of different NetExpr
98 NetEBinary
* PEBinary::elaborate_expr(Design
*des
, NetScope
*scope
,
99 int expr_wid
, bool) const
104 NetExpr
*lp
= left_
->elaborate_expr(des
, scope
, expr_wid
, false);
105 NetExpr
*rp
= right_
->elaborate_expr(des
, scope
, expr_wid
, false);
106 if ((lp
== 0) || (rp
== 0)) {
112 NetEBinary
*tmp
= elaborate_eval_expr_base_(des
, lp
, rp
, expr_wid
);
116 NetEBinary
* PEBinary::elaborate_eval_expr_base_(Design
*des
,
121 /* If either expression can be evaluated ahead of time, then
122 do so. This can prove helpful later. */
124 tmp
= lp
->eval_tree();
130 tmp
= rp
->eval_tree();
137 return elaborate_expr_base_(des
, lp
, rp
, expr_wid
);
141 * This is common elaboration of the operator. It presumes that the
142 * operands are elaborated as necessary, and all I need to do is make
143 * the correct NetEBinary object and connect the parameters.
145 NetEBinary
* PEBinary::elaborate_expr_base_(Design
*des
,
146 NetExpr
*lp
, NetExpr
*rp
,
155 tmp
= new NetEBinary(op_
, lp
, rp
);
156 tmp
->set_line(*this);
161 tmp
= new NetEBLogic(op_
, lp
, rp
);
162 tmp
->set_line(*this);
166 tmp
= new NetEBPow(op_
, lp
, rp
);
167 tmp
->set_line(*this);
171 tmp
= new NetEBMult(op_
, lp
, rp
);
172 tmp
->set_line(*this);
176 /* The % operator does not support real arguments in
177 baseline Verilog. But we allow it in our extended
179 if (generation_flag
< GN_VER2001X
) {
180 if (lp
->expr_type()==IVL_VT_REAL
|| rp
->expr_type()==IVL_VT_REAL
) {
181 cerr
<< get_line() << ": error: Modulus operator may not "
182 "have REAL operands." << endl
;
186 /* Fall through to handle the % with the / operator. */
188 tmp
= new NetEBDiv(op_
, lp
, rp
);
189 tmp
->set_line(*this);
195 tmp
= new NetEBShift(op_
, lp
, rp
);
196 tmp
->set_line(*this);
202 case 'O': // NOR (~|)
203 case 'A': // NAND (~&)
205 tmp
= new NetEBBits(op_
, lp
, rp
);
206 tmp
->set_line(*this);
211 tmp
= new NetEBAdd(op_
, lp
, rp
, expr_wid
==-2? true : false);
212 if (expr_wid
> 0 && (tmp
->expr_type() == IVL_VT_BOOL
213 || tmp
->expr_type() == IVL_VT_LOGIC
))
214 tmp
->set_width(expr_wid
);
215 tmp
->set_line(*this);
220 if (lp
->expr_type() == IVL_VT_REAL
221 || rp
->expr_type() == IVL_VT_REAL
) {
222 cerr
<< get_line() << ": error: Case equality may not "
223 << "have real operands." << endl
;
226 /* Fall through... */
229 if (dynamic_cast<NetEConst
*>(rp
)
230 && (lp
->expr_width() > rp
->expr_width()))
231 rp
->set_width(lp
->expr_width());
233 if (dynamic_cast<NetEConst
*>(lp
)
234 && (lp
->expr_width() < rp
->expr_width()))
235 lp
->set_width(rp
->expr_width());
237 /* from here, handle this like other compares. */
242 tmp
= new NetEBComp(op_
, lp
, rp
);
243 tmp
->set_line(*this);
244 flag
= tmp
->set_width(1);
246 cerr
<< get_line() << ": internal error: "
247 "expression bit width of comparison != 1." << endl
;
256 unsigned PEBComp::test_width(Design
*, NetScope
*,unsigned, unsigned, bool&) const
261 NetEBinary
* PEBComp::elaborate_expr(Design
*des
, NetScope
*scope
,
262 int expr_width
, bool sys_task_arg
) const
267 bool unsized_flag
= false;
268 unsigned left_width
= left_
->test_width(des
, scope
, 0, 0, unsized_flag
);
269 bool save_flag
= unsized_flag
;
270 unsigned right_width
= right_
->test_width(des
, scope
, 0, 0, unsized_flag
);
272 if (save_flag
!= unsized_flag
)
273 left_width
= left_
->test_width(des
, scope
, 0, 0, unsized_flag
);
275 /* Width of operands is self-determined. */
276 int use_wid
= left_width
;
277 if (right_width
> left_width
)
278 use_wid
= right_width
;
280 if (debug_elaborate
) {
281 cerr
<< get_line() << ": debug: "
282 << "Comparison expression operands are "
283 << left_width
<< " bits and "
284 << right_width
<< " bits. Resorting to "
285 << use_wid
<< " bits." << endl
;
288 NetExpr
*lp
= left_
->elaborate_expr(des
, scope
, use_wid
, false);
289 NetExpr
*rp
= right_
->elaborate_expr(des
, scope
, use_wid
, false);
290 if ((lp
== 0) || (rp
== 0)) {
296 return elaborate_eval_expr_base_(des
, lp
, rp
, use_wid
);
299 unsigned PEBShift::test_width(Design
*des
, NetScope
*scope
,
300 unsigned min
, unsigned lval
, bool&unsized_flag
) const
302 unsigned wid_left
= left_
->test_width(des
,scope
,min
, 0, unsized_flag
);
304 // The right expression is self-determined and has no impact
305 // on the expression size that is generated.
312 * Given a call to a system function, generate the proper expression
313 * nodes to represent the call in the netlist. Since we don't support
314 * size_tf functions, make assumptions about widths based on some
315 * known function names.
317 NetExpr
* PECallFunction::elaborate_sfunc_(Design
*des
, NetScope
*scope
) const
320 /* Catch the special case that the system function is the
321 $signed function. This function is special, in that it does
322 not lead to executable code but takes the single parameter
323 and makes it into a signed expression. No bits are changed,
324 it just changes the interpretation. */
325 if (strcmp(peek_tail_name(path_
), "$signed") == 0) {
326 if ((parms_
.count() != 1) || (parms_
[0] == 0)) {
327 cerr
<< get_line() << ": error: The $signed() function "
328 << "takes exactly one(1) argument." << endl
;
333 PExpr
*expr
= parms_
[0];
334 NetExpr
*sub
= expr
->elaborate_expr(des
, scope
, -1, true);
335 sub
->cast_signed(true);
338 /* add $unsigned to match $signed */
339 if (strcmp(peek_tail_name(path_
), "$unsigned") == 0) {
340 if ((parms_
.count() != 1) || (parms_
[0] == 0)) {
341 cerr
<< get_line() << ": error: The $unsigned() function "
342 << "takes exactly one(1) argument." << endl
;
347 PExpr
*expr
= parms_
[0];
348 NetExpr
*sub
= expr
->elaborate_expr(des
, scope
, -1, true);
349 sub
->cast_signed(false);
353 /* Interpret the internal $sizeof system function to return
354 the bit width of the sub-expression. The value of the
355 sub-expression is not used, so the expression itself can be
357 if ((strcmp(peek_tail_name(path_
), "$sizeof") == 0)
358 || (strcmp(peek_tail_name(path_
), "$bits") == 0)) {
359 if ((parms_
.count() != 1) || (parms_
[0] == 0)) {
360 cerr
<< get_line() << ": error: The $bits() function "
361 << "takes exactly one(1) argument." << endl
;
366 if (strcmp(peek_tail_name(path_
), "$sizeof") == 0)
367 cerr
<< get_line() << ": warning: $sizeof is deprecated."
368 << " Use $bits() instead." << endl
;
370 PExpr
*expr
= parms_
[0];
371 ivl_assert(*this, expr
);
373 /* Elaborate the sub-expression to get its
374 self-determined width, and save that width. Then
375 delete the expression because we don't really want
376 the expression itself. */
377 long sub_expr_width
= 0;
378 if (NetExpr
*tmp
= expr
->elaborate_expr(des
, scope
, -1, true)) {
379 sub_expr_width
= tmp
->expr_width();
383 verinum
val (sub_expr_width
, 8*sizeof(unsigned));
384 NetEConst
*sub
= new NetEConst(val
);
385 sub
->set_line(*this);
390 /* Interpret the internal $is_signed system function to return
391 a single bit flag -- 1 if the expression is signed, 0
392 otherwise. The subexpression is elaborated but not
394 if (strcmp(peek_tail_name(path_
), "$is_signed") == 0) {
395 if ((parms_
.count() != 1) || (parms_
[0] == 0)) {
396 cerr
<< get_line() << ": error: The $is_signed() function "
397 << "takes exactly one(1) argument." << endl
;
402 PExpr
*expr
= parms_
[0];
403 NetExpr
*sub
= expr
->elaborate_expr(des
, scope
, -1, true);
405 verinum
val (sub
->has_sign()? verinum::V1
: verinum::V0
, 1);
408 sub
= new NetEConst(val
);
409 sub
->set_line(*this);
414 /* Get the return type of the system function by looking it up
415 in the sfunc_table. */
416 const struct sfunc_return_type
*sfunc_info
417 = lookup_sys_func(peek_tail_name(path_
));
419 ivl_variable_type_t sfunc_type
= sfunc_info
->type
;
420 unsigned wid
= sfunc_info
->wid
;
423 /* How many parameters are there? The Verilog language allows
424 empty parameters in certain contexts, so the parser will
425 allow things like func(1,,3). It will also cause func() to
426 be interpreted as a single empty parameter.
428 Functions cannot really take empty parameters, but the
429 case ``func()'' is the same as no parameters at all. So
430 catch that special case here. */
431 unsigned nparms
= parms_
.count();
432 if ((nparms
== 1) && (parms_
[0] == 0))
435 NetESFunc
*fun
= new NetESFunc(peek_tail_name(path_
), sfunc_type
,
437 if (sfunc_info
->signed_flag
)
438 fun
->cast_signed(true);
440 /* Now run through the expected parameters. If we find that
441 there are missing parameters, print an error message.
443 While we're at it, try to evaluate the function parameter
444 expression as much as possible, and use the reduced
445 expression if one is created. */
447 unsigned missing_parms
= 0;
448 for (unsigned idx
= 0 ; idx
< nparms
; idx
+= 1) {
449 PExpr
*expr
= parms_
[idx
];
451 NetExpr
*tmp1
= expr
->elaborate_expr(des
, scope
, -1, true);
452 if (NetExpr
*tmp2
= tmp1
->eval_tree()) {
454 fun
->parm(idx
, tmp2
);
456 fun
->parm(idx
, tmp1
);
465 if (missing_parms
> 0) {
466 cerr
<< get_line() << ": error: The function "
467 << peek_tail_name(path_
)
468 << " has been called with empty parameters." << endl
;
469 cerr
<< get_line() << ": : Verilog doesn't allow "
470 << "passing empty parameters to functions." << endl
;
477 NetExpr
* PECallFunction::elaborate_expr(Design
*des
, NetScope
*scope
,
478 int expr_wid
, bool) const
480 if (peek_tail_name(path_
)[0] == '$')
481 return elaborate_sfunc_(des
, scope
);
483 NetFuncDef
*def
= des
->find_function(scope
, path_
);
485 cerr
<< get_line() << ": error: No function " << path_
<<
486 " in this context (" << scope_path(scope
) << ")." << endl
;
492 NetScope
*dscope
= def
->scope();
495 if (! check_call_matches_definition_(des
, dscope
))
498 unsigned parms_count
= parms_
.count();
499 if ((parms_count
== 1) && (parms_
[0] == 0))
504 svector
<NetExpr
*> parms (parms_count
);
506 /* Elaborate the input expressions for the function. This is
507 done in the scope of the function call, and not the scope
508 of the function being called. The scope of the called
509 function is elaborated when the definition is elaborated. */
511 unsigned missing_parms
= 0;
512 for (unsigned idx
= 0 ; idx
< parms
.count() ; idx
+= 1) {
513 PExpr
*tmp
= parms_
[idx
];
515 parms
[idx
] = elab_and_eval(des
, scope
, tmp
, -1);
523 if (missing_parms
> 0) {
524 cerr
<< get_line() << ": error: The function " << path_
525 << " has been called with empty parameters." << endl
;
526 cerr
<< get_line() << ": : Verilog doesn't allow "
527 << "passing empty parameters to functions." << endl
;
532 /* Look for the return value signal for the called
533 function. This return value is a magic signal in the scope
534 of the function, that has the name of the function. The
535 function code assigns to this signal to return a value.
537 dscope, in this case, is the scope of the function, so the
538 return value is the name within that scope. */
540 if (NetNet
*res
= dscope
->find_signal(dscope
->basename())) {
541 NetESignal
*eres
= new NetESignal(res
);
542 NetEUFunc
*func
= new NetEUFunc(dscope
, eres
, parms
);
543 func
->set_line(*this);
544 func
->cast_signed(res
->get_signed());
548 cerr
<< get_line() << ": internal error: Unable to locate "
549 "function return value for " << path_
550 << " in " << dscope
->basename() << "." << endl
;
556 NetExpr
* PEConcat::elaborate_expr(Design
*des
, NetScope
*scope
,
557 int expr_wid
, bool) const
561 if (debug_elaborate
) {
562 cerr
<< get_line() << ": debug: Elaborate expr=" << *this
563 << ", expr_wid=" << expr_wid
<< endl
;
566 /* If there is a repeat expression, then evaluate the constant
567 value and set the repeat count. */
569 NetExpr
*tmp
= elab_and_eval(des
, scope
, repeat_
, -1);
571 NetEConst
*rep
= dynamic_cast<NetEConst
*>(tmp
);
574 cerr
<< get_line() << ": error: "
575 "concatenation repeat expression cannot be evaluated."
577 cerr
<< get_line() << ": : The expression is: "
585 /* Make the empty concat expression. */
586 NetEConcat
*tmp
= new NetEConcat(parms_
.count(), repeat
);
587 tmp
->set_line(*this);
589 unsigned wid_sum
= 0;
591 /* Elaborate all the parameters and attach them to the concat node. */
592 for (unsigned idx
= 0 ; idx
< parms_
.count() ; idx
+= 1) {
593 if (parms_
[idx
] == 0) {
594 cerr
<< get_line() << ": error: Missing expression "
595 << (idx
+1) << " of concatenation list." << endl
;
601 NetExpr
*ex
= elab_and_eval(des
, scope
, parms_
[idx
], 0, 0);
602 if (ex
== 0) continue;
604 ex
->set_line(*parms_
[idx
]);
606 if (! ex
->has_width()) {
607 cerr
<< ex
->get_line() << ": error: operand of "
608 << "concatenation has indefinite width: "
613 wid_sum
+= ex
->expr_width();
617 tmp
->set_width(wid_sum
* tmp
->repeat());
622 NetExpr
* PEFNumber::elaborate_expr(Design
*des
, NetScope
*scope
, int, bool) const
624 NetECReal
*tmp
= new NetECReal(*value_
);
625 tmp
->set_line(*this);
626 tmp
->set_width(1U, false);
631 * Given that the msb_ and lsb_ are part select expressions, this
632 * function calculates their values. Note that this method does *not*
633 * convert the values to canonical form.
635 bool PEIdent::calculate_parts_(Design
*des
, NetScope
*scope
,
636 long&msb
, long&lsb
) const
638 const name_component_t
&name_tail
= path_
.back();
639 ivl_assert(*this, !name_tail
.index
.empty());
641 const index_component_t
&index_tail
= name_tail
.index
.back();
642 ivl_assert(*this, index_tail
.sel
== index_component_t::SEL_PART
);
643 ivl_assert(*this, index_tail
.msb
&& index_tail
.lsb
);
645 /* This handles part selects. In this case, there are
646 two bit select expressions, and both must be
647 constant. Evaluate them and pass the results back to
649 NetExpr
*lsb_ex
= elab_and_eval(des
, scope
, index_tail
.lsb
, -1);
650 NetEConst
*lsb_c
= dynamic_cast<NetEConst
*>(lsb_ex
);
652 cerr
<< index_tail
.lsb
->get_line() << ": error: "
653 "Part select expressions must be constant."
655 cerr
<< index_tail
.lsb
->get_line() << ": : "
656 "This lsb expression violates the rule: "
657 << *index_tail
.lsb
<< endl
;
662 NetExpr
*msb_ex
= elab_and_eval(des
, scope
, index_tail
.msb
, -1);
663 NetEConst
*msb_c
= dynamic_cast<NetEConst
*>(msb_ex
);
665 cerr
<< index_tail
.msb
->get_line() << ": error: "
666 "Part select expressions must be constant."
668 cerr
<< index_tail
.msb
->get_line() << ": : This msb expression "
669 "violates the rule: " << *index_tail
.msb
<< endl
;
674 msb
= msb_c
->value().as_long();
675 lsb
= lsb_c
->value().as_long();
682 bool PEIdent::calculate_up_do_width_(Design
*des
, NetScope
*scope
,
683 unsigned long&wid
) const
685 const name_component_t
&name_tail
= path_
.back();
686 ivl_assert(*this, !name_tail
.index
.empty());
688 const index_component_t
&index_tail
= name_tail
.index
.back();
689 ivl_assert(*this, index_tail
.lsb
&& index_tail
.msb
);
693 /* Calculate the width expression (in the lsb_ position)
694 first. If the expression is not constant, error but guess 1
695 so we can keep going and find more errors. */
696 NetExpr
*wid_ex
= elab_and_eval(des
, scope
, index_tail
.lsb
, -1);
697 NetEConst
*wid_c
= dynamic_cast<NetEConst
*>(wid_ex
);
700 cerr
<< get_line() << ": error: Indexed part width must be "
701 << "constant. Expression in question is..." << endl
;
702 cerr
<< get_line() << ": : " << *wid_ex
<< endl
;
707 wid
= wid_c
? wid_c
->value().as_ulong() : 1;
713 unsigned PEIdent::test_width(Design
*des
, NetScope
*scope
,
714 unsigned min
, unsigned lval
,
715 bool&unsized_flag
) const
718 const NetExpr
*par
= 0;
721 const NetExpr
*ex1
, *ex2
;
723 symbol_search(des
, scope
, path_
, net
, par
, eve
, ex1
, ex2
);
726 const name_component_t
&name_tail
= path_
.back();
727 index_component_t::ctype_t use_sel
= index_component_t::SEL_NONE
;
728 if (!name_tail
.index
.empty())
729 use_sel
= name_tail
.index
.back().sel
;
731 unsigned use_width
= net
->vector_width();
733 case index_component_t::SEL_NONE
:
735 case index_component_t::SEL_PART
:
737 calculate_parts_(des
, scope
, msb
, lsb
);
738 use_width
= 1 + ((msb
>lsb
)? (msb
-lsb
) : (lsb
-msb
));
741 case index_component_t::SEL_IDX_UP
:
742 case index_component_t::SEL_IDX_DO
:
743 { unsigned long tmp
= 0;
744 calculate_up_do_width_(des
, scope
, tmp
);
748 case index_component_t::SEL_BIT
:
752 ivl_assert(*this, 0);
761 * Elaborate an identifier in an expression. The identifier can be a
762 * parameter name, a signal name or a memory name. It can also be a
763 * scope name (Return a NetEScope) but only certain callers can use
764 * scope names. However, we still support it here.
766 * Function names are not handled here, they are detected by the
767 * parser and are elaborated by PECallFunction.
769 * The signal name may be escaped, but that affects nothing here.
771 NetExpr
* PEIdent::elaborate_expr(Design
*des
, NetScope
*scope
,
772 int expr_wid
, bool sys_task_arg
) const
777 const NetExpr
*par
= 0;
780 const NetExpr
*ex1
, *ex2
;
782 NetScope
*found_in
= symbol_search(des
, scope
, path_
,
786 // If the identifier name is a parameter name, then return
787 // a reference to the parameter expression.
789 return elaborate_expr_param(des
, scope
, par
, found_in
, ex1
, ex2
);
792 // If the identifier names a signal (a register or wire)
793 // then create a NetESignal node to handle it.
795 return elaborate_expr_net(des
, scope
, net
, found_in
, sys_task_arg
);
797 // If the identifier is a named event.
798 // is a variable reference.
800 NetEEvent
*tmp
= new NetEEvent(eve
);
801 tmp
->set_line(*this);
805 // Hmm... maybe this is a genvar? This is only possible while
806 // processing generate blocks, but then the genvar_tmp will be
808 if (path_
.size() == 1
809 && scope
->genvar_tmp
.str()
810 && strcmp(peek_tail_name(path_
), scope
->genvar_tmp
) == 0) {
812 cerr
<< get_line() << ": debug: " << path_
813 << " is genvar with value " << scope
->genvar_tmp_val
815 verinum
val (scope
->genvar_tmp_val
);
816 NetEConst
*tmp
= new NetEConst(val
);
817 tmp
->set_line(*this);
821 // A specparam? Look up the name to see if it is a
822 // specparam. If we find it, then turn it into a NetEConst
823 // value and return that. Of course, this does not apply if
824 // specify blocks are disabled.
826 if (gn_specify_blocks_flag
) {
827 map
<perm_string
,NetScope::spec_val_t
>::const_iterator specp
;
828 perm_string key
= peek_tail_name(path_
);
829 if (path_
.size() == 1
830 && ((specp
= scope
->specparams
.find(key
)) != scope
->specparams
.end())) {
831 NetScope::spec_val_t value
= (*specp
).second
;
833 switch (value
.type
) {
835 tmp
= new NetEConst(verinum(value
.integer
));
838 tmp
= new NetECReal(verireal(value
.real_val
));
844 tmp
->set_line(*this);
847 cerr
<< get_line() << ": debug: " << path_
848 << " is a specparam" << endl
;
853 // At this point we've exhausted all the possibilities that
854 // are not scopes. If this is not a system task argument, then
855 // it cannot be a scope name, so give up.
857 if (! sys_task_arg
) {
858 // I cannot interpret this identifier. Error message.
859 cerr
<< get_line() << ": error: Unable to bind wire/reg/memory "
860 "`" << path_
<< "' in `" << scope_path(scope
) << "'" << endl
;
865 // Finally, if this is a scope name, then return that. Look
866 // first to see if this is a name of a local scope. Failing
867 // that, search globally for a hierarchical name.
868 if ((path_
.size() == 1)) {
869 hname_t
use_name ( peek_tail_name(path_
) );
870 if (NetScope
*nsc
= scope
->child(use_name
)) {
871 NetEScope
*tmp
= new NetEScope(nsc
);
872 tmp
->set_line(*this);
875 cerr
<< get_line() << ": debug: Found scope "
876 << use_name
<< " in scope " << scope
->basename()
883 list
<hname_t
> spath
= eval_scope_path(des
, scope
, path_
);
885 ivl_assert(*this, spath
.size() == path_
.size());
887 // Try full hierarchical scope name.
888 if (NetScope
*nsc
= des
->find_scope(spath
)) {
889 NetEScope
*tmp
= new NetEScope(nsc
);
890 tmp
->set_line(*this);
893 cerr
<< get_line() << ": debug: Found scope "
895 << " path=" << path_
<< endl
;
897 if (! sys_task_arg
) {
898 cerr
<< get_line() << ": error: Scope name "
899 << nsc
->basename() << " not allowed here." << endl
;
906 // Try relative scope name.
907 if (NetScope
*nsc
= des
->find_scope(scope
, spath
)) {
908 NetEScope
*tmp
= new NetEScope(nsc
);
909 tmp
->set_line(*this);
912 cerr
<< get_line() << ": debug: Found scope "
913 << nsc
->basename() << " in " << scope_path(scope
) << endl
;
918 // I cannot interpret this identifier. Error message.
919 cerr
<< get_line() << ": error: Unable to bind wire/reg/memory "
920 "`" << path_
<< "' in `" << scope_path(scope
) << "'" << endl
;
926 * Handle the case that the identifier is a parameter reference. The
927 * parameter expression has already been located for us (as the par
928 * argument) so we just need to process the sub-expression.
930 NetExpr
* PEIdent::elaborate_expr_param(Design
*des
,
934 const NetExpr
*par_msb
,
935 const NetExpr
*par_lsb
) const
937 NetExpr
*tmp
= par
->dup_expr();
939 const name_component_t
&name_tail
= path_
.back();
940 index_component_t::ctype_t use_sel
= index_component_t::SEL_NONE
;
941 if (!name_tail
.index
.empty())
942 use_sel
= name_tail
.index
.back().sel
;
944 if (use_sel
== index_component_t::SEL_PART
) {
945 ivl_assert(*this, !name_tail
.index
.empty());
946 const index_component_t
&index_tail
= name_tail
.index
.back();
947 ivl_assert(*this, index_tail
.msb
);
948 ivl_assert(*this, index_tail
.lsb
);
950 /* If the identifier has a part select, we support
951 it by pulling the right bits out and making a
952 sized unsigned constant. This code assumes the
953 lsb of a parameter is 0 and the msb is the
954 width of the parameter. */
956 verinum
*lsn
= index_tail
.lsb
->eval_const(des
, scope
);
957 verinum
*msn
= index_tail
.msb
->eval_const(des
, scope
);
958 if ((lsn
== 0) || (msn
== 0)) {
959 cerr
<< get_line() << ": error: "
960 "Part select expressions must be "
961 "constant expressions." << endl
;
966 long lsb
= lsn
->as_long();
967 long msb
= msn
->as_long();
968 if ((lsb
< 0) || (msb
< lsb
)) {
969 cerr
<< get_line() << ": error: invalid part "
970 << "select: " << path_
971 << "["<<msb
<<":"<<lsb
<<"]" << endl
;
975 unsigned long ulsb
=lsb
;
976 unsigned long umsb
=msb
;
978 NetEConst
*le
= dynamic_cast<NetEConst
*>(tmp
);
981 verinum
result (verinum::V0
, msb
-lsb
+1, true);
982 verinum exl
= le
->value();
984 /* Pull the bits from the parameter, one at a
985 time. If the bit is within the range, simply
986 copy it to the result. If the bit is outside
987 the range, we sign extend signed unsized
988 numbers, zero extend unsigned unsigned numbers,
989 and X extend sized numbers. */
990 for (unsigned long idx
= ulsb
; idx
<= umsb
; idx
+= 1) {
992 result
.set(idx
-lsb
, exl
.get(idx
));
993 else if (exl
.is_string())
994 result
.set(idx
-lsb
, verinum::V0
);
995 else if (exl
.has_len())
996 result
.set(idx
-lsb
, verinum::Vx
);
997 else if (exl
.has_sign())
998 result
.set(idx
-lsb
, exl
.get(exl
.len()-1));
1000 result
.set(idx
-lsb
, verinum::V0
);
1003 /* If the input is a string, and the part select
1004 is working on byte boundaries, then the result
1005 can be made into a string. */
1008 && (result
.len()%8 == 0))
1009 result
= verinum(result
.as_string());
1012 tmp
= new NetEConst(result
);
1014 } else if (use_sel
== index_component_t::SEL_IDX_UP
|| use_sel
== index_component_t::SEL_IDX_DO
) {
1016 ivl_assert(*this, !name_tail
.index
.empty());
1017 const index_component_t
&index_tail
= name_tail
.index
.back();
1018 ivl_assert(*this, index_tail
.msb
);
1019 ivl_assert(*this, index_tail
.lsb
);
1021 /* Get and evaluate the width of the index
1022 select. This must be constant. */
1023 NetExpr
*wid_ex
= elab_and_eval(des
, scope
, index_tail
.lsb
, -1);
1024 NetEConst
*wid_ec
= dynamic_cast<NetEConst
*> (wid_ex
);
1026 cerr
<< index_tail
.lsb
->get_line() << ": error: "
1027 << "Second expression of indexed part select "
1028 << "most be constant." << endl
;
1033 unsigned wid
= wid_ec
->value().as_ulong();
1035 NetExpr
*idx_ex
= elab_and_eval(des
, scope
, index_tail
.msb
, -1);
1040 if (use_sel
== index_component_t::SEL_IDX_DO
&& wid
> 1) {
1041 idx_ex
= make_add_expr(idx_ex
, 1-(long)wid
);
1045 /* Wrap the param expression with a part select. */
1046 tmp
= new NetESelect(tmp
, idx_ex
, wid
);
1049 } else if (use_sel
== index_component_t::SEL_BIT
) {
1050 ivl_assert(*this, !name_tail
.index
.empty());
1051 const index_component_t
&index_tail
= name_tail
.index
.back();
1052 ivl_assert(*this, index_tail
.msb
);
1053 ivl_assert(*this, !index_tail
.lsb
);
1055 /* Handle the case where a parameter has a bit
1056 select attached to it. Generate a NetESelect
1057 object to select the bit as desired. */
1058 NetExpr
*mtmp
= index_tail
.msb
->elaborate_expr(des
, scope
, -1,false);
1059 if (! dynamic_cast<NetEConst
*>(mtmp
)) {
1060 NetExpr
*re
= mtmp
->eval_tree();
1067 /* Let's first try to get constant values for both
1068 the parameter and the bit select. If they are
1069 both constant, then evaluate the bit select and
1070 return instead a single-bit constant. */
1072 NetEConst
*le
= dynamic_cast<NetEConst
*>(tmp
);
1073 NetEConst
*re
= dynamic_cast<NetEConst
*>(mtmp
);
1076 /* Argument and bit select are constant. Calculate
1077 the final result. */
1078 verinum lv
= le
->value();
1079 verinum rv
= re
->value();
1080 verinum::V rb
= verinum::Vx
;
1082 long ridx
= rv
.as_long();
1083 if ((ridx
>= 0) && ((unsigned long) ridx
< lv
.len())) {
1086 } else if ((ridx
>= 0) && (!lv
.has_len())) {
1088 rb
= lv
[lv
.len()-1];
1093 NetEConst
*re
= new NetEConst(verinum(rb
, 1));
1100 const NetEConst
*par_me
=dynamic_cast<const NetEConst
*>(par_msb
);
1101 const NetEConst
*par_le
=dynamic_cast<const NetEConst
*>(par_lsb
);
1103 assert(par_me
|| !par_msb
);
1104 assert(par_le
|| !par_lsb
);
1105 assert(par_me
|| !par_le
);
1108 long par_mv
= par_me
->value().as_long();
1109 long par_lv
= par_le
->value().as_long();
1110 if (par_mv
>= par_lv
) {
1112 ? make_add_expr(mtmp
, 0-par_lv
)
1116 mtmp
= make_add_expr(mtmp
, 0-par_mv
);
1117 mtmp
= make_sub_expr(par_lv
-par_mv
, mtmp
);
1121 /* The value is constant, but the bit select
1122 expression is not. Elaborate a NetESelect to
1123 evaluate the select at run-time. */
1125 NetESelect
*stmp
= new NetESelect(tmp
, mtmp
, 1);
1126 tmp
->set_line(*this);
1131 /* No bit or part select. Make the constant into a
1132 NetEConstParam if possible. */
1133 NetEConst
*ctmp
= dynamic_cast<NetEConst
*>(tmp
);
1135 perm_string name
= peek_tail_name(path_
);
1137 = new NetEConstParam(found_in
, name
, ctmp
->value());
1143 tmp
->set_line(*this);
1148 * Handle word selects of vector arrays.
1150 NetExpr
* PEIdent::elaborate_expr_net_word_(Design
*des
, NetScope
*scope
,
1151 NetNet
*net
, NetScope
*found_in
,
1152 bool sys_task_arg
) const
1154 const name_component_t
&name_tail
= path_
.back();
1156 if (name_tail
.index
.empty() && !sys_task_arg
) {
1157 cerr
<< get_line() << ": error: Array " << path()
1158 << " Needs an array index here." << endl
;
1163 index_component_t index_front
;
1164 if (! name_tail
.index
.empty()) {
1165 index_front
= name_tail
.index
.front();
1166 ivl_assert(*this, index_front
.sel
!= index_component_t::SEL_NONE
);
1167 if (index_front
.sel
!= index_component_t::SEL_BIT
) {
1168 cerr
<< get_line() << ": error: Array " << path_
1169 << " cannot be indexed by a range." << endl
;
1173 ivl_assert(*this, index_front
.msb
);
1174 ivl_assert(*this, !index_front
.lsb
);
1177 NetExpr
*word_index
= index_front
.sel
== index_component_t::SEL_NONE
1179 : elab_and_eval(des
, scope
, index_front
.msb
, -1);
1180 if (word_index
== 0 && !sys_task_arg
)
1183 if (NetEConst
*word_addr
= dynamic_cast<NetEConst
*>(word_index
)) {
1184 long addr
= word_addr
->value().as_long();
1186 // Special case: The index is out of range, so the value
1187 // of this expression is a 'bx vector the width of a word.
1188 if (!net
->array_index_is_valid(addr
)) {
1189 verinum
xxx (verinum::Vx
, net
->vector_width());
1190 NetEConst
*resx
= new NetEConst(xxx
);
1191 resx
->set_line(*this);
1196 // Recalculate the constant address with the adjusted base.
1197 unsigned use_addr
= net
->array_index_to_address(addr
);
1198 if (use_addr
!= addr
) {
1199 verinum
val (use_addr
, 8*sizeof(use_addr
));
1200 NetEConst
*tmp
= new NetEConst(val
);
1201 tmp
->set_line(*this);
1206 } else if (word_index
) {
1207 // If there is a non-zero base to the memory, then build an
1208 // expression to calculate the canonical address.
1209 if (long base
= net
->array_first()) {
1211 word_index
= make_add_expr(word_index
, 0-base
);
1212 if (NetExpr
*tmp
= word_index
->eval_tree()) {
1218 NetESignal
*res
= new NetESignal(net
, word_index
);
1219 res
->set_line(*this);
1221 // Detect that the word has a bit/part select as well.
1223 index_component_t::ctype_t word_sel
= index_component_t::SEL_NONE
;
1224 if (name_tail
.index
.size() > 1)
1225 word_sel
= name_tail
.index
.back().sel
;
1227 if (word_sel
== index_component_t::SEL_PART
)
1228 return elaborate_expr_net_part_(des
, scope
, res
, found_in
);
1230 if (word_sel
== index_component_t::SEL_IDX_UP
)
1231 return elaborate_expr_net_idx_up_(des
, scope
, res
, found_in
);
1233 if (word_sel
== index_component_t::SEL_IDX_DO
)
1234 return elaborate_expr_net_idx_do_(des
, scope
, res
, found_in
);
1236 if (word_sel
== index_component_t::SEL_BIT
)
1237 return elaborate_expr_net_bit_(des
, scope
, res
, found_in
);
1239 ivl_assert(*this, word_sel
== index_component_t::SEL_NONE
);
1244 * Handle part selects of NetNet identifiers.
1246 NetExpr
* PEIdent::elaborate_expr_net_part_(Design
*des
, NetScope
*scope
,
1247 NetESignal
*net
, NetScope
*found_in
) const
1250 bool flag
= calculate_parts_(des
, scope
, msv
, lsv
);
1254 /* The indices of part selects are signed integers, so allow
1255 negative values. However, the width that they represent is
1256 unsigned. Remember that any order is possible,
1257 i.e., [1:0], [-4:6], etc. */
1258 unsigned long wid
= 1 + ((msv
>lsv
)? (msv
-lsv
) : (lsv
-msv
));
1259 if (wid
> net
->vector_width()) {
1260 cerr
<< get_line() << ": error: part select ["
1261 << msv
<< ":" << lsv
<< "] out of range." << endl
;
1267 ivl_assert(*this, wid
<= net
->vector_width());
1269 if (net
->sig()->sb_to_idx(msv
) < net
->sig()->sb_to_idx(lsv
)) {
1270 cerr
<< get_line() << ": error: part select ["
1271 << msv
<< ":" << lsv
<< "] out of order." << endl
;
1279 if (net
->sig()->sb_to_idx(msv
) >= net
->vector_width()) {
1280 cerr
<< get_line() << ": error: part select ["
1281 << msv
<< ":" << lsv
<< "] out of range." << endl
;
1288 // If the part select convers exactly the entire
1289 // vector, then do not bother with it. Return the
1291 if (net
->sig()->sb_to_idx(lsv
) == 0 && wid
== net
->vector_width())
1294 NetExpr
*ex
= new NetEConst(verinum(net
->sig()->sb_to_idx(lsv
)));
1295 NetESelect
*ss
= new NetESelect(net
, ex
, wid
);
1296 ss
->set_line(*this);
1302 * Part select indexed up, i.e. net[<m> +: <l>]
1304 NetExpr
* PEIdent::elaborate_expr_net_idx_up_(Design
*des
, NetScope
*scope
,
1305 NetESignal
*net
, NetScope
*found_in
) const
1307 const name_component_t
&name_tail
= path_
.back();
1308 ivl_assert(*this, !name_tail
.index
.empty());
1310 const index_component_t
&index_tail
= name_tail
.index
.back();
1311 ivl_assert(*this, index_tail
.lsb
!= 0);
1312 ivl_assert(*this, index_tail
.msb
!= 0);
1314 NetExpr
*base
= elab_and_eval(des
, scope
, index_tail
.msb
, -1);
1316 unsigned long wid
= 0;
1317 calculate_up_do_width_(des
, scope
, wid
);
1320 // Handle the special case that the base is constant as
1321 // well. In this case it can be converted to a conventional
1323 if (NetEConst
*base_c
= dynamic_cast<NetEConst
*> (base
)) {
1324 long lsv
= base_c
->value().as_long();
1326 // If the part select convers exactly the entire
1327 // vector, then do not bother with it. Return the
1329 if (net
->sig()->sb_to_idx(lsv
) == 0 && wid
== net
->vector_width())
1332 // Otherwise, make a part select that covers the right range.
1333 NetExpr
*ex
= new NetEConst(verinum(net
->sig()->sb_to_idx(lsv
)));
1334 NetESelect
*ss
= new NetESelect(net
, ex
, wid
);
1335 ss
->set_line(*this);
1341 if (net
->msi() > net
->lsi()) {
1342 if (long offset
= net
->lsi())
1343 base
= make_add_expr(base
, 0-offset
);
1345 long vwid
= net
->lsi() - net
->msi() + 1;
1346 long offset
= net
->msi();
1347 base
= make_sub_expr(vwid
-offset
-wid
, base
);
1350 NetESelect
*ss
= new NetESelect(net
, base
, wid
);
1351 ss
->set_line(*this);
1353 if (debug_elaborate
) {
1354 cerr
<< get_line() << ": debug: Elaborate part "
1355 << "select base="<< *base
<< ", wid="<< wid
<< endl
;
1362 * Part select indexed down, i.e. net[<m> -: <l>]
1364 NetExpr
* PEIdent::elaborate_expr_net_idx_do_(Design
*des
, NetScope
*scope
,
1365 NetESignal
*net
, NetScope
*found_in
)const
1367 const name_component_t
&name_tail
= path_
.back();
1368 ivl_assert(*this, ! name_tail
.index
.empty());
1370 const index_component_t
&index_tail
= name_tail
.index
.back();
1371 ivl_assert(*this, index_tail
.lsb
!= 0);
1372 ivl_assert(*this, index_tail
.msb
!= 0);
1374 NetExpr
*base
= elab_and_eval(des
, scope
, index_tail
.msb
, -1);
1376 unsigned long wid
= 0;
1377 calculate_up_do_width_(des
, scope
, wid
);
1379 // Handle the special case that the base is constant as
1380 // well. In this case it can be converted to a conventional
1382 if (NetEConst
*base_c
= dynamic_cast<NetEConst
*> (base
)) {
1383 long lsv
= base_c
->value().as_long();
1385 // If the part select convers exactly the entire
1386 // vector, then do not bother with it. Return the
1388 if (net
->sig()->sb_to_idx(lsv
) == (wid
-1) && wid
== net
->vector_width())
1391 // Otherwise, make a part select that covers the right range.
1392 NetExpr
*ex
= new NetEConst(verinum(net
->sig()->sb_to_idx(lsv
)-wid
+1));
1393 NetESelect
*ss
= new NetESelect(net
, ex
, wid
);
1394 ss
->set_line(*this);
1400 long offset
= net
->lsi();
1401 NetExpr
*base_adjusted
= wid
> 1
1402 ? make_add_expr(base
,1-(long)wid
-offset
)
1403 : (offset
== 0? base
: make_add_expr(base
, 0-offset
));
1404 NetESelect
*ss
= new NetESelect(net
, base_adjusted
, wid
);
1405 ss
->set_line(*this);
1407 if (debug_elaborate
) {
1408 cerr
<< get_line() << ": debug: Elaborate part "
1409 << "select base="<< *base_adjusted
<< ", wid="<< wid
<< endl
;
1415 NetExpr
* PEIdent::elaborate_expr_net_bit_(Design
*des
, NetScope
*scope
,
1416 NetESignal
*net
, NetScope
*found_in
) const
1418 const name_component_t
&name_tail
= path_
.back();
1419 ivl_assert(*this, !name_tail
.index
.empty());
1421 const index_component_t
&index_tail
= name_tail
.index
.back();
1422 ivl_assert(*this, index_tail
.msb
!= 0);
1423 ivl_assert(*this, index_tail
.lsb
== 0);
1425 NetExpr
*ex
= elab_and_eval(des
, scope
, index_tail
.msb
, -1);
1427 // If the bit select is constant, then treat it similar
1428 // to the part select, so that I save the effort of
1429 // making a mux part in the netlist.
1430 if (NetEConst
*msc
= dynamic_cast<NetEConst
*> (ex
)) {
1431 long msv
= msc
->value().as_long();
1432 unsigned idx
= net
->sig()->sb_to_idx(msv
);
1434 if (idx
>= net
->vector_width()) {
1435 /* The bit select is out of range of the
1436 vector. This is legal, but returns a
1437 constant 1'bx value. */
1438 verinum
x (verinum::Vx
);
1439 NetEConst
*tmp
= new NetEConst(x
);
1440 tmp
->set_line(*this);
1442 cerr
<< get_line() << ": warning: Bit select ["
1443 << msv
<< "] out of range of vector "
1444 << net
->name() << "[" << net
->sig()->msb()
1445 << ":" << net
->sig()->lsb() << "]." << endl
;
1446 cerr
<< get_line() << ": : Replacing "
1447 << "expression with a constant 1'bx." << endl
;
1452 // If the vector is only one bit, we are done. The
1453 // bit select will return the scaler itself.
1454 if (net
->vector_width() == 1)
1457 // Make an expression out of the index
1458 NetEConst
*idx_c
= new NetEConst(verinum(idx
));
1459 idx_c
->set_line(*net
);
1461 // Make a bit select with the canonical index
1462 NetESelect
*res
= new NetESelect(net
, idx_c
, 1);
1463 res
->set_line(*net
);
1468 // Non-constant bit select? punt and make a subsignal
1469 // device to mux the bit in the net. This is a fairly
1470 // complicated task because we need to generate
1471 // expressions to convert calculated bit select
1472 // values to canonical values that are used internally.
1474 if (net
->sig()->msb() < net
->sig()->lsb()) {
1475 ex
= make_sub_expr(net
->sig()->lsb(), ex
);
1477 ex
= make_add_expr(ex
, - net
->sig()->lsb());
1480 NetESelect
*ss
= new NetESelect(net
, ex
, 1);
1481 ss
->set_line(*this);
1485 NetExpr
* PEIdent::elaborate_expr_net(Design
*des
, NetScope
*scope
,
1486 NetNet
*net
, NetScope
*found_in
,
1487 bool sys_task_arg
) const
1489 if (net
->array_dimensions() > 0)
1490 return elaborate_expr_net_word_(des
, scope
, net
, found_in
, sys_task_arg
);
1492 NetESignal
*node
= new NetESignal(net
);
1493 node
->set_line(*this);
1495 index_component_t::ctype_t use_sel
= index_component_t::SEL_NONE
;
1496 if (! path_
.back().index
.empty())
1497 use_sel
= path_
.back().index
.back().sel
;
1499 // If this is a part select of a signal, then make a new
1500 // temporary signal that is connected to just the
1501 // selected bits. The lsb_ and msb_ expressions are from
1502 // the foo[msb:lsb] expression in the original.
1503 if (use_sel
== index_component_t::SEL_PART
)
1504 return elaborate_expr_net_part_(des
, scope
, node
, found_in
);
1506 if (use_sel
== index_component_t::SEL_IDX_UP
)
1507 return elaborate_expr_net_idx_up_(des
, scope
, node
, found_in
);
1509 if (use_sel
== index_component_t::SEL_IDX_DO
)
1510 return elaborate_expr_net_idx_do_(des
, scope
, node
, found_in
);
1512 if (use_sel
== index_component_t::SEL_BIT
)
1513 return elaborate_expr_net_bit_(des
, scope
, node
, found_in
);
1515 // It's not anything else, so this must be a simple identifier
1516 // expression with no part or bit select. Return the signal
1517 // itself as the expression.
1518 assert(use_sel
== index_component_t::SEL_NONE
);
1523 unsigned PENumber::test_width(Design
*, NetScope
*,
1524 unsigned min
, unsigned lval
, bool&unsized_flag
) const
1526 unsigned use_wid
= value_
->len();
1530 if (! value_
->has_len())
1531 unsized_flag
= true;
1536 NetEConst
* PENumber::elaborate_expr(Design
*des
, NetScope
*,
1537 int expr_width
, bool) const
1540 verinum tvalue
= *value_
;
1542 // If the expr_width is >0, then the context is requesting a
1543 // specific size (for example this is part of the r-values of
1544 // an assignment) so we pad to the desired width and ignore
1545 // the self-determined size.
1546 if (expr_width
> 0) {
1547 tvalue
= pad_to_width(tvalue
, expr_width
);
1550 NetEConst
*tmp
= new NetEConst(tvalue
);
1551 tmp
->set_line(*this);
1555 unsigned PEString::test_width(Design
*des
, NetScope
*scope
,
1556 unsigned min
, unsigned lval
,
1557 bool&unsized_flag
) const
1559 unsigned use_wid
= text_
? 8*strlen(text_
) : 0;
1566 NetEConst
* PEString::elaborate_expr(Design
*des
, NetScope
*,
1567 int expr_width
, bool) const
1569 NetEConst
*tmp
= new NetEConst(value());
1570 tmp
->set_line(*this);
1574 unsigned PETernary::test_width(Design
*des
, NetScope
*scope
,
1575 unsigned min
, unsigned lval
,
1578 unsigned tru_wid
= tru_
->test_width(des
, scope
, min
, lval
, flag
);
1579 unsigned fal_wid
= fal_
->test_width(des
, scope
, min
, lval
, flag
);
1580 return max(tru_wid
,fal_wid
);
1583 static bool test_ternary_operand_compat(ivl_variable_type_t l
,
1584 ivl_variable_type_t r
)
1586 if (l
== IVL_VT_LOGIC
&& r
== IVL_VT_BOOL
)
1588 if (l
== IVL_VT_BOOL
&& r
== IVL_VT_LOGIC
)
1597 * Elaborate the Ternary operator. I know that the expressions were
1598 * parsed so I can presume that they exist, and call elaboration
1599 * methods. If any elaboration fails, then give up and return 0.
1601 NetETernary
*PETernary::elaborate_expr(Design
*des
, NetScope
*scope
,
1602 int expr_wid
, bool) const
1610 unsigned tru_wid
= tru_
->test_width(des
, scope
, 0, 0, flag
);
1611 unsigned fal_wid
= fal_
->test_width(des
, scope
, 0, 0, flag
);
1612 expr_wid
= max(tru_wid
, fal_wid
);
1613 if (debug_elaborate
)
1614 cerr
<< get_line() << ": debug: "
1615 << "Self-sized ternary chooses wid="<< expr_wid
1616 << " from " <<tru_wid
1617 << " and " << fal_wid
<< endl
;
1620 NetExpr
*con
= expr_
->elaborate_expr(des
, scope
, -1, false);
1624 NetExpr
*tru
= tru_
->elaborate_expr(des
, scope
, expr_wid
, false);
1630 NetExpr
*fal
= fal_
->elaborate_expr(des
, scope
, expr_wid
, false);
1637 if (! test_ternary_operand_compat(tru
->expr_type(), fal
->expr_type())) {
1638 cerr
<< get_line() << ": error: Data types "
1639 << tru
->expr_type() << " and "
1640 << fal
->expr_type() << " of ternary"
1641 << " do not match." << endl
;
1646 /* Whatever the width we choose for the ternary operator, we
1647 need to make sure the operands match. */
1648 tru
= pad_to_width(tru
, expr_wid
);
1649 fal
= pad_to_width(fal
, expr_wid
);
1651 NetETernary
*res
= new NetETernary(con
, tru
, fal
);
1652 res
->set_line(*this);
1656 NetExpr
* PEUnary::elaborate_expr(Design
*des
, NetScope
*scope
,
1657 int expr_wid
, bool) const
1659 NetExpr
*ip
= expr_
->elaborate_expr(des
, scope
, expr_wid
, false);
1660 if (ip
== 0) return 0;
1662 /* Should we evaluate expressions ahead of time,
1663 * just like in PEBinary::elaborate_expr() ?
1669 tmp
= new NetEUnary(op_
, ip
);
1670 tmp
->set_line(*this);
1674 if (NetEConst
*ipc
= dynamic_cast<NetEConst
*>(ip
)) {
1676 verinum val
= ipc
->value();
1678 val
= pad_to_width(val
, expr_wid
);
1680 /* When taking the - of a number, turn it into a
1681 signed expression and extend it one bit to
1682 accommodate a possible sign bit. */
1683 verinum
zero (verinum::V0
, val
.len()+1, val
.has_len());
1684 verinum nval
= zero
- val
;
1687 nval
= verinum(nval
, val
.len());
1688 nval
.has_sign(true);
1689 tmp
= new NetEConst(nval
);
1690 tmp
->set_line(*this);
1693 } else if (NetECReal
*ipc
= dynamic_cast<NetECReal
*>(ip
)) {
1695 /* When taking the - of a real, fold this into the
1697 verireal val
= - ipc
->value();
1698 tmp
= new NetECReal(val
);
1699 tmp
->set_line( *ip
);
1703 tmp
= new NetEUnary(op_
, ip
);
1704 tmp
->set_line(*this);
1712 case '!': // Logical NOT
1713 /* If the operand to unary ! is a constant, then I can
1714 evaluate this expression here and return a logical
1715 constant in its place. */
1716 if (NetEConst
*ipc
= dynamic_cast<NetEConst
*>(ip
)) {
1717 verinum val
= ipc
->value();
1720 for (unsigned idx
= 0 ; idx
< val
.len() ; idx
+= 1)
1740 verinum
vres (res
, 1, true);
1741 tmp
= new NetEConst(vres
);
1742 tmp
->set_line(*this);
1745 tmp
= new NetEUReduce(op_
, ip
);
1746 tmp
->set_line(*this);
1750 case '&': // Reduction AND
1751 case '|': // Reduction OR
1752 case '^': // Reduction XOR
1753 case 'A': // Reduction NAND (~&)
1754 case 'N': // Reduction NOR (~|)
1755 case 'X': // Reduction NXOR (~^)
1756 tmp
= new NetEUReduce(op_
, ip
);
1757 tmp
->set_line(*this);
1761 tmp
= new NetEUBits(op_
, ip
);
1762 tmp
->set_line(*this);