improved $scope and $var commands

This commit is contained in:
Aliaksei Chapyzhenka 2019-10-20 23:56:23 -07:00
parent 01c4e20712
commit 0f575619a4
3 changed files with 114 additions and 9 deletions

View File

@ -10,8 +10,29 @@ const p = new llparse.LLParse(prj);
// Add custom uint8_t property to the state
p.property('i8', 'command');
p.property('i8', 'type');
p.property('i32', 'size');
const declaration = p.node('declaration');
const scopeType = p.node('scopeType');
const scopeTypeEnd = p.node('scopeTypeEnd');
const scopeIdentifier = p.node('scopeIdentifier');
const scopeIdentifierSpan = p.span(p.code.span('scopeIdentifierSpan'));
const scopeIdentifierEnd = p.node('scopeIdentifierEnd');
const varType = p.node('varType');
const varTypeEnd = p.node('varTypeEnd');
const varSize = p.node('varSize');
const varSizeSpan = p.span(p.code.span('varSizeSpan'));
const varSizeEnd = p.node('varSizeEnd');
const varId = p.node('varId');
const varIdSpan = p.span(p.code.span('varIdSpan'));
const varIdEnd = p.node('varIdEnd');
const commandSpan = p.span(p.code.span('commandSpan'));
const inDeclaration = p.node('inDeclaration');
const enddefinitions = p.node('inDeclarationEnd');
@ -19,17 +40,87 @@ const simulation = p.node('simulation');
const inSimulation = p.node('inSimulation');
const simulationTime = p.node('simulationTime');
const spaces = [' ', '\n', '\r', '\t'];
declaration
.match([' ', '\n', '\t'], declaration)
.match(spaces, declaration)
.select({$scope: 3}, p.invoke(p.code.store('command'), commandSpan.start(scopeType)))
.select({$var: 6}, p.invoke(p.code.store('command'), commandSpan.start(varType)))
.select({
'$comment': 1, '$date': 2, '$scope': 3, '$timescale': 4,
'$upscope': 5, '$var': 6, '$version': 7
$comment: 1, $date: 2, $timescale: 4, $upscope: 5, $version: 7
}, p.invoke(p.code.store('command'), commandSpan.start(inDeclaration)))
.select({
'$enddefinitions': 100
$enddefinitions: 100
}, p.invoke(p.code.store('command'), commandSpan.start(enddefinitions)))
.otherwise(p.error(1, 'Expected declaration command'));
// $scope
scopeType
.match(spaces, scopeType)
.otherwise(scopeTypeEnd);
scopeTypeEnd
.select({
begin: 1, fork: 2, function: 3, module: 4, task: 5
}, p.invoke(p.code.store('type'), scopeIdentifier))
.otherwise(p.error(2, 'Expected scope type'));
scopeIdentifier
.match(spaces, scopeIdentifier)
.otherwise(scopeIdentifierSpan.start(scopeIdentifierEnd));
scopeIdentifierEnd
.match(spaces, scopeIdentifierSpan.end(inDeclaration))
.skipTo(scopeIdentifierEnd);
// $var
varType
.match(spaces, varType)
.otherwise(varTypeEnd);
varTypeEnd
.select({
event: 1,
integer: 2,
parameter: 3,
// real: 4,
realtime: 5,
reg: 6,
supply0: 7,
supply1: 8,
time: 9,
// tri: 10,
triand: 11,
trior: 12,
trireg: 13,
tri0: 14,
tri1: 15,
wand: 16,
wire: 17,
wor: 18
}, p.invoke(p.code.store('type'), varSize))
.otherwise(p.error(3, 'Expected var type'));
varSize
.match(spaces, varSize)
.otherwise(varSizeSpan.start(varSizeEnd));
varSizeEnd
.match(spaces, varSizeSpan.end(varId))
.skipTo(varSizeEnd);
varId
.match(spaces, varId)
.otherwise(varIdSpan.start(varIdEnd));
varIdEnd
.match(spaces, varIdSpan.end(inDeclaration))
.skipTo(varIdEnd);
// $end
inDeclaration
.match('$end', commandSpan.end(declaration))
.skipTo(inDeclaration);
@ -41,8 +132,7 @@ enddefinitions
simulation
.match([' ', '\n', '\t'], simulation)
.select({
'$dumpall': 8, '$dumpoff': 9, '$dumpon': 10, '$dumpvars': 11,
'$comment': 1
$dumpall: 8, $dumpoff: 9, $dumpon: 10, $dumpvars: 11, $comment: 1
}, p.invoke(p.code.store('command'), commandSpan.start(inSimulation)))
.select({'#': 12}, p.invoke(p.code.store('command'), commandSpan.start(simulationTime)))
.select({'0': 13}, p.invoke(p.code.store('command'), commandSpan.start(simulationTime)))
@ -54,7 +144,7 @@ inSimulation
.skipTo(inSimulation);
simulationTime
.match([' ', '\n', '\r', '\t'], commandSpan.end(simulation))
.match(spaces, commandSpan.end(simulation))
.skipTo(simulationTime);

17
vcd.c
View File

@ -142,7 +142,22 @@ napi_value Init(napi_env env, napi_value exports) {
}
int commandSpan(vcd_parser_t* s, const unsigned char* p, const unsigned char* endp) {
printf("(%d)%.*s\n", s->command, (int)(endp - p), p);
printf("(%d:%d:%d)(%.*s)\n", s->command, s->type, s->size, (int)(endp - p), p);
return 0;
};
int scopeIdentifierSpan(vcd_parser_t* s, const unsigned char* p, const unsigned char* endp) {
printf("{%.*s}", (int)(endp - p - 1), p);
return 0;
};
int varSizeSpan(vcd_parser_t* s, const unsigned char* p, const unsigned char* endp) {
s->size = strtol(p, &endp, 10);
return 0;
};
int varIdSpan(vcd_parser_t* s, const unsigned char* p, const unsigned char* endp) {
printf("{%.*s}", (int)(endp - p - 1), p);
return 0;
};