From d219c877c61a0324affefdb43b8154cfc57608ae Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Sat, 10 Jul 2021 22:13:16 +0800 Subject: [PATCH] Fix elab unit test --- src/elab.c | 1 + src/eval.c | 6 ++++-- src/lower.c | 5 ++++- test/test_elab.c | 34 ++++++++++++++++++++++++++++++++-- 4 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/elab.c b/src/elab.c index 68cfe125..9d62b4a5 100644 --- a/src/elab.c +++ b/src/elab.c @@ -2786,6 +2786,7 @@ static void drv_extract(e_node_t proc, elab_ctx_t *ctx) case VCODE_OP_EVENT: case VCODE_OP_ACTIVE: case VCODE_OP_NOT: + case VCODE_OP_AND: { vcode_reg_t result = vcode_get_result(op); assert(result != VCODE_INVALID_REG); diff --git a/src/eval.c b/src/eval.c index 7cc6f612..3d33b0cd 100644 --- a/src/eval.c +++ b/src/eval.c @@ -41,7 +41,8 @@ typedef enum { VALUE_RECORD, VALUE_HEAP_PROXY, VALUE_IMAGE_MAP, - VALUE_ACCESS + VALUE_ACCESS, + VALUE_SIGNAL, } value_kind_t; typedef struct value value_t; @@ -1874,7 +1875,7 @@ static void eval_op_debug_out(int op, eval_state_t *state) static void eval_op_link_signal(int op, eval_state_t *state) { value_t *var = eval_get_var(vcode_get_address(op), state->context); - var->kind = VALUE_INVALID; + var->kind = VALUE_SIGNAL; } static void eval_vcode(eval_state_t *state) @@ -2052,6 +2053,7 @@ static void eval_vcode(eval_state_t *state) case VCODE_OP_TEMP_STACK_MARK: case VCODE_OP_TEMP_STACK_RESTORE: + case VCODE_OP_INIT_SIGNAL: break; case VCODE_OP_UARRAY_LEFT: diff --git a/src/lower.c b/src/lower.c index e3e88fd4..4191609e 100644 --- a/src/lower.c +++ b/src/lower.c @@ -2199,7 +2199,10 @@ static vcode_reg_t lower_param_ref(tree_t decl, expr_ctx_t ctx) } vcode_var_t var = obj & 0x3fffffff; - return emit_load_indirect(emit_var_upref(hops, var)); + if (hops == 0) + return emit_load(var); + else + return emit_load_indirect(emit_var_upref(hops, var)); } else { vcode_reg_t reg = obj; diff --git a/test/test_elab.c b/test/test_elab.c index edf8f27b..8b571e71 100644 --- a/test/test_elab.c +++ b/test/test_elab.c @@ -189,13 +189,43 @@ START_TEST(test_elab3) fail_unless(e_size(n0) == 1); fail_unless(e_signals(n0) == 1); + e_node_t n1 = e_nexus(e, 1); + fail_unless(e_pos(n1) == 1); + fail_unless(e_width(n1) == 4); + fail_unless(e_size(n1) == 1); + fail_unless(e_signals(n1) == 1); + e_node_t s0 = e_signal(n0, 0); - fail_unless(e_path(s0) == ident_new(":top2:s")); - fail_unless(e_ident(s0) == ident_new("S")); + fail_unless(e_path(s0) == ident_new(":top:q")); + fail_unless(e_ident(s0) == ident_new("Q")); fail_unless(e_width(s0) == 4); fail_unless(e_size(s0) == 1); fail_unless(e_nexuses(s0) == 1); fail_unless(e_nexus(s0, 0) == n0); + + e_node_t s1 = e_signal(n1, 0); + fail_unless(e_path(s1) == ident_new(":top:sub_i:s")); + fail_unless(e_ident(s1) == ident_new("S")); + fail_unless(e_width(s1) == 4); + fail_unless(e_size(s1) == 1); + fail_unless(e_nexuses(s1) == 1); + fail_unless(e_nexus(s1, 0) == n1); + + e_node_t top = e_scope(e, 0); + fail_unless(e_kind(top) == E_SCOPE); + fail_unless(e_signals(top) == 1); + fail_unless(e_signal(top, 0) == s0); + + e_node_t sub = e_scope(top, 0); + fail_unless(e_kind(sub) == E_SCOPE); + fail_unless(e_signals(sub) == 1); + fail_unless(e_signal(sub, 0) == s1); + fail_unless(e_generics(sub) == 1); + + e_node_t g0 = e_generic(sub, 0); + fail_unless(e_kind(g0) == E_GENERIC); + fail_unless(e_ident(g0) == ident_new("W")); + fail_unless(e_ival(g0) == 10); } END_TEST -- 2.39.2