Skip to content

Commit

Permalink
symbol_table: implicit declarations
Browse files Browse the repository at this point in the history
Signed-off-by: Lukasz Dalek <[email protected]>
  • Loading branch information
Lukasz Dalek committed Mar 23, 2021
1 parent f7939bd commit 17e69b4
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 2 deletions.
51 changes: 49 additions & 2 deletions verilog/analysis/symbol_table.cc
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,9 @@ class SymbolTable::Builder : public TreeContextVisitor {
case NodeEnum::kEnumType:
DescendEnumType(node);
break;
case NodeEnum::kLPValue:
HandlePossibleImplicitDeclaration(node);
break;
default:
Descend(node);
break;
Expand Down Expand Up @@ -508,6 +511,44 @@ class SymbolTable::Builder : public TreeContextVisitor {
}
}

void HandlePossibleImplicitDeclaration(const SyntaxTreeNode& node) {
VLOG(2) << __FUNCTION__;

// Only left-hand side of continuous assignment statements are allowed to
// implicitly declare nets (LRM 6.10: Implicit declarations).
if (Context().DirectParentsAre({NodeEnum::kNetVariableAssignment,
NodeEnum::kAssignmentList,
NodeEnum::kContinuousAssignmentStatement})) {
CHECK(node.MatchesTag(NodeEnum::kLPValue));
const absl::string_view anon_name =
current_scope_->Value().CreateAnonymousScope("implicit");
DeclareScopedElementAndDescend(node, anon_name,
SymbolMetaType::kDataNetVariableInstance);

// Declare possible implicit declaration
//EmplaceElementInCurrentScope(node, "/implicit/",
// SymbolMetaType::kDataNetVariableInstance);

//CHECK_EQ(declaration_type_info_, nullptr);
//DeclarationTypeInfo decl_type_info;
//const ValueSaver<DeclarationTypeInfo*> save_type(&declaration_type_info_,
// &decl_type_info);
//
//const ReferenceComponent ref{
// .identifier = "/implict/";
// .ref_type = ReferenceType::kImmediate,
//};
//const CaptureDependentReference cap(this);
//cap.Ref().PushReferenceComponent(ref);

//decl_type_info.implicit_declaration_type = cap.Ref().LastLeaf();

//Descend(node);
} else {
Descend(node);
}
}

void HandleIdentifier(const SyntaxTreeLeaf& leaf) {
const absl::string_view text = leaf.get().text();
VLOG(2) << __FUNCTION__ << ": " << text;
Expand Down Expand Up @@ -632,8 +673,11 @@ class SymbolTable::Builder : public TreeContextVisitor {
NodeEnum::kLocalRoot,
NodeEnum::kReference,
NodeEnum::kReferenceCallBase,
//
NodeEnum::kLPValue,
NodeEnum::kNetVariableAssignment}) ||
NodeEnum::kNetVariableAssignment,
NodeEnum::kAssignmentList,
NodeEnum::kContinuousAssignmentStatement}) ||
Context().DirectParentsAre({
NodeEnum::kUnqualifiedId,
NodeEnum::kLocalRoot,
Expand All @@ -642,8 +686,11 @@ class SymbolTable::Builder : public TreeContextVisitor {
NodeEnum::kExpression,
NodeEnum::kOpenRangeList,
NodeEnum::kBraceGroup,
//
NodeEnum::kLPValue,
NodeEnum::kNetVariableAssignment});
NodeEnum::kNetVariableAssignment,
NodeEnum::kAssignmentList,
NodeEnum::kContinuousAssignmentStatement});


const ReferenceComponent new_ref{
Expand Down
4 changes: 4 additions & 0 deletions verilog/analysis/symbol_table.h
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,10 @@ struct DeclarationTypeInfo {
// advance, and only ever moving ReferenceComponents, never copying them.
const ReferenceComponentNode* user_defined_type = nullptr;

// FIXME(ldk): ...
//const ReferenceComponentNode* implicit_declaration_type = nullptr;
bool implicit_declaration = false;

public:
DeclarationTypeInfo() = default;

Expand Down

0 comments on commit 17e69b4

Please sign in to comment.