Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/c/sknobs.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the associated sknobs.c implementation missing from this PR?

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);
Expand Down
4 changes: 4 additions & 0 deletions src/perl/sknobs.i
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
11 changes: 10 additions & 1 deletion src/perl/t/sknobs.t
Original file line number Diff line number Diff line change
@@ -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));
}

11 changes: 11 additions & 0 deletions src/python/sknobs_ext.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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"},
Expand Down
2 changes: 2 additions & 0 deletions src/python/testsknobs
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did you intend "prepend" here?


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))
1 change: 1 addition & 0 deletions src/tcl/sknobs.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
7 changes: 7 additions & 0 deletions src/tcl/testsknobs
Original file line number Diff line number Diff line change
Expand Up @@ -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]
}
1 change: 1 addition & 0 deletions src/verilog/sknobs.sv
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
71 changes: 71 additions & 0 deletions src/verilog/sknobsvpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down Expand Up @@ -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";
Expand Down
1 change: 1 addition & 0 deletions src/verilog/testsknobs_dpi.sv
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down
1 change: 1 addition & 0 deletions src/verilog/testsknobs_vpi.sv
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down