able to mesure simulation time

This commit is contained in:
Aliaksei Chapyzhenka 2019-10-21 18:38:10 -07:00
parent 6311eeee17
commit 0ed7e01bc7
6 changed files with 183 additions and 16 deletions

1
.gitignore vendored
View File

@ -4,3 +4,4 @@ coverage
node_modules node_modules
package-lock.json package-lock.json
vcd_parser.* vcd_parser.*
tmp

View File

@ -12,6 +12,17 @@ const p = new llparse.LLParse(prj);
p.property('i8', 'command'); p.property('i8', 'command');
p.property('i8', 'type'); p.property('i8', 'type');
p.property('i32', 'size'); p.property('i32', 'size');
p.property('i32', 'time');
p.property('i32', 'start');
p.property('i32', 'stop');
p.property('ptr', 'trigger');
const scopeIdentifierSpan = p.span(p.code.span('scopeIdentifierSpan'));
const varSizeSpan = p.span(p.code.span('varSizeSpan'));
const idSpan = p.span(p.code.span('idSpan'));
const commandSpan = p.span(p.code.span('commandSpan'));
const timeSpan = p.span(p.code.span('timeSpan'));
const vectorSpan = p.span(p.code.span('vectorSpan'));
const declaration = p.node('declaration'); const declaration = p.node('declaration');
@ -19,26 +30,25 @@ const scopeType = p.node('scopeType');
const scopeTypeEnd = p.node('scopeTypeEnd'); const scopeTypeEnd = p.node('scopeTypeEnd');
const scopeIdentifier = p.node('scopeIdentifier'); const scopeIdentifier = p.node('scopeIdentifier');
const scopeIdentifierSpan = p.span(p.code.span('scopeIdentifierSpan'));
const scopeIdentifierEnd = p.node('scopeIdentifierEnd'); const scopeIdentifierEnd = p.node('scopeIdentifierEnd');
const varType = p.node('varType'); const varType = p.node('varType');
const varTypeEnd = p.node('varTypeEnd'); const varTypeEnd = p.node('varTypeEnd');
const varSize = p.node('varSize'); const varSize = p.node('varSize');
const varSizeSpan = p.span(p.code.span('varSizeSpan'));
const varSizeEnd = p.node('varSizeEnd'); const varSizeEnd = p.node('varSizeEnd');
const varId = p.node('varId'); const varId = p.node('varId');
const varIdSpan = p.span(p.code.span('varIdSpan'));
const varIdEnd = p.node('varIdEnd'); const varIdEnd = p.node('varIdEnd');
const commandSpan = p.span(p.code.span('commandSpan'));
const inDeclaration = p.node('inDeclaration'); const inDeclaration = p.node('inDeclaration');
const enddefinitions = p.node('inDeclarationEnd'); const enddefinitions = p.node('inDeclarationEnd');
const simulation = p.node('simulation'); const simulation = p.node('simulation');
const inSimulation = p.node('inSimulation'); const inSimulation = p.node('inSimulation');
const simulationTime = p.node('simulationTime'); const simulationTime = p.node('simulationTime');
const simulationVector = p.node('simulationVector');
const simulationId = p.node('simulationId');
const spaces = [' ', '\n', '\r', '\t']; const spaces = [' ', '\n', '\r', '\t'];
@ -113,10 +123,10 @@ varSizeEnd
varId varId
.match(spaces, varId) .match(spaces, varId)
.otherwise(varIdSpan.start(varIdEnd)); .otherwise(idSpan.start(varIdEnd));
varIdEnd varIdEnd
.match(spaces, varIdSpan.end(inDeclaration)) .match(spaces, idSpan.end(inDeclaration))
.skipTo(varIdEnd); .skipTo(varIdEnd);
// $end // $end
@ -134,11 +144,15 @@ simulation
.select({ .select({
$dumpall: 9, $dumpoff: 10, $dumpon: 11, $dumpvars: 12, $comment: 1 $dumpall: 9, $dumpoff: 10, $dumpon: 11, $dumpvars: 12, $comment: 1
}, p.invoke(p.code.store('command'), commandSpan.start(inSimulation))) }, p.invoke(p.code.store('command'), commandSpan.start(inSimulation)))
.select({'#': 13}, p.invoke(p.code.store('command'), commandSpan.start(simulationTime))) .select({
'#': 13
}, p.invoke(p.code.store('command'), timeSpan.start(simulationTime)))
.select({ .select({
'0': 14, '1': 15, x: 16, X: 17, Z: 18 '0': 14, '1': 15, x: 16, X: 17, Z: 18
}, p.invoke(p.code.store('command'), commandSpan.start(simulationTime))) }, p.invoke(p.code.store('command'), idSpan.start(simulationId)))
.select({}, p.invoke(p.code.store('command'), commandSpan.start(simulationTime))) .select({
b: 19, B: 20, r: 21, R: 22
}, p.invoke(p.code.store('command'), vectorSpan.start(simulationVector)))
.otherwise(p.error(4, 'Expected simulation command')); .otherwise(p.error(4, 'Expected simulation command'));
inSimulation inSimulation
@ -146,9 +160,16 @@ inSimulation
.skipTo(inSimulation); .skipTo(inSimulation);
simulationTime simulationTime
.match(spaces, commandSpan.end(simulation)) .match(spaces, timeSpan.end(simulation))
.skipTo(simulationTime); .skipTo(simulationTime);
simulationVector
.match(spaces, vectorSpan.end(idSpan.start(simulationId)))
.skipTo(simulationVector);
simulationId
.match(spaces, idSpan.end(simulation))
.skipTo(simulationId);
// Build // Build

39
bin/find.js Executable file
View File

@ -0,0 +1,39 @@
#!/usr/bin/env node
'use strict';
const fs = require('fs-extra');
const async = require('async');
const lib = require('../index.js');
const dir = './tmp/';
fs.readdir(dir).then(files => {
// files.map(fileName => {
async.eachSeries(files, (fileName, callback) => {
let len = 0;
let chunks = 0;
let goodChunks = 0;
const t0 = Date.now();
const cxt = lib.init();
lib.setTrigger(cxt, 'D1');
const s = fs.createReadStream(dir + fileName);
s.on('data', chunk => {
if (lib.execute(cxt, chunk) === 0) {
goodChunks++;
}
len += chunk.length;
chunks++;
});
s.on('end', () => {
console.log(
fileName,
chunks,
len,
goodChunks,
lib.getStop(cxt) - lib.getStart(cxt),
((Date.now() - t0) / 1000 + 's')
);
callback();
});
});
});

View File

@ -21,7 +21,9 @@
}, },
"homepage": "https://github.com/wavedrom/vcd#readme", "homepage": "https://github.com/wavedrom/vcd#readme",
"dependencies": { "dependencies": {
"async": "^3.1.0",
"bindings": "^1.5.0", "bindings": "^1.5.0",
"fs-extra": "^8.1.0",
"llparse": "^6.2.0" "llparse": "^6.2.0"
}, },
"devDependencies": { "devDependencies": {

View File

@ -44,7 +44,7 @@ $timescale 1ns $end
$scope module top $end $scope module top $end
$var wire 1 "}G clock $end $var wire 1 "}G clock $end
$scope module leaf $end $scope module leaf $end
$var wire 64 "}> counter [63:0] $end $var wire 64 {u counter [63:0] $end
$upscope $end $upscope $end
$upscope $end $upscope $end
@ -57,8 +57,15 @@ $timescale 1ns $end
0"}G 0"}G
#2 #2
1"}G 1"}G
#3 #300
0"}G 0"}G
b1111000000000000 {u
#301
b0000111100000000 {u
#302
b0000000011110000 {u
#303
b0000000000001111 {u
` `
))).to.eq(0); ))).to.eq(0);
expect(lib.getError(cxt)).to.eq(0); expect(lib.getError(cxt)).to.eq(0);

105
vcd.c
View File

@ -63,10 +63,26 @@
} \ } \
} }
#define ASSERT_STRING(name, var) \
char var[256]; \
{ \
napi_value tmp; \
if (napi_coerce_to_string(env, name, &tmp) != napi_ok) { \
napi_throw(env, name); \
return 0; \
} \
size_t result; \
if (napi_get_value_string_latin1(env, tmp, var, 256, &result) != napi_ok) { \
napi_throw(env, name); \
return 0; \
} \
}
METHOD(init) { METHOD(init) {
struct vcd_parser_s *state = malloc(sizeof *state); struct vcd_parser_s *state = malloc(sizeof *state);
const int32_t error = vcd_parser_init(state); const int32_t error = vcd_parser_init(state);
state->trigger = "HELLO";
napi_value res; napi_value res;
if (error) { if (error) {
@ -130,6 +146,49 @@ METHOD(getCommand) {
return res; return res;
} }
METHOD(getTime) {
ASSERT_ARGC(1)
struct vcd_parser_s *state;
ASSERT_EXTERNAL(args[0], state)
napi_value res;
ASSERT(res, napi_create_int32(env, state->time, &res))
return res;
}
METHOD(getStart) {
ASSERT_ARGC(1)
struct vcd_parser_s *state;
ASSERT_EXTERNAL(args[0], state)
napi_value res;
ASSERT(res, napi_create_int32(env, state->start, &res))
return res;
}
METHOD(getStop) {
ASSERT_ARGC(1)
struct vcd_parser_s *state;
ASSERT_EXTERNAL(args[0], state)
napi_value res;
ASSERT(res, napi_create_int32(env, state->stop, &res))
return res;
}
METHOD(setTrigger) {
ASSERT_ARGC(2)
struct vcd_parser_s *state;
ASSERT_EXTERNAL(args[0], state)
ASSERT_STRING(args[1], trigger)
state->trigger = *trigger;
napi_value res;
ASSERT(res, napi_create_int32(env, state->error, &res))
return res;
}
napi_value Init(napi_env env, napi_value exports) { napi_value Init(napi_env env, napi_value exports) {
DECLARE_NAPI_METHOD("init", init) DECLARE_NAPI_METHOD("init", init)
DECLARE_NAPI_METHOD("execute", execute) DECLARE_NAPI_METHOD("execute", execute)
@ -137,16 +196,20 @@ napi_value Init(napi_env env, napi_value exports) {
DECLARE_NAPI_METHOD("getReason", getReason) DECLARE_NAPI_METHOD("getReason", getReason)
DECLARE_NAPI_METHOD("getErrorPos", getErrorPos) DECLARE_NAPI_METHOD("getErrorPos", getErrorPos)
DECLARE_NAPI_METHOD("getCommand", getCommand) DECLARE_NAPI_METHOD("getCommand", getCommand)
DECLARE_NAPI_METHOD("getTime", getTime)
DECLARE_NAPI_METHOD("getStart", getStart)
DECLARE_NAPI_METHOD("getStop", getStop)
DECLARE_NAPI_METHOD("setTrigger", setTrigger)
return exports; return exports;
} }
int commandSpan(vcd_parser_t* s, const unsigned char* p, const unsigned char* endp) { int commandSpan(vcd_parser_t* s, const unsigned char* p, const unsigned char* endp) {
printf("(%d:%d:%d)(%.*s)\n", s->command, s->type, s->size, (int)(endp - p), p); // printf("(%d:%d:%d:%d)(%.*s)\n", s->time, s->command, s->type, s->size, (int)(endp - p), p);
return 0; return 0;
}; };
int scopeIdentifierSpan(vcd_parser_t* s, const unsigned char* p, const unsigned char* endp) { int scopeIdentifierSpan(vcd_parser_t* s, const unsigned char* p, const unsigned char* endp) {
printf("{%.*s}", (int)(endp - p - 1), p); // printf("{%.*s}", (int)(endp - p - 1), p);
return 0; return 0;
}; };
@ -155,8 +218,42 @@ int varSizeSpan(vcd_parser_t* s, const unsigned char* p, const unsigned char* en
return 0; return 0;
}; };
int varIdSpan(vcd_parser_t* s, const unsigned char* p, const unsigned char* endp) { bool stringEq (
printf("{%.*s}", (int)(endp - p - 1), p); const unsigned char* gold,
const unsigned char* p,
const unsigned char* endp
) {
for (size_t i = 0; gold[i] != 0; i++) {
if (gold[i] != p[i]) {
return false;
}
}
return true;
}
int idSpan(vcd_parser_t* s, const unsigned char* p, const unsigned char* endp) {
// printf("{%.*s}", (int)(endp - p - 1), p);
if (stringEq("D1", p, endp)) {
if (s->time < 10) {
return 0;
}
if (s->start == 0) {
s->start = s->time;
} else {
s->stop = s->time;
}
}
return 0;
};
int vectorSpan(vcd_parser_t* s, const unsigned char* p, const unsigned char* endp) {
// printf("{%.*s}", (int)(endp - p - 1), p);
return 0;
};
int timeSpan(vcd_parser_t* s, const unsigned char* p, const unsigned char* endp) {
s->time = strtol(p, &endp, 10);
// printf("%d\n", s->time);
return 0; return 0;
}; };