Skip to content

Commit 5e293a7

Browse files
committed
Parse net declaration delays
1 parent 0c6c132 commit 5e293a7

File tree

3 files changed

+44
-4
lines changed

3 files changed

+44
-4
lines changed

include/slang/parsing/Parser.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,7 @@ class Parser : ParserBase {
223223
MemberSyntax& parseVariableDeclaration(AttrList attributes);
224224
MemberSyntax& parseNetDeclaration(AttrList attributes);
225225
DriveStrengthSyntax* parseDriveStrength();
226+
TimingControlSyntax* parseDelay3();
226227
HierarchyInstantiationSyntax& parseHierarchyInstantiation(AttrList attributes);
227228
HierarchicalInstanceSyntax& parseHierarchicalInstance();
228229
PortConnectionSyntax& parsePortConnection();

scripts/syntax.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,16 @@ Expression delayValue
397397
kindmap<Delay>
398398
DelayControl CycleDelay
399399

400+
Delay3 base=TimingControl kind=Delay3
401+
token hash
402+
token openParen
403+
Expression delay1
404+
token comma1
405+
Expression? delay2
406+
token comma2
407+
Expression? delay3
408+
token closeParen
409+
400410
EventControl base=TimingControl kind=EventControl
401411
token at
402412
Name eventName
@@ -525,6 +535,7 @@ token netType
525535
NetStrength? strength
526536
token expansionHint
527537
DataType type
538+
TimingControl? delay
528539
separated_list<Declarator> declarators
529540
token semi
530541

source/parsing/Parser.cpp

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,35 @@ DriveStrengthSyntax* Parser::parseDriveStrength() {
549549
return &factory.driveStrength(openParen, strength0, comma, strength1, closeParen);
550550
}
551551

552+
TimingControlSyntax* Parser::parseDelay3() {
553+
if (!peek(TokenKind::Hash))
554+
return nullptr;
555+
556+
if (peek(1).kind != TokenKind::OpenParenthesis)
557+
return parseTimingControl();
558+
559+
auto hash = consume();
560+
auto openParen = consume();
561+
auto& delay1 = parseMinTypMaxExpression();
562+
563+
Token comma1, comma2;
564+
ExpressionSyntax* delay2 = nullptr;
565+
ExpressionSyntax* delay3 = nullptr;
566+
567+
if (peek(TokenKind::Comma)) {
568+
comma1 = consume();
569+
delay2 = &parseMinTypMaxExpression();
570+
571+
if (peek(TokenKind::Comma)) {
572+
comma2 = consume();
573+
delay3 = &parseMinTypMaxExpression();
574+
}
575+
}
576+
577+
return &factory.delay3(hash, openParen, delay1, comma1, delay2, comma2, delay3,
578+
expect(TokenKind::CloseParenthesis));
579+
}
580+
552581
MemberSyntax& Parser::parseNetDeclaration(AttrList attributes) {
553582
auto netType = consume();
554583

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

572601
auto& type = parseDataType(TypeOptions::AllowImplicit);
573-
574-
// TODO: delay control
602+
auto delay = parseDelay3();
575603

576604
Token semi;
577605
auto declarators = parseDeclarators(semi);
578606

579-
return factory.netDeclaration(attributes, netType, strength, expansionHint, type, declarators,
580-
semi);
607+
return factory.netDeclaration(attributes, netType, strength, expansionHint, type, delay,
608+
declarators, semi);
581609
}
582610

583611
MemberSyntax& Parser::parseVariableDeclaration(AttrList attributes) {

0 commit comments

Comments
 (0)