From 4a5a196e118a8fdbb311957d1442fc6c9c4c4c67 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Sat, 27 Jan 2024 16:56:27 +0000 Subject: [PATCH] Adjust encoding of Verilog logic values --- lib/nvc/verilog.vhd | 2 +- src/vlog/vlog-dump.c | 11 +++-------- src/vlog/vlog-lower.c | 2 +- src/vlog/vlog-number.c | 21 ++++++++++++++------- src/vlog/vlog-number.h | 8 ++++---- test/regress/vlog1.vhd | 2 +- test/test_dump.c | 8 ++++---- 7 files changed, 28 insertions(+), 26 deletions(-) diff --git a/lib/nvc/verilog.vhd b/lib/nvc/verilog.vhd index 753e536a..e044fdec 100644 --- a/lib/nvc/verilog.vhd +++ b/lib/nvc/verilog.vhd @@ -25,7 +25,7 @@ package verilog is type t_int64 is range -9223372036854775807 - 1 to 9223372036854775807; - type t_logic is ('0', '1', 'Z', 'X'); + type t_logic is ('X', 'Z', '0', '1'); type t_packed_logic is array (natural range <>) of t_logic; diff --git a/src/vlog/vlog-dump.c b/src/vlog/vlog-dump.c index d375c877..6d7a150f 100644 --- a/src/vlog/vlog-dump.c +++ b/src/vlog/vlog-dump.c @@ -267,15 +267,10 @@ static void vlog_dump_string(vlog_node_t v) static void vlog_dump_number(vlog_node_t v) { - number_t n = vlog_number(v); + LOCAL_TEXT_BUF tb = tb_new(); + number_print(vlog_number(v), tb); - const int width = number_width(n); - print_syntax("%d'b", width); - - for (int i = width - 1; i >= 0; i--) { - const char tab[] = "01zx"; - print_syntax("%c", tab[number_bit(n, i)]); - } + print_syntax("%s", tb_get(tb)); } static void vlog_dump_binary(vlog_node_t v) diff --git a/src/vlog/vlog-lower.c b/src/vlog/vlog-lower.c index 37075cbb..ac53e30a 100644 --- a/src/vlog/vlog-lower.c +++ b/src/vlog/vlog-lower.c @@ -195,7 +195,7 @@ static void vlog_lower_signal_decl(lower_unit_t *lu, vlog_node_t decl) vcode_reg_t size = emit_const(voffset, 1); vcode_reg_t count = emit_const(voffset, 1); - vcode_reg_t init = emit_const(vlogic, 3); + vcode_reg_t init = emit_const(vlogic, 0); vcode_reg_t flags = emit_const(voffset, 0); vcode_reg_t locus = vlog_debug_locus(decl); diff --git a/src/vlog/vlog-number.c b/src/vlog/vlog-number.c index 12723005..6d3fdeae 100644 --- a/src/vlog/vlog-number.c +++ b/src/vlog/vlog-number.c @@ -37,6 +37,8 @@ typedef struct _bignum { uint64_t packed[0]; } bignum_t; +#define PACKED_ZERO UINT64_C(0xaaaaaaaaaaaaaa) + number_t number_new(const char *str) { int width = -1; @@ -74,7 +76,7 @@ number_t number_new(const char *str) assert(width <= EMBED_WIDTH); - uint64_t packed = 0; + uint64_t packed = PACKED_ZERO; for (int i = width; i >= 0; i--) { packed <<= 2; if (bits & (1 << i)) @@ -91,7 +93,7 @@ number_t number_new(const char *str) }; } else if (width <= EMBED_WIDTH) { - uint64_t packed = 0; + uint64_t packed = PACKED_ZERO; for (; *p; p++) { switch (radix) { case RADIX_BIN: @@ -139,20 +141,25 @@ void number_print(number_t val, text_buf_t *tb) { tb_printf(tb, "%u'b", val.width); + static const char map[] = "xz01"; + bool leading = true; for (int i = val.width - 1; i >= 0; i--) { const int bit = (val.packed >> (i * 2)) & 3; - if (leading && bit > 0) + if (leading && bit != LOGIC_0) leading = false; else if (leading) continue; - tb_printf(tb, "%d", bit); + tb_append(tb, map[bit]); } + + if (leading) + tb_append(tb, '0'); } bool number_is_defined(number_t val) { - return !(val.packed & UINT64_C(0xaaaaaaaaaaaaaa)); + return (val.packed & PACKED_ZERO) == PACKED_ZERO; } int64_t number_integer(number_t val) @@ -195,9 +202,9 @@ number_t number_pack(const uint8_t *bits, unsigned width) { assert(width <= EMBED_WIDTH); - uint64_t packed = 0; + uint64_t packed = PACKED_ZERO; for (int i = width - 1; i >= 0; i--) { - assert(bits[i] <= LOGIC_X); + assert(bits[i] <= 0b11); packed <<= 2; packed |= bits[i]; } diff --git a/src/vlog/vlog-number.h b/src/vlog/vlog-number.h index 45ea5929..3bdf4f17 100644 --- a/src/vlog/vlog-number.h +++ b/src/vlog/vlog-number.h @@ -24,10 +24,10 @@ #include typedef enum { - LOGIC_0, - LOGIC_1, - LOGIC_Z, - LOGIC_X, + LOGIC_X = 0b00, + LOGIC_Z = 0b01, + LOGIC_0 = 0b10, + LOGIC_1 = 0b11, } vlog_logic_t; typedef struct _bignum bignum_t; diff --git a/test/regress/vlog1.vhd b/test/regress/vlog1.vhd index a37a11c3..7d10b352 100644 --- a/test/regress/vlog1.vhd +++ b/test/regress/vlog1.vhd @@ -33,7 +33,7 @@ begin clk <= '0'; d <= '0'; wait for 1 ns; - assert q = '1'; + assert q = 'U'; -- XXX wait; end process; diff --git a/test/test_dump.c b/test/test_dump.c index d3fb9762..327a0004 100644 --- a/test/test_dump.c +++ b/test/test_dump.c @@ -474,16 +474,16 @@ START_TEST(test_vlog1) vlog_dump(m2, 0); diff_dump(tb_get(tb), "module mod2;\n" - " wire [5'b00111:5'b00000] bus;\n" + " wire [5'b111:5'b0] bus;\n" " reg r;\n" " initial begin\n" " $display(\"hello\");\n" " if (bus)\n" - " r <= 5'b00001 | r;\n" + " r <= 5'b1 | r;\n" " $finish;\n" - " r = 5'b00001;\n" + " r = 5'b1;\n" " end\n" - " assign bus = 5'b00011;\n" + " assign bus = 5'b11;\n" "endmodule // mod2\n\n"); tb_rewind(tb); -- 2.39.2