systemverilog-plugin: add support for case type Signed-off-by: Kamil Rakoczy <krakoczy@antmicro.com>
diff --git a/systemverilog-plugin/UhdmAst.cc b/systemverilog-plugin/UhdmAst.cc index 3c2ae3e..0a6f6c9 100644 --- a/systemverilog-plugin/UhdmAst.cc +++ b/systemverilog-plugin/UhdmAst.cc
@@ -3430,8 +3430,28 @@ void UhdmAst::process_case() { current_node = make_ast_node(AST::AST_CASE); + auto cond_type = AST::AST_COND; + switch (vpi_get(vpiCaseType, obj_h)) { + case vpiCaseExact: + cond_type = AST::AST_COND; + break; + case vpiCaseX: + cond_type = AST::AST_CONDX; + break; + case vpiCaseZ: + cond_type = AST::AST_CONDZ; + break; + default: { + const uhdm_handle *const handle = (const uhdm_handle *)obj_h; + const UHDM::BaseClass *const object = (const UHDM::BaseClass *)handle->object; + report_error("%.*s:%d: Unknown case type", (int)object->VpiFile().length(), object->VpiFile().data(), object->VpiLineNo()); + } + } visit_one_to_one({vpiCondition}, obj_h, [&](AST::AstNode *node) { current_node->children.push_back(node); }); - visit_one_to_many({vpiCaseItem}, obj_h, [&](AST::AstNode *node) { current_node->children.push_back(node); }); + visit_one_to_many({vpiCaseItem}, obj_h, [&](AST::AstNode *node) { + node->type = cond_type; + current_node->children.push_back(node); + }); } void UhdmAst::process_case_item()