Skip to content

Commit

Permalink
Parse net declaration delays
Browse files Browse the repository at this point in the history
  • Loading branch information
MikePopoloski committed Dec 2, 2019
1 parent 0c6c132 commit 5e293a7
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 4 deletions.
1 change: 1 addition & 0 deletions include/slang/parsing/Parser.h
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,7 @@ class Parser : ParserBase {
MemberSyntax& parseVariableDeclaration(AttrList attributes);
MemberSyntax& parseNetDeclaration(AttrList attributes);
DriveStrengthSyntax* parseDriveStrength();
TimingControlSyntax* parseDelay3();
HierarchyInstantiationSyntax& parseHierarchyInstantiation(AttrList attributes);
HierarchicalInstanceSyntax& parseHierarchicalInstance();
PortConnectionSyntax& parsePortConnection();
Expand Down
11 changes: 11 additions & 0 deletions scripts/syntax.txt
Original file line number Diff line number Diff line change
Expand Up @@ -397,6 +397,16 @@ Expression delayValue
kindmap<Delay>
DelayControl CycleDelay

Delay3 base=TimingControl kind=Delay3
token hash
token openParen
Expression delay1
token comma1
Expression? delay2
token comma2
Expression? delay3
token closeParen

EventControl base=TimingControl kind=EventControl
token at
Name eventName
Expand Down Expand Up @@ -525,6 +535,7 @@ token netType
NetStrength? strength
token expansionHint
DataType type
TimingControl? delay
separated_list<Declarator> declarators
token semi

Expand Down
36 changes: 32 additions & 4 deletions source/parsing/Parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -549,6 +549,35 @@ DriveStrengthSyntax* Parser::parseDriveStrength() {
return &factory.driveStrength(openParen, strength0, comma, strength1, closeParen);
}

TimingControlSyntax* Parser::parseDelay3() {
if (!peek(TokenKind::Hash))
return nullptr;

if (peek(1).kind != TokenKind::OpenParenthesis)
return parseTimingControl();

auto hash = consume();
auto openParen = consume();
auto& delay1 = parseMinTypMaxExpression();

Token comma1, comma2;
ExpressionSyntax* delay2 = nullptr;
ExpressionSyntax* delay3 = nullptr;

if (peek(TokenKind::Comma)) {
comma1 = consume();
delay2 = &parseMinTypMaxExpression();

if (peek(TokenKind::Comma)) {
comma2 = consume();
delay3 = &parseMinTypMaxExpression();
}
}

return &factory.delay3(hash, openParen, delay1, comma1, delay2, comma2, delay3,
expect(TokenKind::CloseParenthesis));
}

MemberSyntax& Parser::parseNetDeclaration(AttrList attributes) {
auto netType = consume();

Expand All @@ -570,14 +599,13 @@ MemberSyntax& Parser::parseNetDeclaration(AttrList attributes) {
expansionHint = consume();

auto& type = parseDataType(TypeOptions::AllowImplicit);

// TODO: delay control
auto delay = parseDelay3();

Token semi;
auto declarators = parseDeclarators(semi);

return factory.netDeclaration(attributes, netType, strength, expansionHint, type, declarators,
semi);
return factory.netDeclaration(attributes, netType, strength, expansionHint, type, delay,
declarators, semi);
}

MemberSyntax& Parser::parseVariableDeclaration(AttrList attributes) {
Expand Down

0 comments on commit 5e293a7

Please sign in to comment.