This commit is contained in:
Ben 2020-09-27 14:58:31 -07:00
parent c59c26b387
commit 846d4e0c6a
7 changed files with 62 additions and 18 deletions

View File

@ -37,6 +37,7 @@ const properties = {
mask: 'ptr', // mask (x, z) of the signal on change event mask: 'ptr', // mask (x, z) of the signal on change event
digitCount: 'i32', digitCount: 'i32',
tmpStr: 'ptr', tmpStr: 'ptr',
tmpStr2: 'ptr',
stackPointer: 'i32', stackPointer: 'i32',
id: 'ptr', id: 'ptr',
napi_env: 'ptr' napi_env: 'ptr'

View File

@ -3,6 +3,7 @@
const stream = require('stream'); const stream = require('stream');
const EventEmitter = require('events').EventEmitter; const EventEmitter = require('events').EventEmitter;
// let lib = require('bindings')('vcd.node'); // let lib = require('bindings')('vcd.node');
const util = require('util');
module.exports = async () => { module.exports = async () => {
@ -36,6 +37,8 @@ module.exports = async () => {
s._write = function (chunk, encoding, callback) { s._write = function (chunk, encoding, callback) {
console.log('about to write', chunk); console.log('about to write', chunk);
lib.execute(cxt, lifemit, triemit2, info, chunk); lib.execute(cxt, lifemit, triemit2, info, chunk);
console.log(util.inspect(info, {showHidden: true, depth : null, colorize: true}));
// console.log(info);
callback(); callback();
}; };

View File

@ -1,5 +1,7 @@
'use strict'; 'use strict';
const dotProp = require('dot-prop');
function _waitForStart(mod) { function _waitForStart(mod) {
return new Promise((resolve, reject)=>{ return new Promise((resolve, reject)=>{
mod.addOnPostRun(resolve); mod.addOnPostRun(resolve);
@ -64,14 +66,20 @@ module.exports = () => {
switch(type) { switch(type) {
case 0: case 0:
boundInfo[prop] = v0; boundInfo[prop] = v0;
// console.log(`setting ${prop} to ${boundInfo[prop]}`);
break; break;
case 1: case 1:
boundInfo[prop] = getString(v0, v1); boundInfo[prop] = getString(v0, v1);
// console.log(`setting ${prop} to ${boundInfo[prop]}`);
break; break;
case 2:
dotProp.set(boundInfo, prop, getString(v0, v1));
console.log(`setting ${prop} to ${getString(v0, v1)}`);
break;
default: throw new Error(); default: throw new Error();
} }
console.log(`setting ${prop} to ${boundInfo[prop]}`);
// viiiii means returns void, accepts int int int int int // viiiii means returns void, accepts int int int int int
}, 'viiiii'); }, 'viiiii');
@ -81,12 +89,13 @@ module.exports = () => {
return 42; return 42;
}, 'iii'); }, 'iii');
boundEE0 = wasm.addFunction(function(val) {
ee[0].emit(val); boundEE0 = wasm.addFunction(function(name, len) {
}, 'vi'); ee[0](getString(name, len));
}, 'vii');
boundEE1 = wasm.addFunction(function(eventName, l0, time, command, value, mask) { boundEE1 = wasm.addFunction(function(eventName, l0, time, command, value, mask) {
ee[1].emit(getString(eventName, l0), time, command, value, mask); ee[1](getString(eventName, l0), time, command, value, mask);
}, 'viiiiii'); }, 'viiiiii');
}; };
@ -104,7 +113,7 @@ module.exports = () => {
context = c.init(boundEE0,boundEE1,boundSet,boundGet); context = c.init(boundEE0,boundEE1,boundSet,boundGet);
}, },
execute: (ctx, lifemit, triemit, info, chunk) => { execute: (ctx, lifemit, triemit, info, chunk) => {
c.execute(ctx,0,0,boundSet,boundGet,chunk.toString()); c.execute(ctx,boundEE0,boundEE1,boundSet,boundGet,chunk.toString());
}, },
setTrigger: (ctx, triggerString) => { setTrigger: (ctx, triggerString) => {
return c.setTrigger(ctx, triggerString); return c.setTrigger(ctx, triggerString);

2
vcd.c
View File

@ -124,6 +124,7 @@ METHOD(init) {
static char triggerString [4096] = " "; static char triggerString [4096] = " ";
static char tmpStr [4096] = " "; static char tmpStr [4096] = " ";
static char tmpStr2 [4096] = " ";
static uint64_t valueBuf [4096] = {}; static uint64_t valueBuf [4096] = {};
static uint64_t maskBuf [4096] = {}; static uint64_t maskBuf [4096] = {};
@ -131,6 +132,7 @@ METHOD(init) {
state->reason = "NO REASON"; state->reason = "NO REASON";
state->napi_env = env; state->napi_env = env;
state->tmpStr = tmpStr; state->tmpStr = tmpStr;
state->tmpStr2 = tmpStr2;
state->value = valueBuf; state->value = valueBuf;
state->mask = maskBuf; state->mask = maskBuf;
state->digitCount = 0; state->digitCount = 0;

View File

@ -1,9 +1,12 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include "vcd_parser.h" #include "vcd_parser.h"
#ifndef VCDWASM #ifndef VCDWASM
#include <node_api.h> #include <node_api.h>
#else
#include "wasm_main.hpp"
#endif #endif
#ifdef VCDWASM #ifdef VCDWASM
@ -82,6 +85,9 @@ int commandSpan(vcd_parser_t* state, const unsigned char* p, const unsigned char
// ASSERT(eventPayload, napi_create_string_latin1(env, "payload", NAPI_AUTO_LENGTH, &eventPayload)) // ASSERT(eventPayload, napi_create_string_latin1(env, "payload", NAPI_AUTO_LENGTH, &eventPayload))
napi_value* argv[] = { &eventName }; // , &eventPayload }; napi_value* argv[] = { &eventName }; // , &eventPayload };
ASSERT(state->lifee, napi_call_function(env, undefined, state->lifee, 1, *argv, &return_val)) ASSERT(state->lifee, napi_call_function(env, undefined, state->lifee, 1, *argv, &return_val))
#else
set_property_string("status", "simulation");
emit_lifee("$enddefinitions");
#endif #endif
return 0; return 0;
} }
@ -95,14 +101,20 @@ int scopeIdentifierSpan(vcd_parser_t* state, const unsigned char* p, const unsig
napi_env env = state->napi_env; napi_env env = state->napi_env;
// *(endp - 1) = 0; // FIXME NULL termination of ASCII string // *(endp - 1) = 0; // FIXME NULL termination of ASCII string
strcopy(p, endp, state->tmpStr); strcopy(p, endp, state->tmpStr);
napi_value name, obj, stack, top; napi_value obj, stack, top;
ASSERT(name, napi_create_string_latin1(env, (char*)p, (endp - p - 1), &name))
ASSERT(obj, napi_create_object(env, &obj)) ASSERT(obj, napi_create_object(env, &obj))
ASSERT(state->info, napi_get_named_property(env, state->info, "stack", &stack)) ASSERT(state->info, napi_get_named_property(env, state->info, "stack", &stack))
ASSERT(top, napi_get_element(env, stack, state->stackPointer, &top)) ASSERT(top, napi_get_element(env, stack, state->stackPointer, &top))
printf("Got stack %d\n", state->stackPointer);
ASSERT(top, napi_set_named_property(env, top, state->tmpStr, obj)) ASSERT(top, napi_set_named_property(env, top, state->tmpStr, obj))
printf("Set ? to %s\n", (char*)state->tmpStr);
state->stackPointer += 1; state->stackPointer += 1;
ASSERT(top, napi_set_element(env, stack, state->stackPointer, obj)) ASSERT(top, napi_set_element(env, stack, state->stackPointer, obj))
#else
state->stackPointer += 1;
strcopy(p, endp, state->tmpStr); // load the value into temp string 1
snprintf(state->tmpStr2, 4096, "stack.%d\n", state->stackPointer); // load the dot-prop into string 2
set_path_string(state->tmpStr2, state->tmpStr);
#endif #endif
return 0; return 0;
} }
@ -114,16 +126,21 @@ int varSizeSpan(vcd_parser_t* state, const unsigned char* p, const unsigned char
} }
int varIdSpan(vcd_parser_t* state, const unsigned char* p, const unsigned char* endp) { int varIdSpan(vcd_parser_t* state, const unsigned char* p, const unsigned char* endp) {
LOGSPAN;
#ifndef VCDWASM #ifndef VCDWASM
napi_env env = state->napi_env; napi_env env = state->napi_env;
napi_value varId; napi_value varId;
ASSERT(varId, napi_create_string_latin1(env, (char*)p, (endp - p - 1), &varId)) ASSERT(varId, napi_create_string_latin1(env, (char*)p, (endp - p - 1), &varId))
ASSERT(state->info, napi_set_named_property(env, state->info, "varId", varId)) ASSERT(state->info, napi_set_named_property(env, state->info, "varId", varId))
#else
strcopy(p, endp, state->tmpStr);
set_property_string("varId", state->tmpStr);
#endif #endif
return 0; return 0;
} }
int varNameSpan(vcd_parser_t* state, const unsigned char* p, const unsigned char* endp) { int varNameSpan(vcd_parser_t* state, const unsigned char* p, const unsigned char* endp) {
LOGSPAN;
#ifndef VCDWASM #ifndef VCDWASM
napi_env env = state->napi_env; napi_env env = state->napi_env;
// *(endp - 1) = 0; // FIXME NULL termination of ASCII string // *(endp - 1) = 0; // FIXME NULL termination of ASCII string
@ -133,6 +150,9 @@ int varNameSpan(vcd_parser_t* state, const unsigned char* p, const unsigned char
ASSERT(top, napi_get_element(env, stack, state->stackPointer, &top)) ASSERT(top, napi_get_element(env, stack, state->stackPointer, &top))
ASSERT(state->info, napi_get_named_property(env, state->info, "varId", &varId)) ASSERT(state->info, napi_get_named_property(env, state->info, "varId", &varId))
ASSERT(state->info, napi_set_named_property(env, top, state->tmpStr, varId)) ASSERT(state->info, napi_set_named_property(env, top, state->tmpStr, varId))
#else
// char *varIdString =
set_property_string("varId", state->tmpStr);
#endif #endif
return 0; return 0;
} }

View File

@ -7,7 +7,7 @@ using namespace std;
/// Typedef used as part of c->js call /// Typedef used as part of c->js call
typedef void externalJsMethodZero(const int sz); typedef void externalJsMethodZero(const char* name, const size_t len);
typedef void externalJsMethodOne (const char*, const uint64_t time, const uint8_t command, const int dnc0, const int dnc1); typedef void externalJsMethodOne (const char*, const uint64_t time, const uint8_t command, const int dnc0, const int dnc1);
typedef int externalJsGetProperty(const char* name, const size_t len); typedef int externalJsGetProperty(const char* name, const size_t len);
@ -20,6 +20,9 @@ static externalJsMethodZero* externalZero = 0;
static externalJsMethodOne* externalOne = 0; static externalJsMethodOne* externalOne = 0;
static externalJsSetProperty* bound_set_property = 0; static externalJsSetProperty* bound_set_property = 0;
static externalJsGetProperty* bound_get_property = 0; static externalJsGetProperty* bound_get_property = 0;
static struct vcd_parser_s* state;
extern "C" {
void set_property_int(const char* name, const int value) { void set_property_int(const char* name, const int value) {
bound_set_property(name, strlen(name), 0, value, 0); bound_set_property(name, strlen(name), 0, value, 0);
@ -29,14 +32,20 @@ void set_property_string(const char* name, const char* value) {
bound_set_property(name, strlen(name), 1, (int)value, strlen(value)); bound_set_property(name, strlen(name), 1, (int)value, strlen(value));
} }
int get_property(const char* name) { void set_path_string(const char* name, const char* value) {
bound_set_property(name, strlen(name), 2, (int)value, strlen(value));
}
int get_property_int(const char* name) {
return bound_get_property(name, strlen(name)); return bound_get_property(name, strlen(name));
} }
void emit_lifee(const char* name) {
externalZero(name, strlen(name));
}
static struct vcd_parser_s* state;
extern "C" {
// returns context // returns context
int init( int init(
@ -141,7 +150,7 @@ int getTime(const int context) {
// set_property_int("foo", 10); // set_property_int("foo", 10);
// int got = get_property("bar"); // int got = get_property_int("bar");
// cout << "got " << got << " for bar\n"; // cout << "got " << got << " for bar\n";

View File

@ -1,8 +1,8 @@
#pragma once #pragma once
void set_property_int(const char* name, const int value);
// void set_property(const char* name, const int value); void set_property_string(const char* name, const char* value);
// int get_property(const char* name); void set_path_string(const char* name, const char* value);
int get_property_int(const char* name);
void emit_lifee(const char* name);