From ce7db661a8b7318fd502f26253d810654f6c63b0 Mon Sep 17 00:00:00 2001 From: rherveille Date: Sun, 29 Sep 2024 23:03:01 +0200 Subject: [PATCH] Added cast to type support (#4284) --- frontends/ast/ast.cc | 16 +- frontends/ast/simplify.cc | 60 +++- frontends/verilog/verilog_parser.y | 6 + tests/verilog/size_cast.sv | 493 +++++++++++++++++++++++++++++ 4 files changed, 573 insertions(+), 2 deletions(-) diff --git a/frontends/ast/ast.cc b/frontends/ast/ast.cc index 6852ef5d325..127806fce69 100644 --- a/frontends/ast/ast.cc +++ b/frontends/ast/ast.cc @@ -478,6 +478,10 @@ void AstNode::dumpVlog(FILE *f, std::string indent) const fprintf(f, ";\n"); break; + case AST_WIRETYPE: + fprintf(f, "%s", id2vl(str).c_str()); + break; + case AST_MEMORY: fprintf(f, "%s" "memory", indent.c_str()); if (is_signed) @@ -694,7 +698,17 @@ void AstNode::dumpVlog(FILE *f, std::string indent) const break; case AST_CAST_SIZE: - children[0]->dumpVlog(f, ""); + switch (children[0]->type) + { + case AST_WIRE: + if (children[0]->children.size() > 0) + children[0]->children[0]->dumpVlog(f, ""); + else + fprintf(f, "%d'", children[0]->range_left - children[0]->range_right + 1); + break; + default: + children[0]->dumpVlog(f, ""); + } fprintf(f, "'("); children[1]->dumpVlog(f, ""); fprintf(f, ")"); diff --git a/frontends/ast/simplify.cc b/frontends/ast/simplify.cc index 3d8478ef160..fbf5b90aadf 100644 --- a/frontends/ast/simplify.cc +++ b/frontends/ast/simplify.cc @@ -1500,11 +1500,69 @@ bool AstNode::simplify(bool const_fold, int stage, int width_hint, bool sign_hin } break; + case AST_CAST_SIZE: { + int width = 1; + AstNode *node; + AstNode *child = children[0]; + + if (child->type == AST_WIRE) { + if (child->children.size() == 0) { + // Base type (e.g., int) + width = child->range_left - child->range_right +1; + node = mkconst_int(width, child->is_signed); + } else { + // User defined type + log_assert(child->children[0]->type == AST_WIRETYPE); + + const std::string &type_name = child->children[0]->str; + if (!current_scope.count(type_name)) + input_error("Unknown identifier `%s' used as type name\n", type_name.c_str()); + AstNode *resolved_type_node = current_scope.at(type_name); + if (resolved_type_node->type != AST_TYPEDEF) + input_error("`%s' does not name a type\n", type_name.c_str()); + log_assert(resolved_type_node->children.size() == 1); + AstNode *template_node = resolved_type_node->children[0]; + + // Ensure typedef itself is fully simplified + while (template_node->simplify(const_fold, stage, width_hint, sign_hint)) {}; + + switch (template_node->type) + { + case AST_WIRE: { + if (template_node->children.size() > 0 && template_node->children[0]->type == AST_RANGE) + width = range_width(this, template_node->children[0]); + child->delete_children(); + node = mkconst_int(width, true); + break; + } + + case AST_STRUCT: + case AST_UNION: { + child->delete_children(); + width = size_packed_struct(template_node, 0); + node = mkconst_int(width, false); + break; + } + + default: + log_error("Don't know how to translate static cast of type %s\n", type2str(template_node->type).c_str()); + } + } + + delete child; + children.erase(children.begin()); + children.insert(children.begin(), node); + } + + detect_width_simple = true; + children_are_self_determined = true; + break; + } + case AST_TO_BITS: case AST_TO_SIGNED: case AST_TO_UNSIGNED: case AST_SELFSZ: - case AST_CAST_SIZE: case AST_CONCAT: case AST_REPLICATE: case AST_REDUCE_AND: diff --git a/frontends/verilog/verilog_parser.y b/frontends/verilog/verilog_parser.y index 15a04eb2885..31d69ad0ca0 100644 --- a/frontends/verilog/verilog_parser.y +++ b/frontends/verilog/verilog_parser.y @@ -3506,6 +3506,12 @@ basic_expr: $$ = new AstNode(AST_CAST_SIZE, $1, $4); SET_AST_NODE_LOC($$, @1, @4); } | + typedef_base_type OP_CAST '(' expr ')' { + if (!sv_mode) + frontend_verilog_yyerror("Static cast is only supported in SystemVerilog mode."); + $$ = new AstNode(AST_CAST_SIZE, $1, $4); + SET_AST_NODE_LOC($$, @1, @4); + } | '(' expr '=' expr ')' { ensureAsgnExprAllowed(); AstNode *node = new AstNode(AST_ASSIGN_EQ, $2, $4); diff --git a/tests/verilog/size_cast.sv b/tests/verilog/size_cast.sv index 1636f8d701e..a1d6bfae554 100644 --- a/tests/verilog/size_cast.sv +++ b/tests/verilog/size_cast.sv @@ -15,6 +15,18 @@ module top; logic signed [1:0] L2sb10 = 2; logic signed [1:0] L2sb11 = 3; + typedef logic u1bit_t; + typedef logic signed s1bit_t; + typedef logic [1:0] u2bit_t; + typedef logic signed [1:0] s2bit_t; + typedef logic [2:0] u3bit_t; + + typedef struct packed { + u1bit_t sign; + u3bit_t msbs; + byte lsbs; + } s12bit_packed_struct_t; + logic y = 1; always @* begin @@ -32,6 +44,19 @@ module top; assert (1'(L2sb10) == 1'b0); assert (1'(L2sb11) == 1'b1); + assert (u1bit_t'(L1b0 ) == 1'b0); + assert (u1bit_t'(L1b1 ) == 1'b1); + assert (s1bit_t'(L1sb0 ) == 1'b0); + assert (s1bit_t'(L1sb1 ) == 1'b1); + assert (u1bit_t'(L2b00 ) == 1'b0); + assert (u1bit_t'(L2b01 ) == 1'b1); + assert (u1bit_t'(L2b10 ) == 1'b0); + assert (u1bit_t'(L2b11 ) == 1'b1); + assert (s1bit_t'(L2sb00) == 1'b0); + assert (s1bit_t'(L2sb01) == 1'b1); + assert (s1bit_t'(L2sb10) == 1'b0); + assert (s1bit_t'(L2sb11) == 1'b1); + assert (2'(L1b0 ) == 2'b00); assert (2'(L1b1 ) == 2'b01); assert (2'(L1sb0 ) == 2'b00); @@ -45,6 +70,19 @@ module top; assert (2'(L2sb10) == 2'b10); assert (2'(L2sb11) == 2'b11); + assert (u2bit_t'(L1b0 ) == 2'b00); + assert (u2bit_t'(L1b1 ) == 2'b01); + assert (s2bit_t'(L1sb0 ) == 2'b00); + assert (s2bit_t'(L1sb1 ) == 2'b11); + assert (u2bit_t'(L2b00 ) == 2'b00); + assert (u2bit_t'(L2b01 ) == 2'b01); + assert (u2bit_t'(L2b10 ) == 2'b10); + assert (u2bit_t'(L2b11 ) == 2'b11); + assert (s2bit_t'(L2sb00) == 2'b00); + assert (s2bit_t'(L2sb01) == 2'b01); + assert (s2bit_t'(L2sb10) == 2'b10); + assert (s2bit_t'(L2sb11) == 2'b11); + assert (3'(L1b0 ) == 3'b000); assert (3'(L1b1 ) == 3'b001); assert (3'(L1sb0 ) == 3'b000); @@ -58,6 +96,19 @@ module top; assert (3'(L2sb10) == 3'b110); assert (3'(L2sb11) == 3'b111); + assert (u3bit_t'(L1b0 ) == 3'b000); + assert (u3bit_t'(L1b1 ) == 3'b001); + assert (u3bit_t'(L1sb0 ) == 3'b000); + assert (u3bit_t'(L1sb1 ) == 3'b111); + assert (u3bit_t'(L2b00 ) == 3'b000); + assert (u3bit_t'(L2b01 ) == 3'b001); + assert (u3bit_t'(L2b10 ) == 3'b010); + assert (u3bit_t'(L2b11 ) == 3'b011); + assert (u3bit_t'(L2sb00) == 3'b000); + assert (u3bit_t'(L2sb01) == 3'b001); + assert (u3bit_t'(L2sb10) == 3'b110); + assert (u3bit_t'(L2sb11) == 3'b111); + assert (3'(L1b0 | '1) == 3'b111); assert (3'(L1b1 | '1) == 3'b111); assert (3'(L1sb0 | '1) == 3'b111); @@ -71,6 +122,58 @@ module top; assert (3'(L2sb10 | '1) == 3'b111); assert (3'(L2sb11 | '1) == 3'b111); + assert (u3bit_t'(L1b0 | '1) == 3'b111); + assert (u3bit_t'(L1b1 | '1) == 3'b111); + assert (u3bit_t'(L1sb0 | '1) == 3'b111); + assert (u3bit_t'(L1sb1 | '1) == 3'b111); + assert (u3bit_t'(L2b00 | '1) == 3'b111); + assert (u3bit_t'(L2b01 | '1) == 3'b111); + assert (u3bit_t'(L2b10 | '1) == 3'b111); + assert (u3bit_t'(L2b11 | '1) == 3'b111); + assert (u3bit_t'(L2sb00 | '1) == 3'b111); + assert (u3bit_t'(L2sb01 | '1) == 3'b111); + assert (u3bit_t'(L2sb10 | '1) == 3'b111); + assert (u3bit_t'(L2sb11 | '1) == 3'b111); + + assert (byte'(L1b0 | '1) == 8'hff); + assert (byte'(L1b1 | '1) == 8'hff); + assert (byte'(L1sb0 | '1) == 8'hff); + assert (byte'(L1sb1 | '1) == 8'hff); + assert (byte'(L2b00 | '1) == 8'hff); + assert (byte'(L2b01 | '1) == 8'hff); + assert (byte'(L2b10 | '1) == 8'hff); + assert (byte'(L2b11 | '1) == 8'hff); + assert (byte'(L2sb00 | '1) == 8'hff); + assert (byte'(L2sb01 | '1) == 8'hff); + assert (byte'(L2sb10 | '1) == 8'hff); + assert (byte'(L2sb11 | '1) == 8'hff); + + assert (int'(L1b0 | '1) == 32'hffff_ffff); + assert (int'(L1b1 | '1) == 32'hffff_ffff); + assert (int'(L1sb0 | '1) == 32'hffff_ffff); + assert (int'(L1sb1 | '1) == 32'hffff_ffff); + assert (int'(L2b00 | '1) == 32'hffff_ffff); + assert (int'(L2b01 | '1) == 32'hffff_ffff); + assert (int'(L2b10 | '1) == 32'hffff_ffff); + assert (int'(L2b11 | '1) == 32'hffff_ffff); + assert (int'(L2sb00 | '1) == 32'hffff_ffff); + assert (int'(L2sb01 | '1) == 32'hffff_ffff); + assert (int'(L2sb10 | '1) == 32'hffff_ffff); + assert (int'(L2sb11 | '1) == 32'hffff_ffff); + + assert (s12bit_packed_struct_t'(L1b0 | '1) == 12'hfff); + assert (s12bit_packed_struct_t'(L1b1 | '1) == 12'hfff); + assert (s12bit_packed_struct_t'(L1sb0 | '1) == 12'hfff); + assert (s12bit_packed_struct_t'(L1sb1 | '1) == 12'hfff); + assert (s12bit_packed_struct_t'(L2b00 | '1) == 12'hfff); + assert (s12bit_packed_struct_t'(L2b01 | '1) == 12'hfff); + assert (s12bit_packed_struct_t'(L2b10 | '1) == 12'hfff); + assert (s12bit_packed_struct_t'(L2b11 | '1) == 12'hfff); + assert (s12bit_packed_struct_t'(L2sb00 | '1) == 12'hfff); + assert (s12bit_packed_struct_t'(L2sb01 | '1) == 12'hfff); + assert (s12bit_packed_struct_t'(L2sb10 | '1) == 12'hfff); + assert (s12bit_packed_struct_t'(L2sb11 | '1) == 12'hfff); + assert (3'(L1b0 | '0) == 3'b000); assert (3'(L1b1 | '0) == 3'b001); assert (3'(L1sb0 | '0) == 3'b000); @@ -84,6 +187,58 @@ module top; assert (3'(L2sb10 | '0) == 3'b010); assert (3'(L2sb11 | '0) == 3'b011); + assert (u3bit_t'(L1b0 | '0) == 3'b000); + assert (u3bit_t'(L1b1 | '0) == 3'b001); + assert (u3bit_t'(L1sb0 | '0) == 3'b000); + assert (u3bit_t'(L1sb1 | '0) == 3'b001); + assert (u3bit_t'(L2b00 | '0) == 3'b000); + assert (u3bit_t'(L2b01 | '0) == 3'b001); + assert (u3bit_t'(L2b10 | '0) == 3'b010); + assert (u3bit_t'(L2b11 | '0) == 3'b011); + assert (u3bit_t'(L2sb00 | '0) == 3'b000); + assert (u3bit_t'(L2sb01 | '0) == 3'b001); + assert (u3bit_t'(L2sb10 | '0) == 3'b010); + assert (u3bit_t'(L2sb11 | '0) == 3'b011); + + assert (byte'(L1b0 | '0) == 8'h00); + assert (byte'(L1b1 | '0) == 8'h01); + assert (byte'(L1sb0 | '0) == 8'h00); + assert (byte'(L1sb1 | '0) == 8'h01); + assert (byte'(L2b00 | '0) == 8'h00); + assert (byte'(L2b01 | '0) == 8'h01); + assert (byte'(L2b10 | '0) == 8'h02); + assert (byte'(L2b11 | '0) == 8'h03); + assert (byte'(L2sb00 | '0) == 8'h00); + assert (byte'(L2sb01 | '0) == 8'h01); + assert (byte'(L2sb10 | '0) == 8'h02); + assert (byte'(L2sb11 | '0) == 8'h03); + + assert (int'(L1b0 | '0) == 32'h0000_0000); + assert (int'(L1b1 | '0) == 32'h0000_0001); + assert (int'(L1sb0 | '0) == 32'h0000_0000); + assert (int'(L1sb1 | '0) == 32'h0000_0001); + assert (int'(L2b00 | '0) == 32'h0000_0000); + assert (int'(L2b01 | '0) == 32'h0000_0001); + assert (int'(L2b10 | '0) == 32'h0000_0002); + assert (int'(L2b11 | '0) == 32'h0000_0003); + assert (int'(L2sb00 | '0) == 32'h0000_0000); + assert (int'(L2sb01 | '0) == 32'h0000_0001); + assert (int'(L2sb10 | '0) == 32'h0000_0002); + assert (int'(L2sb11 | '0) == 32'h0000_0003); + + assert (s12bit_packed_struct_t'(L1b0 | '0) == 12'h000); + assert (s12bit_packed_struct_t'(L1b1 | '0) == 12'h001); + assert (s12bit_packed_struct_t'(L1sb0 | '0) == 12'h000); + assert (s12bit_packed_struct_t'(L1sb1 | '0) == 12'h001); + assert (s12bit_packed_struct_t'(L2b00 | '0) == 12'h000); + assert (s12bit_packed_struct_t'(L2b01 | '0) == 12'h001); + assert (s12bit_packed_struct_t'(L2b10 | '0) == 12'h002); + assert (s12bit_packed_struct_t'(L2b11 | '0) == 12'h003); + assert (s12bit_packed_struct_t'(L2sb00 | '0) == 12'h000); + assert (s12bit_packed_struct_t'(L2sb01 | '0) == 12'h001); + assert (s12bit_packed_struct_t'(L2sb10 | '0) == 12'h002); + assert (s12bit_packed_struct_t'(L2sb11 | '0) == 12'h003); + assert (3'(y ? L1b0 : '1) == 3'b000); assert (3'(y ? L1b1 : '1) == 3'b001); assert (3'(y ? L1sb0 : '1) == 3'b000); @@ -97,6 +252,58 @@ module top; assert (3'(y ? L2sb10 : '1) == 3'b010); assert (3'(y ? L2sb11 : '1) == 3'b011); + assert (u3bit_t'(y ? L1b0 : '1) == 3'b000); + assert (u3bit_t'(y ? L1b1 : '1) == 3'b001); + assert (u3bit_t'(y ? L1sb0 : '1) == 3'b000); + assert (u3bit_t'(y ? L1sb1 : '1) == 3'b001); + assert (u3bit_t'(y ? L2b00 : '1) == 3'b000); + assert (u3bit_t'(y ? L2b01 : '1) == 3'b001); + assert (u3bit_t'(y ? L2b10 : '1) == 3'b010); + assert (u3bit_t'(y ? L2b11 : '1) == 3'b011); + assert (u3bit_t'(y ? L2sb00 : '1) == 3'b000); + assert (u3bit_t'(y ? L2sb01 : '1) == 3'b001); + assert (u3bit_t'(y ? L2sb10 : '1) == 3'b010); + assert (u3bit_t'(y ? L2sb11 : '1) == 3'b011); + + assert (byte'(y ? L1b0 : '1) == 8'h00); + assert (byte'(y ? L1b1 : '1) == 8'h01); + assert (byte'(y ? L1sb0 : '1) == 8'h00); + assert (byte'(y ? L1sb1 : '1) == 8'h01); + assert (byte'(y ? L2b00 : '1) == 8'h00); + assert (byte'(y ? L2b01 : '1) == 8'h01); + assert (byte'(y ? L2b10 : '1) == 8'h02); + assert (byte'(y ? L2b11 : '1) == 8'h03); + assert (byte'(y ? L2sb00 : '1) == 8'h00); + assert (byte'(y ? L2sb01 : '1) == 8'h01); + assert (byte'(y ? L2sb10 : '1) == 8'h02); + assert (byte'(y ? L2sb11 : '1) == 8'h03); + + assert (int'(y ? L1b0 : '1) == 32'h0000_0000); + assert (int'(y ? L1b1 : '1) == 32'h0000_0001); + assert (int'(y ? L1sb0 : '1) == 32'h0000_0000); + assert (int'(y ? L1sb1 : '1) == 32'h0000_0001); + assert (int'(y ? L2b00 : '1) == 32'h0000_0000); + assert (int'(y ? L2b01 : '1) == 32'h0000_0001); + assert (int'(y ? L2b10 : '1) == 32'h0000_0002); + assert (int'(y ? L2b11 : '1) == 32'h0000_0003); + assert (int'(y ? L2sb00 : '1) == 32'h0000_0000); + assert (int'(y ? L2sb01 : '1) == 32'h0000_0001); + assert (int'(y ? L2sb10 : '1) == 32'h0000_0002); + assert (int'(y ? L2sb11 : '1) == 32'h0000_0003); + + assert (s12bit_packed_struct_t'(y ? L1b0 : '1) == 12'h000); + assert (s12bit_packed_struct_t'(y ? L1b1 : '1) == 12'h001); + assert (s12bit_packed_struct_t'(y ? L1sb0 : '1) == 12'h000); + assert (s12bit_packed_struct_t'(y ? L1sb1 : '1) == 12'h001); + assert (s12bit_packed_struct_t'(y ? L2b00 : '1) == 12'h000); + assert (s12bit_packed_struct_t'(y ? L2b01 : '1) == 12'h001); + assert (s12bit_packed_struct_t'(y ? L2b10 : '1) == 12'h002); + assert (s12bit_packed_struct_t'(y ? L2b11 : '1) == 12'h003); + assert (s12bit_packed_struct_t'(y ? L2sb00 : '1) == 12'h000); + assert (s12bit_packed_struct_t'(y ? L2sb01 : '1) == 12'h001); + assert (s12bit_packed_struct_t'(y ? L2sb10 : '1) == 12'h002); + assert (s12bit_packed_struct_t'(y ? L2sb11 : '1) == 12'h003); + assert (3'(y ? L1b0 : '0) == 3'b000); assert (3'(y ? L1b1 : '0) == 3'b001); assert (3'(y ? L1sb0 : '0) == 3'b000); @@ -110,6 +317,58 @@ module top; assert (3'(y ? L2sb10 : '0) == 3'b010); assert (3'(y ? L2sb11 : '0) == 3'b011); + assert (u3bit_t'(y ? L1b0 : '0) == 3'b000); + assert (u3bit_t'(y ? L1b1 : '0) == 3'b001); + assert (u3bit_t'(y ? L1sb0 : '0) == 3'b000); + assert (u3bit_t'(y ? L1sb1 : '0) == 3'b001); + assert (u3bit_t'(y ? L2b00 : '0) == 3'b000); + assert (u3bit_t'(y ? L2b01 : '0) == 3'b001); + assert (u3bit_t'(y ? L2b10 : '0) == 3'b010); + assert (u3bit_t'(y ? L2b11 : '0) == 3'b011); + assert (u3bit_t'(y ? L2sb00 : '0) == 3'b000); + assert (u3bit_t'(y ? L2sb01 : '0) == 3'b001); + assert (u3bit_t'(y ? L2sb10 : '0) == 3'b010); + assert (u3bit_t'(y ? L2sb11 : '0) == 3'b011); + + assert (byte'(y ? L1b0 : '0) == 8'h00); + assert (byte'(y ? L1b1 : '0) == 8'h01); + assert (byte'(y ? L1sb0 : '0) == 8'h00); + assert (byte'(y ? L1sb1 : '0) == 8'h01); + assert (byte'(y ? L2b00 : '0) == 8'h00); + assert (byte'(y ? L2b01 : '0) == 8'h01); + assert (byte'(y ? L2b10 : '0) == 8'h02); + assert (byte'(y ? L2b11 : '0) == 8'h03); + assert (byte'(y ? L2sb00 : '0) == 8'h00); + assert (byte'(y ? L2sb01 : '0) == 8'h01); + assert (byte'(y ? L2sb10 : '0) == 8'h02); + assert (byte'(y ? L2sb11 : '0) == 8'h03); + + assert (int'(y ? L1b0 : '0) == 32'h0000_0000); + assert (int'(y ? L1b1 : '0) == 32'h0000_0001); + assert (int'(y ? L1sb0 : '0) == 32'h0000_0000); + assert (int'(y ? L1sb1 : '0) == 32'h0000_0001); + assert (int'(y ? L2b00 : '0) == 32'h0000_0000); + assert (int'(y ? L2b01 : '0) == 32'h0000_0001); + assert (int'(y ? L2b10 : '0) == 32'h0000_0002); + assert (int'(y ? L2b11 : '0) == 32'h0000_0003); + assert (int'(y ? L2sb00 : '0) == 32'h0000_0000); + assert (int'(y ? L2sb01 : '0) == 32'h0000_0001); + assert (int'(y ? L2sb10 : '0) == 32'h0000_0002); + assert (int'(y ? L2sb11 : '0) == 32'h0000_0003); + + assert (s12bit_packed_struct_t'(y ? L1b0 : '0) == 12'h000); + assert (s12bit_packed_struct_t'(y ? L1b1 : '0) == 12'h001); + assert (s12bit_packed_struct_t'(y ? L1sb0 : '0) == 12'h000); + assert (s12bit_packed_struct_t'(y ? L1sb1 : '0) == 12'h001); + assert (s12bit_packed_struct_t'(y ? L2b00 : '0) == 12'h000); + assert (s12bit_packed_struct_t'(y ? L2b01 : '0) == 12'h001); + assert (s12bit_packed_struct_t'(y ? L2b10 : '0) == 12'h002); + assert (s12bit_packed_struct_t'(y ? L2b11 : '0) == 12'h003); + assert (s12bit_packed_struct_t'(y ? L2sb00 : '0) == 12'h000); + assert (s12bit_packed_struct_t'(y ? L2sb01 : '0) == 12'h001); + assert (s12bit_packed_struct_t'(y ? L2sb10 : '0) == 12'h002); + assert (s12bit_packed_struct_t'(y ? L2sb11 : '0) == 12'h003); + assert (3'(y ? L1b0 : 1'sb0) == 3'b000); assert (3'(y ? L1b1 : 1'sb0) == 3'b001); assert (3'(y ? L1sb0 : 1'sb0) == 3'b000); @@ -123,6 +382,123 @@ module top; assert (3'(y ? L2sb10 : 1'sb0) == 3'b110); assert (3'(y ? L2sb11 : 1'sb0) == 3'b111); + assert (u3bit_t'(y ? L1b0 : 1'sb0) == 3'b000); + assert (u3bit_t'(y ? L1b1 : 1'sb0) == 3'b001); + assert (u3bit_t'(y ? L1sb0 : 1'sb0) == 3'b000); + assert (u3bit_t'(y ? L1sb1 : 1'sb0) == 3'b111); + assert (u3bit_t'(y ? L2b00 : 1'sb0) == 3'b000); + assert (u3bit_t'(y ? L2b01 : 1'sb0) == 3'b001); + assert (u3bit_t'(y ? L2b10 : 1'sb0) == 3'b010); + assert (u3bit_t'(y ? L2b11 : 1'sb0) == 3'b011); + assert (u3bit_t'(y ? L2sb00 : 1'sb0) == 3'b000); + assert (u3bit_t'(y ? L2sb01 : 1'sb0) == 3'b001); + assert (u3bit_t'(y ? L2sb10 : 1'sb0) == 3'b110); + assert (u3bit_t'(y ? L2sb11 : 1'sb0) == 3'b111); + + assert (byte'(y ? L1b0 : 1'sb0) == 8'h00); + assert (byte'(y ? L1b1 : 1'sb0) == 8'h01); + assert (byte'(y ? L1sb0 : 1'sb0) == 8'h00); + assert (byte'(y ? L1sb1 : 1'sb0) == 8'hff); + assert (byte'(y ? L2b00 : 1'sb0) == 8'h00); + assert (byte'(y ? L2b01 : 1'sb0) == 8'h01); + assert (byte'(y ? L2b10 : 1'sb0) == 8'h02); + assert (byte'(y ? L2b11 : 1'sb0) == 8'h03); + assert (byte'(y ? L2sb00 : 1'sb0) == 8'h00); + assert (byte'(y ? L2sb01 : 1'sb0) == 8'h01); + assert (byte'(y ? L2sb10 : 1'sb0) == 8'hfe); + assert (byte'(y ? L2sb11 : 1'sb0) == 8'hff); + + assert (int'(y ? L1b0 : 1'sb0) == 32'h0000_0000); + assert (int'(y ? L1b1 : 1'sb0) == 32'h0000_0001); + assert (int'(y ? L1sb0 : 1'sb0) == 32'h0000_0000); + assert (int'(y ? L1sb1 : 1'sb0) == 32'hffff_ffff); + assert (int'(y ? L2b00 : 1'sb0) == 32'h0000_0000); + assert (int'(y ? L2b01 : 1'sb0) == 32'h0000_0001); + assert (int'(y ? L2b10 : 1'sb0) == 32'h0000_0002); + assert (int'(y ? L2b11 : 1'sb0) == 32'h0000_0003); + assert (int'(y ? L2sb00 : 1'sb0) == 32'h0000_0000); + assert (int'(y ? L2sb01 : 1'sb0) == 32'h0000_0001); + assert (int'(y ? L2sb10 : 1'sb0) == 32'hffff_fffe); + assert (int'(y ? L2sb11 : 1'sb0) == 32'hffff_ffff); + + assert (s12bit_packed_struct_t'(y ? L1b0 : 1'sb0) == 12'h000); + assert (s12bit_packed_struct_t'(y ? L1b1 : 1'sb0) == 12'h001); + assert (s12bit_packed_struct_t'(y ? L1sb0 : 1'sb0) == 12'h000); + assert (s12bit_packed_struct_t'(y ? L1sb1 : 1'sb0) == 12'hfff); + assert (s12bit_packed_struct_t'(y ? L2b00 : 1'sb0) == 12'h000); + assert (s12bit_packed_struct_t'(y ? L2b01 : 1'sb0) == 12'h001); + assert (s12bit_packed_struct_t'(y ? L2b10 : 1'sb0) == 12'h002); + assert (s12bit_packed_struct_t'(y ? L2b11 : 1'sb0) == 12'h003); + assert (s12bit_packed_struct_t'(y ? L2sb00 : 1'sb0) == 12'h000); + assert (s12bit_packed_struct_t'(y ? L2sb01 : 1'sb0) == 12'h001); + assert (s12bit_packed_struct_t'(y ? L2sb10 : 1'sb0) == 12'hffe); + assert (s12bit_packed_struct_t'(y ? L2sb11 : 1'sb0) == 12'hfff); + + assert (3'(y ? L1b0 : s1bit_t'(0)) == 3'b000); + assert (3'(y ? L1b1 : s1bit_t'(0)) == 3'b001); + assert (3'(y ? L1sb0 : s1bit_t'(0)) == 3'b000); + assert (3'(y ? L1sb1 : s1bit_t'(0)) == 3'b111); + assert (3'(y ? L2b00 : s1bit_t'(0)) == 3'b000); + assert (3'(y ? L2b01 : s1bit_t'(0)) == 3'b001); + assert (3'(y ? L2b10 : s1bit_t'(0)) == 3'b010); + assert (3'(y ? L2b11 : s1bit_t'(0)) == 3'b011); + assert (3'(y ? L2sb00 : s1bit_t'(0)) == 3'b000); + assert (3'(y ? L2sb01 : s1bit_t'(0)) == 3'b001); + assert (3'(y ? L2sb10 : s1bit_t'(0)) == 3'b110); + assert (3'(y ? L2sb11 : s1bit_t'(0)) == 3'b111); + + assert (u3bit_t'(y ? L1b0 : s1bit_t'(0)) == 3'b000); + assert (u3bit_t'(y ? L1b1 : s1bit_t'(0)) == 3'b001); + assert (u3bit_t'(y ? L1sb0 : s1bit_t'(0)) == 3'b000); + assert (u3bit_t'(y ? L1sb1 : s1bit_t'(0)) == 3'b111); + assert (u3bit_t'(y ? L2b00 : s1bit_t'(0)) == 3'b000); + assert (u3bit_t'(y ? L2b01 : s1bit_t'(0)) == 3'b001); + assert (u3bit_t'(y ? L2b10 : s1bit_t'(0)) == 3'b010); + assert (u3bit_t'(y ? L2b11 : s1bit_t'(0)) == 3'b011); + assert (u3bit_t'(y ? L2sb00 : s1bit_t'(0)) == 3'b000); + assert (u3bit_t'(y ? L2sb01 : s1bit_t'(0)) == 3'b001); + assert (u3bit_t'(y ? L2sb10 : s1bit_t'(0)) == 3'b110); + assert (u3bit_t'(y ? L2sb11 : s1bit_t'(0)) == 3'b111); + + assert (byte'(y ? L1b0 : s1bit_t'(0)) == 8'h00); + assert (byte'(y ? L1b1 : s1bit_t'(0)) == 8'h01); + assert (byte'(y ? L1sb0 : s1bit_t'(0)) == 8'h00); + assert (byte'(y ? L1sb1 : s1bit_t'(0)) == 8'hff); + assert (byte'(y ? L2b00 : s1bit_t'(0)) == 8'h00); + assert (byte'(y ? L2b01 : s1bit_t'(0)) == 8'h01); + assert (byte'(y ? L2b10 : s1bit_t'(0)) == 8'h02); + assert (byte'(y ? L2b11 : s1bit_t'(0)) == 8'h03); + assert (byte'(y ? L2sb00 : s1bit_t'(0)) == 8'h00); + assert (byte'(y ? L2sb01 : s1bit_t'(0)) == 8'h01); + assert (byte'(y ? L2sb10 : s1bit_t'(0)) == 8'hfe); + assert (byte'(y ? L2sb11 : s1bit_t'(0)) == 8'hff); + + assert (int'(y ? L1b0 : s1bit_t'(0)) == 32'h0000_0000); + assert (int'(y ? L1b1 : s1bit_t'(0)) == 32'h0000_0001); + assert (int'(y ? L1sb0 : s1bit_t'(0)) == 32'h0000_0000); + assert (int'(y ? L1sb1 : s1bit_t'(0)) == 32'hffff_ffff); + assert (int'(y ? L2b00 : s1bit_t'(0)) == 32'h0000_0000); + assert (int'(y ? L2b01 : s1bit_t'(0)) == 32'h0000_0001); + assert (int'(y ? L2b10 : s1bit_t'(0)) == 32'h0000_0002); + assert (int'(y ? L2b11 : s1bit_t'(0)) == 32'h0000_0003); + assert (int'(y ? L2sb00 : s1bit_t'(0)) == 32'h0000_0000); + assert (int'(y ? L2sb01 : s1bit_t'(0)) == 32'h0000_0001); + assert (int'(y ? L2sb10 : s1bit_t'(0)) == 32'hffff_fffe); + assert (int'(y ? L2sb11 : s1bit_t'(0)) == 32'hffff_ffff); + + assert (s12bit_packed_struct_t'(y ? L1b0 : s1bit_t'(0)) == 12'h000); + assert (s12bit_packed_struct_t'(y ? L1b1 : s1bit_t'(0)) == 12'h001); + assert (s12bit_packed_struct_t'(y ? L1sb0 : s1bit_t'(0)) == 12'h000); + assert (s12bit_packed_struct_t'(y ? L1sb1 : s1bit_t'(0)) == 12'hfff); + assert (s12bit_packed_struct_t'(y ? L2b00 : s1bit_t'(0)) == 12'h000); + assert (s12bit_packed_struct_t'(y ? L2b01 : s1bit_t'(0)) == 12'h001); + assert (s12bit_packed_struct_t'(y ? L2b10 : s1bit_t'(0)) == 12'h002); + assert (s12bit_packed_struct_t'(y ? L2b11 : s1bit_t'(0)) == 12'h003); + assert (s12bit_packed_struct_t'(y ? L2sb00 : s1bit_t'(0)) == 12'h000); + assert (s12bit_packed_struct_t'(y ? L2sb01 : s1bit_t'(0)) == 12'h001); + assert (s12bit_packed_struct_t'(y ? L2sb10 : s1bit_t'(0)) == 12'hffe); + assert (s12bit_packed_struct_t'(y ? L2sb11 : s1bit_t'(0)) == 12'hfff); + assert (3'(y ? L1b0 : 1'sb1) == 3'b000); assert (3'(y ? L1b1 : 1'sb1) == 3'b001); assert (3'(y ? L1sb0 : 1'sb1) == 3'b000); @@ -136,5 +512,122 @@ module top; assert (3'(y ? L2sb10 : 1'sb1) == 3'b110); assert (3'(y ? L2sb11 : 1'sb1) == 3'b111); + assert (u3bit_t'(y ? L1b0 : 1'sb1) == 3'b000); + assert (u3bit_t'(y ? L1b1 : 1'sb1) == 3'b001); + assert (u3bit_t'(y ? L1sb0 : 1'sb1) == 3'b000); + assert (u3bit_t'(y ? L1sb1 : 1'sb1) == 3'b111); + assert (u3bit_t'(y ? L2b00 : 1'sb1) == 3'b000); + assert (u3bit_t'(y ? L2b01 : 1'sb1) == 3'b001); + assert (u3bit_t'(y ? L2b10 : 1'sb1) == 3'b010); + assert (u3bit_t'(y ? L2b11 : 1'sb1) == 3'b011); + assert (u3bit_t'(y ? L2sb00 : 1'sb1) == 3'b000); + assert (u3bit_t'(y ? L2sb01 : 1'sb1) == 3'b001); + assert (u3bit_t'(y ? L2sb10 : 1'sb1) == 3'b110); + assert (u3bit_t'(y ? L2sb11 : 1'sb1) == 3'b111); + + assert (byte'(y ? L1b0 : 1'sb1) == 8'h00); + assert (byte'(y ? L1b1 : 1'sb1) == 8'h01); + assert (byte'(y ? L1sb0 : 1'sb1) == 8'h00); + assert (byte'(y ? L1sb1 : 1'sb1) == 8'hff); + assert (byte'(y ? L2b00 : 1'sb1) == 8'h00); + assert (byte'(y ? L2b01 : 1'sb1) == 8'h01); + assert (byte'(y ? L2b10 : 1'sb1) == 8'h02); + assert (byte'(y ? L2b11 : 1'sb1) == 8'h03); + assert (byte'(y ? L2sb00 : 1'sb1) == 8'h00); + assert (byte'(y ? L2sb01 : 1'sb1) == 8'h01); + assert (byte'(y ? L2sb10 : 1'sb1) == 8'hfe); + assert (byte'(y ? L2sb11 : 1'sb1) == 8'hff); + + assert (int'(y ? L1b0 : 1'sb1) == 32'h0000_0000); + assert (int'(y ? L1b1 : 1'sb1) == 32'h0000_0001); + assert (int'(y ? L1sb0 : 1'sb1) == 32'h0000_0000); + assert (int'(y ? L1sb1 : 1'sb1) == 32'hffff_ffff); + assert (int'(y ? L2b00 : 1'sb1) == 32'h0000_0000); + assert (int'(y ? L2b01 : 1'sb1) == 32'h0000_0001); + assert (int'(y ? L2b10 : 1'sb1) == 32'h0000_0002); + assert (int'(y ? L2b11 : 1'sb1) == 32'h0000_0003); + assert (int'(y ? L2sb00 : 1'sb1) == 32'h0000_0000); + assert (int'(y ? L2sb01 : 1'sb1) == 32'h0000_0001); + assert (int'(y ? L2sb10 : 1'sb1) == 32'hffff_fffe); + assert (int'(y ? L2sb11 : 1'sb1) == 32'hffff_ffff); + + assert (s12bit_packed_struct_t'(y ? L1b0 : 1'sb1) == 12'h000); + assert (s12bit_packed_struct_t'(y ? L1b1 : 1'sb1) == 12'h001); + assert (s12bit_packed_struct_t'(y ? L1sb0 : 1'sb1) == 12'h000); + assert (s12bit_packed_struct_t'(y ? L1sb1 : 1'sb1) == 12'hfff); + assert (s12bit_packed_struct_t'(y ? L2b00 : 1'sb1) == 12'h000); + assert (s12bit_packed_struct_t'(y ? L2b01 : 1'sb1) == 12'h001); + assert (s12bit_packed_struct_t'(y ? L2b10 : 1'sb1) == 12'h002); + assert (s12bit_packed_struct_t'(y ? L2b11 : 1'sb1) == 12'h003); + assert (s12bit_packed_struct_t'(y ? L2sb00 : 1'sb1) == 12'h000); + assert (s12bit_packed_struct_t'(y ? L2sb01 : 1'sb1) == 12'h001); + assert (s12bit_packed_struct_t'(y ? L2sb10 : 1'sb1) == 12'hffe); + assert (s12bit_packed_struct_t'(y ? L2sb11 : 1'sb1) == 12'hfff); + + assert (3'(y ? L1b0 : s1bit_t'(1)) == 3'b000); + assert (3'(y ? L1b1 : s1bit_t'(1)) == 3'b001); + assert (3'(y ? L1sb0 : s1bit_t'(1)) == 3'b000); + assert (3'(y ? L1sb1 : s1bit_t'(1)) == 3'b111); + assert (3'(y ? L2b00 : s1bit_t'(1)) == 3'b000); + assert (3'(y ? L2b01 : s1bit_t'(1)) == 3'b001); + assert (3'(y ? L2b10 : s1bit_t'(1)) == 3'b010); + assert (3'(y ? L2b11 : s1bit_t'(1)) == 3'b011); + assert (3'(y ? L2sb00 : s1bit_t'(1)) == 3'b000); + assert (3'(y ? L2sb01 : s1bit_t'(1)) == 3'b001); + assert (3'(y ? L2sb10 : s1bit_t'(1)) == 3'b110); + assert (3'(y ? L2sb11 : s1bit_t'(1)) == 3'b111); + + assert (u3bit_t'(y ? L1b0 : s1bit_t'(1)) == 3'b000); + assert (u3bit_t'(y ? L1b1 : s1bit_t'(1)) == 3'b001); + assert (u3bit_t'(y ? L1sb0 : s1bit_t'(1)) == 3'b000); + assert (u3bit_t'(y ? L1sb1 : s1bit_t'(1)) == 3'b111); + assert (u3bit_t'(y ? L2b00 : s1bit_t'(1)) == 3'b000); + assert (u3bit_t'(y ? L2b01 : s1bit_t'(1)) == 3'b001); + assert (u3bit_t'(y ? L2b10 : s1bit_t'(1)) == 3'b010); + assert (u3bit_t'(y ? L2b11 : s1bit_t'(1)) == 3'b011); + assert (u3bit_t'(y ? L2sb00 : s1bit_t'(1)) == 3'b000); + assert (u3bit_t'(y ? L2sb01 : s1bit_t'(1)) == 3'b001); + assert (u3bit_t'(y ? L2sb10 : s1bit_t'(1)) == 3'b110); + assert (u3bit_t'(y ? L2sb11 : s1bit_t'(1)) == 3'b111); + + assert (byte'(y ? L1b0 : s1bit_t'(1)) == 8'h00); + assert (byte'(y ? L1b1 : s1bit_t'(1)) == 8'h01); + assert (byte'(y ? L1sb0 : s1bit_t'(1)) == 8'h00); + assert (byte'(y ? L1sb1 : s1bit_t'(1)) == 8'hff); + assert (byte'(y ? L2b00 : s1bit_t'(1)) == 8'h00); + assert (byte'(y ? L2b01 : s1bit_t'(1)) == 8'h01); + assert (byte'(y ? L2b10 : s1bit_t'(1)) == 8'h02); + assert (byte'(y ? L2b11 : s1bit_t'(1)) == 8'h03); + assert (byte'(y ? L2sb00 : s1bit_t'(1)) == 8'h00); + assert (byte'(y ? L2sb01 : s1bit_t'(1)) == 8'h01); + assert (byte'(y ? L2sb10 : s1bit_t'(1)) == 8'hfe); + assert (byte'(y ? L2sb11 : s1bit_t'(1)) == 8'hff); + + assert (int'(y ? L1b0 : s1bit_t'(1)) == 32'h0000_0000); + assert (int'(y ? L1b1 : s1bit_t'(1)) == 32'h0000_0001); + assert (int'(y ? L1sb0 : s1bit_t'(1)) == 32'h0000_0000); + assert (int'(y ? L1sb1 : s1bit_t'(1)) == 32'hffff_ffff); + assert (int'(y ? L2b00 : s1bit_t'(1)) == 32'h0000_0000); + assert (int'(y ? L2b01 : s1bit_t'(1)) == 32'h0000_0001); + assert (int'(y ? L2b10 : s1bit_t'(1)) == 32'h0000_0002); + assert (int'(y ? L2b11 : s1bit_t'(1)) == 32'h0000_0003); + assert (int'(y ? L2sb00 : s1bit_t'(1)) == 32'h0000_0000); + assert (int'(y ? L2sb01 : s1bit_t'(1)) == 32'h0000_0001); + assert (int'(y ? L2sb10 : s1bit_t'(1)) == 32'hffff_fffe); + assert (int'(y ? L2sb11 : s1bit_t'(1)) == 32'hffff_ffff); + + assert (s12bit_packed_struct_t'(y ? L1b0 : s1bit_t'(1)) == 12'h000); + assert (s12bit_packed_struct_t'(y ? L1b1 : s1bit_t'(1)) == 12'h001); + assert (s12bit_packed_struct_t'(y ? L1sb0 : s1bit_t'(1)) == 12'h000); + assert (s12bit_packed_struct_t'(y ? L1sb1 : s1bit_t'(1)) == 12'hfff); + assert (s12bit_packed_struct_t'(y ? L2b00 : s1bit_t'(1)) == 12'h000); + assert (s12bit_packed_struct_t'(y ? L2b01 : s1bit_t'(1)) == 12'h001); + assert (s12bit_packed_struct_t'(y ? L2b10 : s1bit_t'(1)) == 12'h002); + assert (s12bit_packed_struct_t'(y ? L2b11 : s1bit_t'(1)) == 12'h003); + assert (s12bit_packed_struct_t'(y ? L2sb00 : s1bit_t'(1)) == 12'h000); + assert (s12bit_packed_struct_t'(y ? L2sb01 : s1bit_t'(1)) == 12'h001); + assert (s12bit_packed_struct_t'(y ? L2sb10 : s1bit_t'(1)) == 12'hffe); + assert (s12bit_packed_struct_t'(y ? L2sb11 : s1bit_t'(1)) == 12'hfff); + end endmodule