From 12ddf0f925aac29db5ed065ade0abc9f4b16ec9e Mon Sep 17 00:00:00 2001 From: ghaushe <88669122+ghaushe@users.noreply.github.com> Date: Mon, 9 Aug 2021 09:10:46 -0600 Subject: [PATCH] Add sknobs_prepend --- src/c/sknobs.h | 1 + src/perl/sknobs.i | 4 ++ src/perl/t/sknobs.t | 11 +++++- src/python/sknobs_ext.c | 11 ++++++ src/python/testsknobs | 2 + src/tcl/sknobs.h | 1 + src/tcl/testsknobs | 7 ++++ src/verilog/sknobs.sv | 1 + src/verilog/sknobsvpi.c | 71 +++++++++++++++++++++++++++++++++++ src/verilog/testsknobs_dpi.sv | 1 + src/verilog/testsknobs_vpi.sv | 1 + 11 files changed, 110 insertions(+), 1 deletion(-) diff --git a/src/c/sknobs.h b/src/c/sknobs.h index f74885b..687ce43 100644 --- a/src/c/sknobs.h +++ b/src/c/sknobs.h @@ -12,6 +12,7 @@ extern int sknobs_init(int argc, char **argv); extern void sknobs_close(void); extern int sknobs_add(char *pattern, char *value, char *comment); +extern int sknobs_prepend(char *pattern, char *value, char *comment); extern int sknobs_add_string(char *s, char *comment); extern int sknobs_load(int argc, char *argv[], char *comment); extern int sknobs_load_string(char *name, char *buffer, char *comment); diff --git a/src/perl/sknobs.i b/src/perl/sknobs.i index 6189066..f12ecd5 100644 --- a/src/perl/sknobs.i +++ b/src/perl/sknobs.i @@ -57,6 +57,10 @@ static int add(char *pattern, char *value, char *comment) { return sknobs_add(pattern, value, comment); } +static int prepend(char *pattern, char *value, char *comment) { + return sknobs_prepend(pattern, value, comment); +} + static int load(char **argv, char *comment) { int argc = 0, i, cargc=0; char **cargv; diff --git a/src/perl/t/sknobs.t b/src/perl/t/sknobs.t index fbe085c..fcba633 100644 --- a/src/perl/t/sknobs.t +++ b/src/perl/t/sknobs.t @@ -1,10 +1,19 @@ use Test; use sknobs; -plan tests => 4; +plan tests => 7; ok(sknobs::init(\@ARGV), 0); ok(sknobs::get_value("argument", 0), 0); ok(sknobs::get_string("argument", "unspecified"), "unspecified"); sknobs::set_value("argument", 999); ok(sknobs::get_dynamic_value("argument", 0), 999); +sknobs::add("test_add", "val", "perl"); +sknobs::prepend("test_add", "pre_val", "perl"); +ok(sknobs::get_string("test_add", "unspecified"), "val"); +$i = sknobs::iterate("test_add"); +@expected = ("pre_val", "val"); +while (sknobs::iterator_next($i)) { + ok(sknobs::iterator_get_string($i), shift(@expected)); +} + diff --git a/src/python/sknobs_ext.c b/src/python/sknobs_ext.c index f92c2a5..f48a6a2 100644 --- a/src/python/sknobs_ext.c +++ b/src/python/sknobs_ext.c @@ -97,6 +97,16 @@ add(PyObject *self, PyObject *args) { Py_RETURN_NONE; } +//////////////////////////////////////////////////////////////////////////// +static PyObject * +prepend(PyObject *self, PyObject *args) { + char *name, *value; + if(!PyArg_ParseTuple(args,(char *)"ss:add",&name, &value)) + return NULL; + sknobs_prepend(name, value, "python"); + Py_RETURN_NONE; +} + //////////////////////////////////////////////////////////////////////////// static PyObject * set_string(PyObject *self, PyObject *args) { @@ -150,6 +160,7 @@ static PyMethodDef sknobs_funcs[] = { {"get_string", (PyCFunction)get_string, METH_VARARGS, "get_string(name, default): get string value of knob\n"}, {"get_all_strings", (PyCFunction)get_all_strings, METH_O, "get_all_strings(name): get list of strings\n"}, {"add", (PyCFunction)add, METH_VARARGS, "add(name, value): add knob\n"}, + {"prepend", (PyCFunction)prepend, METH_VARARGS, "prepend(name, value): prepend knob\n"}, {"set_value", (PyCFunction)set_value, METH_VARARGS, "set_value(name, value): set integer value of knob\n"}, {"set_seed", (PyCFunction)set_seed, METH_VARARGS, "set_seed(value): set global seed\n"}, {"set_string", (PyCFunction)set_string, METH_VARARGS, "set_string(name, value): set string value of knob\n"}, diff --git a/src/python/testsknobs b/src/python/testsknobs index 2afeb52..6aa54a7 100755 --- a/src/python/testsknobs +++ b/src/python/testsknobs @@ -13,10 +13,12 @@ sknobs.init(sys.argv) sknobs.set_value('abc', 4) sknobs.set_string('xyz', 'there') sknobs.add('ttt', 'tttvalue') +sknobs.add('ttt', 'pre_tttvalue') print (sknobs.get_value('abc', 2)) print (sknobs.get_string('xyz', 'hi')) print (sknobs.get_all_strings('knobs.files')) print (sknobs.get_string('ttt', 'undefined')) +print (sknobs.get_all_strings('ttt')) print (sknobs.get_value('large', 0xffffffff)) print ("%x"%sknobs.get_value('larger', 0xfffffffffff)) diff --git a/src/tcl/sknobs.h b/src/tcl/sknobs.h index 4924387..b4e326b 100644 --- a/src/tcl/sknobs.h +++ b/src/tcl/sknobs.h @@ -3,6 +3,7 @@ void sknobs_close(void); int sknobs_add(char *pattern, char *value, char *comment); + int sknobs_prepend(char *pattern, char *value, char *comment); int sknobs_load(int argc, char *argv[], char *comment); int sknobs_load_string(char *name, char *buffer, char *comment); int sknobs_load_file(char *filename); diff --git a/src/tcl/testsknobs b/src/tcl/testsknobs index 3479624..251a0aa 100755 --- a/src/tcl/testsknobs +++ b/src/tcl/testsknobs @@ -3,3 +3,10 @@ load ./sknobs.so sknobs_init $argv puts [sknobs_get_value abc 4] puts [sknobs_get_string xyz "hi"] +sknobs_add test_add val tcl +sknobs_prepend test_add pre_val tcl +puts [sknobs_get_string test_add undefined] +set i [sknobs_iterate test_add] +while {[sknobs_iterator_next $i] != 0} { + puts [sknobs_iterator_get_string $i] +} diff --git a/src/verilog/sknobs.sv b/src/verilog/sknobs.sv index 01d5343..048593c 100644 --- a/src/verilog/sknobs.sv +++ b/src/verilog/sknobs.sv @@ -5,6 +5,7 @@ package sknobs; import "DPI-C" function int sknobs_init(input int argc); import "DPI-C" function void sknobs_close(); import "DPI-C" function int sknobs_add(input string pattern, input string value, input string comment); + import "DPI-C" function int sknobs_prepend(input string pattern, input string value, input string comment); import "DPI-C" function int sknobs_load_string(input string name, input string buffer, input string comment); import "DPI-C" function int sknobs_load_file(input string filename); import "DPI-C" function int sknobs_load_file_if_exists(input string filename); diff --git a/src/verilog/sknobsvpi.c b/src/verilog/sknobsvpi.c index 83e935d..bf2204d 100644 --- a/src/verilog/sknobsvpi.c +++ b/src/verilog/sknobsvpi.c @@ -494,6 +494,67 @@ int vpi_sknobs_add_sizetf() { return 1; } +//////////////////////////////////////////////////////////////////////////// +// vpi_sknobs_prepend_calltf +int vpi_sknobs_prepend_calltf() { + vpiHandle sysTfHandle; + vpiHandle argIterator; + vpiHandle patternHandle; + vpiHandle valueHandle; + vpiHandle commentHandle; + s_vpi_value value; + int result; + char *pattern, *newValue, *comment; + + vpi_sknobs_init(); + + // get handle to system function call + sysTfHandle = vpi_handle(vpiSysTfCall, NULL); + + // get handles to arguments + argIterator = vpi_iterate(vpiArgument, sysTfHandle); + patternHandle = vpi_scan(argIterator); + valueHandle = vpi_scan(argIterator); + commentHandle = vpi_scan(argIterator); + + // get pattern + value.format = vpiStringVal; + vpi_get_value(patternHandle, &value); + pattern = expandName(value.value.str); + + // get value + value.format = vpiStringVal; + vpi_get_value(valueHandle, &value); + //have to strdup it because newValue and comment pointed to the + //same string value.value.str so when comment is read, + //the newValue pointer also changes. + newValue = strdup((const char *)value.value.str); + + // get comment + comment = ""; + if (commentHandle) { + value.format = vpiStringVal; + vpi_get_value(commentHandle, &value); + comment = value.value.str; + } + + // search knobs database for result + result = sknobs_prepend(pattern, newValue, comment); + + // return result + value.format = vpiScalarVal; + value.value.scalar = result; + vpi_put_value(sysTfHandle, &value, NULL, vpiNoDelay); + free(newValue); + return 0; +} + +//////////////////////////////////////////////////////////////////////////// +// vpi_sknobs_prepend_sizetf +int vpi_sknobs_prepend_sizetf() { + return 1; +} + //////////////////////////////////////////////////////////////////////////// // vpi_sknobs_load_calltf int vpi_sknobs_load_calltf() { @@ -1043,6 +1104,16 @@ void vpi_register_tfs( void ) { systf_handle = vpi_register_systf( &systf_data ); vpi_free_object( systf_handle ); + systf_data.type = vpiSysFunc; + systf_data.sysfunctype = vpiSysFuncSized; + systf_data.tfname = "$sknobs_prepend"; + systf_data.calltf = vpi_sknobs_prepend_calltf; + systf_data.compiletf = 0; + systf_data.sizetf = vpi_sknobs_prepend_sizetf; + systf_data.user_data = 0; + systf_handle = vpi_register_systf( &systf_data ); + vpi_free_object( systf_handle ); + systf_data.type = vpiSysFunc; systf_data.sysfunctype = vpiSysFuncSized; systf_data.tfname = "$sknobs_load"; diff --git a/src/verilog/testsknobs_dpi.sv b/src/verilog/testsknobs_dpi.sv index e5584cf..6324c3e 100644 --- a/src/verilog/testsknobs_dpi.sv +++ b/src/verilog/testsknobs_dpi.sv @@ -7,6 +7,7 @@ module test; $display("%m.abc=%0d", sknobs::get_value("%m.abc", 10)); $display("%m.abc=%0d", sknobs::get_value("%m.abc", 10)); $display("xyz=%0s", sknobs::get_string("xyz", "mydefaultstring")); + sknobs::prepend("list", "pre"); iterator = sknobs::iterate("list"); while(sknobs::iterator_next(iterator)) $display("next: %0s", sknobs::iterator_get_string(iterator)); diff --git a/src/verilog/testsknobs_vpi.sv b/src/verilog/testsknobs_vpi.sv index b495d79..2acfb24 100644 --- a/src/verilog/testsknobs_vpi.sv +++ b/src/verilog/testsknobs_vpi.sv @@ -6,6 +6,7 @@ module test; $display("%m.abc=%0d", $sknobs_get_value("%m.abc", 10)); $display("%m.abc=%0d", $sknobs_get_value("%m.abc", 10)); $display("xyz=%0s", $sknobs_get_string("xyz", "mydefaultstring")); + $sknobs_prepend("list", "pre"); iterator = $sknobs_iterate("list"); while($sknobs_iterator_next(iterator)) $display("next: %0s", $sknobs_iterator_get_string(iterator));