29
29
#include " llvm/ADT/StringRef.h"
30
30
#include " llvm/Support/Debug.h"
31
31
#include " llvm/Support/ErrorHandling.h"
32
+ #include " llvm/Support/SMLoc.h"
32
33
#include " llvm/Support/SourceMgr.h"
33
34
#include " llvm/Support/raw_ostream.h"
34
35
#include < cctype>
@@ -258,7 +259,7 @@ class AIGERParser {
258
259
ParseResult expectToken (AIGERTokenKind kind, const Twine &message);
259
260
260
261
// / Parse a number token into result
261
- ParseResult parseNumber (unsigned &result);
262
+ ParseResult parseNumber (unsigned &result, SMLoc *loc = nullptr );
262
263
263
264
// / Parse a binary encoded number (variable-length encoding)
264
265
ParseResult parseBinaryNumber (unsigned &result);
@@ -350,7 +351,6 @@ AIGERToken AIGERLexer::nextToken() {
350
351
};
351
352
352
353
auto token = impl ();
353
- skipWhitespace ();
354
354
return token;
355
355
}
356
356
@@ -390,15 +390,16 @@ ParseResult AIGERParser::expectToken(AIGERTokenKind kind,
390
390
return success ();
391
391
}
392
392
393
- ParseResult AIGERParser::parseNumber (unsigned &result) {
394
- auto startLoc = lexer.getCurrentLoc ();
393
+ ParseResult AIGERParser::parseNumber (unsigned &result, SMLoc *loc) {
395
394
auto token = lexer.nextToken ();
395
+ if (loc)
396
+ *loc = token.location ;
396
397
397
398
if (token.kind != AIGERTokenKind::Number)
398
- return emitError (startLoc , " expected number" );
399
+ return emitError (token. location , " expected number" );
399
400
400
401
if (token.spelling .getAsInteger (10 , result))
401
- return emitError (startLoc , " invalid number format" );
402
+ return emitError (token. location , " invalid number format" );
402
403
403
404
return success ();
404
405
}
@@ -441,7 +442,6 @@ ParseResult AIGERParser::parseHeader() {
441
442
while (lexer.peekToken ().kind != AIGERTokenKind::Identifier)
442
443
lexer.nextToken ();
443
444
444
- auto startLoc = lexer.getCurrentLoc ();
445
445
auto formatToken = lexer.nextToken ();
446
446
if (formatToken.spelling == " aag" ) {
447
447
isBinaryFormat = false ;
@@ -450,24 +450,26 @@ ParseResult AIGERParser::parseHeader() {
450
450
isBinaryFormat = true ;
451
451
LLVM_DEBUG (llvm::dbgs () << " Format: aig (binary)\n " );
452
452
} else {
453
- return emitError (startLoc, " expected 'aag' or 'aig' format identifier" );
453
+ return emitError (formatToken.location ,
454
+ " expected 'aag' or 'aig' format identifier" );
454
455
}
455
456
456
457
// Parse M I L O A (numbers separated by spaces)
457
- if (parseNumber (maxVarIndex))
458
- return emitError (" failed to parse M (max variable index)" );
458
+ SMLoc loc;
459
+ if (parseNumber (maxVarIndex, &loc))
460
+ return emitError (loc, " failed to parse M (max variable index)" );
459
461
460
- if (parseNumber (numInputs))
461
- return emitError (" failed to parse I (number of inputs)" );
462
+ if (parseNumber (numInputs, &loc ))
463
+ return emitError (loc, " failed to parse I (number of inputs)" );
462
464
463
- if (parseNumber (numLatches))
464
- return emitError (" failed to parse L (number of latches)" );
465
+ if (parseNumber (numLatches, &loc ))
466
+ return emitError (loc, " failed to parse L (number of latches)" );
465
467
466
- if (parseNumber (numOutputs))
467
- return emitError (" failed to parse O (number of outputs)" );
468
+ if (parseNumber (numOutputs, &loc ))
469
+ return emitError (loc, " failed to parse O (number of outputs)" );
468
470
469
- if (parseNumber (numAnds))
470
- return emitError (" failed to parse A (number of AND gates)" );
471
+ if (parseNumber (numAnds, &loc ))
472
+ return emitError (loc, " failed to parse A (number of AND gates)" );
471
473
472
474
LLVM_DEBUG (llvm::dbgs () << " Header: M=" << maxVarIndex << " I=" << numInputs
473
475
<< " L=" << numLatches << " O=" << numOutputs
@@ -480,7 +482,7 @@ ParseResult AIGERParser::parseHeader() {
480
482
ParseResult AIGERParser::parseNewLine () {
481
483
auto token = lexer.nextToken ();
482
484
if (token.kind != AIGERTokenKind::Newline)
483
- return emitError (" expected newline" );
485
+ return emitError (token. location , " expected newline" );
484
486
485
487
return success ();
486
488
}
@@ -496,9 +498,9 @@ ParseResult AIGERParser::parseInputs() {
496
498
497
499
for (unsigned i = 0 ; i < numInputs; ++i) {
498
500
unsigned literal;
499
- auto startLoc = lexer. getCurrentLoc () ;
500
- if (parseNumber (literal) || parseNewLine ())
501
- return emitError (startLoc , " failed to parse input literal" );
501
+ SMLoc loc ;
502
+ if (parseNumber (literal, &loc ) || parseNewLine ())
503
+ return emitError (loc , " failed to parse input literal" );
502
504
inputLiterals.push_back (literal);
503
505
}
504
506
@@ -507,15 +509,15 @@ ParseResult AIGERParser::parseInputs() {
507
509
508
510
ParseResult AIGERParser::parseLatches () {
509
511
LLVM_DEBUG (llvm::dbgs () << " Parsing " << numLatches << " latches\n " );
510
- auto startLoc = lexer.getCurrentLoc ();
511
512
if (isBinaryFormat) {
512
513
// In binary format, latches are implicit (literals 2, 4, 6, ...)
513
514
for (unsigned i = 0 ; i < numLatches; ++i) {
514
515
unsigned literal;
515
- if (parseNumber (literal))
516
- return emitError (startLoc, " failed to parse latch next state literal" );
516
+ SMLoc loc;
517
+ if (parseNumber (literal, &loc))
518
+ return emitError (loc, " failed to parse latch next state literal" );
517
519
518
- latchDefs.push_back ({2 * (i + 1 + numInputs), literal, startLoc });
520
+ latchDefs.push_back ({2 * (i + 1 + numInputs), literal, loc });
519
521
520
522
// Expect newline after each latch next state
521
523
if (parseNewLine ())
@@ -527,17 +529,19 @@ ParseResult AIGERParser::parseLatches() {
527
529
// Parse latch definitions: current_state next_state
528
530
for (unsigned i = 0 ; i < numLatches; ++i) {
529
531
unsigned currentState, nextState;
530
- if (parseNumber (currentState) || parseNumber (nextState) || parseNewLine ())
531
- return emitError (startLoc, " failed to parse latch definition" );
532
+ SMLoc loc;
533
+ if (parseNumber (currentState, &loc) || parseNumber (nextState) ||
534
+ parseNewLine ())
535
+ return emitError (loc, " failed to parse latch definition" );
532
536
533
537
LLVM_DEBUG (llvm::dbgs () << " Latch " << i << " : " << currentState << " -> "
534
538
<< nextState << " \n " );
535
539
536
540
// Validate current state literal (should be even and positive)
537
541
if (currentState % 2 != 0 || currentState == 0 )
538
- return emitError (startLoc , " invalid latch current state literal" );
542
+ return emitError (loc , " invalid latch current state literal" );
539
543
540
- latchDefs.push_back ({currentState, nextState, startLoc });
544
+ latchDefs.push_back ({currentState, nextState, loc });
541
545
}
542
546
543
547
return success ();
@@ -546,18 +550,17 @@ ParseResult AIGERParser::parseLatches() {
546
550
ParseResult AIGERParser::parseOutputs () {
547
551
LLVM_DEBUG (llvm::dbgs () << " Parsing " << numOutputs << " outputs\n " );
548
552
// NOTE: Parsing is same for binary and ASCII formats
549
- auto startLoc = lexer.getCurrentLoc ();
550
-
551
553
// Parse output literals
552
554
for (unsigned i = 0 ; i < numOutputs; ++i) {
553
555
unsigned literal;
554
- if (parseNumber (literal) || parseNewLine ())
555
- return emitError (startLoc, " failed to parse output literal" );
556
+ SMLoc loc;
557
+ if (parseNumber (literal, &loc) || parseNewLine ())
558
+ return emitError (loc, " failed to parse output literal" );
556
559
557
560
LLVM_DEBUG (llvm::dbgs () << " Output " << i << " : " << literal << " \n " );
558
561
559
562
// Output literals can be any valid literal (including inverted)
560
- outputLiterals.push_back ({literal, startLoc });
563
+ outputLiterals.push_back ({literal, loc });
561
564
}
562
565
563
566
return success ();
@@ -573,28 +576,27 @@ ParseResult AIGERParser::parseAndGates() {
573
576
}
574
577
575
578
ParseResult AIGERParser::parseAndGatesASCII () {
576
- auto startLoc = lexer.getCurrentLoc ();
577
579
// Parse AND gate definitions: lhs rhs0 rhs1
578
580
for (unsigned i = 0 ; i < numAnds; ++i) {
579
581
unsigned lhs, rhs0, rhs1;
580
- if (parseNumber (lhs) || parseNumber (rhs0) || parseNumber (rhs1) ||
582
+ SMLoc loc;
583
+ if (parseNumber (lhs, &loc) || parseNumber (rhs0) || parseNumber (rhs1) ||
581
584
parseNewLine ())
582
- return emitError (startLoc , " failed to parse AND gate definition" );
585
+ return emitError (loc , " failed to parse AND gate definition" );
583
586
584
587
LLVM_DEBUG (llvm::dbgs () << " AND Gate " << i << " : " << lhs << " = " << rhs0
585
588
<< " & " << rhs1 << " \n " );
586
589
587
590
// Validate LHS (should be even and positive)
588
591
if (lhs % 2 != 0 || lhs == 0 )
589
- return emitError (startLoc , " invalid AND gate LHS literal" );
592
+ return emitError (loc , " invalid AND gate LHS literal" );
590
593
591
594
// Validate literal bounds
592
595
if (lhs / 2 > maxVarIndex || rhs0 / 2 > maxVarIndex ||
593
596
rhs1 / 2 > maxVarIndex)
594
- return emitError (startLoc,
595
- " AND gate literal exceeds maximum variable index" );
597
+ return emitError (loc, " AND gate literal exceeds maximum variable index" );
596
598
597
- andGateDefs.push_back ({lhs, rhs0, rhs1, startLoc });
599
+ andGateDefs.push_back ({lhs, rhs0, rhs1, loc });
598
600
}
599
601
600
602
return success ();
@@ -604,7 +606,6 @@ ParseResult AIGERParser::parseAndGatesBinary() {
604
606
// In binary format, AND gates are encoded with delta compression
605
607
// Each AND gate is encoded as: delta0 delta1
606
608
// where: rhs0 = lhs - delta0, rhs1 = rhs0 - delta1
607
- auto startLoc = lexer.getCurrentLoc ();
608
609
609
610
LLVM_DEBUG (llvm::dbgs () << " Starting binary AND gate parsing\n " );
610
611
@@ -621,8 +622,9 @@ ParseResult AIGERParser::parseAndGatesBinary() {
621
622
622
623
for (unsigned i = 0 ; i < numAnds; ++i) {
623
624
unsigned delta0, delta1;
625
+ SMLoc loc = lexer.getCurrentLoc ();
624
626
if (parseBinaryNumber (delta0) || parseBinaryNumber (delta1))
625
- return emitError (" failed to parse binary AND gate deltas" );
627
+ return emitError (loc, " failed to parse binary AND gate deltas" );
626
628
627
629
auto lhs = static_cast <int64_t >(currentLHS);
628
630
@@ -650,7 +652,7 @@ ParseResult AIGERParser::parseAndGatesBinary() {
650
652
651
653
andGateDefs.push_back ({static_cast <unsigned >(lhs),
652
654
static_cast <unsigned >(rhs0),
653
- static_cast <unsigned >(rhs1), startLoc });
655
+ static_cast <unsigned >(rhs1), loc });
654
656
currentLHS += 2 ; // Next AND gate LHS
655
657
}
656
658
0 commit comments