diff --git a/doc/xschem_man/developer_info.html b/doc/xschem_man/developer_info.html
index 1dd59575..985ca342 100644
--- a/doc/xschem_man/developer_info.html
+++ b/doc/xschem_man/developer_info.html
@@ -549,6 +549,8 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns"
+
+
@@ -1259,9 +1261,11 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns"
0.1 0.0 1.5 0.6
... ... ... ...
- xschem raw add varname [expr]
+ xschem raw add varname [expr] [sweep_var]
add a 'varname' vector with all values set to 0 to loaded raw file if expr not given
otherwise initialize data with values calculated from expr.
+ if expr is given and also sweep_var is given use indicated sweep_var for expressions
+ that need it. If sweep_var not given use first raw file variable as sweep variable.
If varname is already existing and expr given recalculate data
Example: xschem raw add power {outm outp - i(@r1[i]) *}
@@ -1666,6 +1670,7 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns"
+
diff --git a/scconfig/src/scripts/find_perl.c b/scconfig/src/scripts/find_perl.c
index bc0ff8db..1caef417 100644
--- a/scconfig/src/scripts/find_perl.c
+++ b/scconfig/src/scripts/find_perl.c
@@ -22,11 +22,12 @@
#include "scripts.h"
-int find_script_perl(const char *name, int logdepth, int fatal)
+static int find_script_perl_(const char *name, int logdepth, int fatal, char *extra)
{
char *cflags, *ldflags, *s;
int res;
- char *test_c =
+ char test_c[256];
+ char *test_c_in =
NL "#include "
NL "#include "
NL "#include "
@@ -34,11 +35,14 @@ int find_script_perl(const char *name, int logdepth, int fatal)
NL " PerlInterpreter *interp;"
NL
NL " interp = perl_alloc();"
+ NL "%s"
NL " puts(\"OK\");"
NL " return 0;"
NL "}"
NL;
+ sprintf(test_c, test_c_in, extra);
+
require("sys/class", logdepth, fatal);
require("cc/cc", logdepth, fatal);
require("/internal/filelist/method", logdepth, fatal);
@@ -83,3 +87,16 @@ int find_script_perl(const char *name, int logdepth, int fatal)
return try_fail(logdepth, "libs/script/perl");
}
+
+int find_script_perl(const char *name, int logdepth, int fatal)
+{
+ return find_script_perl_(name, logdepth, fatal, "");
+}
+
+int find_script_perl_with_IXpv(const char *name, int logdepth, int fatal)
+{
+ int res = find_script_perl_(name, logdepth, fatal, "(void)interp->IXpv;");
+ put("libs/script/perl_with_IXpv", "tried");
+ return res;
+}
+
diff --git a/scconfig/src/scripts/find_python.c b/scconfig/src/scripts/find_python.c
index b39b12f0..90e2ca3c 100644
--- a/scconfig/src/scripts/find_python.c
+++ b/scconfig/src/scripts/find_python.c
@@ -43,13 +43,13 @@ static int find_script_python_(const char *name, int logdepth, int fatal, int ve
char *inc_py =
NL "import distutils.sysconfig;"
- NL "print '-I' + distutils.sysconfig.get_python_inc().replace('\\\\','/')"
+ NL "print ('-I' + distutils.sysconfig.get_python_inc().replace('\\\\','/'))"
NL;
char *lib_py =
NL "import distutils.sysconfig;"
- NL "print '-L' + distutils.sysconfig.PREFIX.replace('\\\\','/') + '/libs',;"
+ NL "print ('-L' + distutils.sysconfig.PREFIX.replace('\\\\','/') + '/libs')"
NL "import sys;"
- NL "print '-lpython' + str(sys.version_info[0]) + str(sys.version_info[1])"
+ NL "print ('-lpython' + str(sys.version_info[0]) + str(sys.version_info[1]))"
NL;
diff --git a/scconfig/src/scripts/scripts.c b/scconfig/src/scripts/scripts.c
index 55b38347..d241558c 100644
--- a/scconfig/src/scripts/scripts.c
+++ b/scconfig/src/scripts/scripts.c
@@ -34,6 +34,7 @@ void deps_scripts_init()
dep_add("libs/script/python/*", find_script_python);
dep_add("libs/script/python3/*", find_script_python3);
dep_add("libs/script/perl/*", find_script_perl);
+ dep_add("libs/script/perl_with_IXpv", find_script_perl_with_IXpv);
dep_add("libs/script/mawk/*", find_script_mawk);
dep_add("libs/script/lua/*", find_script_lua);
dep_add("libs/script/guile/*", find_script_guile);
@@ -58,7 +59,7 @@ int brute_force_include(int logdepth, const char *language, const char *test_c,
{
char **files, *cflags, *ldflags;
char nodename[1024], deflink[sizeof(nodename)];
- int fileno, n, res;
+ int fileno, n, res, tries = 0;
size_t llen;
if (ldflags_base == NULL)
@@ -78,12 +79,26 @@ int brute_force_include(int logdepth, const char *language, const char *test_c,
sprintf(ldflags, "%s -l%s", ldflags_base, files[n]);
cflags = malloc(strlen(files[n]) + strlen(basedir) + 16);
sprintf(cflags, "-I%s/%s", basedir, files[n]);
- if (try_icl(logdepth, nodename, test_c, NULL, cflags, ldflags) || try_icl(logdepth, nodename, test_c, NULL, cflags, deflink)) {
+ retry:;
+ tries++;
+ if ((tries < 4) && (try_icl(logdepth, nodename, test_c, NULL, cflags, ldflags) || try_icl(logdepth, nodename, test_c, NULL, cflags, deflink))) {
filelist_free(&fileno, &files);
free(cflags);
free(ldflags);
return 1;
}
+ if ((files[n])[llen] == '-') {
+ char *s;
+
+ /* on OpenBSD 7.2 the include dir is called lua-5.2 but -llua5.2
+ is used for linking; if '-' follows lang name and the first attempt
+ with that failed, try removing the '-' and rebuild the -l and
+ retry */
+ for(s = files[n]+llen; *s != '\0'; s++)
+ s[0] = s[1];
+ sprintf(ldflags, "%s -l%s", ldflags_base, files[n]); /* no need to allocate new, it's shorter */
+ goto retry;
+ }
free(cflags);
free(ldflags);
}
diff --git a/scconfig/src/scripts/scripts.h b/scconfig/src/scripts/scripts.h
index 95a37991..e18f80cd 100644
--- a/scconfig/src/scripts/scripts.h
+++ b/scconfig/src/scripts/scripts.h
@@ -18,6 +18,7 @@ int find_script_mruby(const char *name, int logdepth, int fatal);
int find_script_python(const char *name, int logdepth, int fatal);
int find_script_python3(const char *name, int logdepth, int fatal);
int find_script_perl(const char *name, int logdepth, int fatal);
+int find_script_perl_with_IXpv(const char *name, int logdepth, int fatal);
int find_script_mawk(const char *name, int logdepth, int fatal);
int find_script_lua(const char *name, int logdepth, int fatal);
int find_script_guile(const char *name, int logdepth, int fatal);
diff --git a/src/save.c b/src/save.c
index 4271d7fa..c3c68e1b 100644
--- a/src/save.c
+++ b/src/save.c
@@ -964,7 +964,7 @@ int raw_read_from_attr(Raw **rawptr, const char *type, double sweep1, double swe
return res;
}
-int raw_add_vector(const char *varname, const char *expr)
+int raw_add_vector(const char *varname, const char *expr, int sweep_idx)
{
int f;
int res = 0;
@@ -985,7 +985,7 @@ int raw_add_vector(const char *varname, const char *expr)
res = 1;
}
if(expr) {
- plot_raw_custom_data(0, 0, raw->allpoints -1, expr, varname);
+ plot_raw_custom_data(sweep_idx, 0, raw->allpoints -1, expr, varname);
} else if(res == 1) {
for(f = 0; f < raw->allpoints; f++) {
raw->values[raw->nvars - 1][f] = 0.0;
@@ -1689,6 +1689,9 @@ int plot_raw_custom_data(int sweep_idx, int first, int last, const char *expr, c
SPICE_DATA *x = xctx->raw->values[sweep_idx];
SPICE_DATA *sweepx = xctx->raw->values[0];
+ /* dbg(0, "sweep_idx=%d first=%d last=%d expr=%s, yname=%s\n",
+ * sweep_idx, first, last, expr ? expr : "", yname ? yname: "");
+ */
y = xctx->raw->values[xctx->raw->nvars]; /* custom plot data column */
if(yname != NULL) {
int yidx = get_raw_index(yname, NULL);
diff --git a/src/scheduler.c b/src/scheduler.c
index 210fb5c5..9ec7b3ad 100644
--- a/src/scheduler.c
+++ b/src/scheduler.c
@@ -3884,9 +3884,11 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
* 0.1 0.0 1.5 0.6
* ... ... ... ...
*
- * xschem raw add varname [expr]
+ * xschem raw add varname [expr] [sweep_var]
* add a 'varname' vector with all values set to 0 to loaded raw file if expr not given
* otherwise initialize data with values calculated from expr.
+ * if expr is given and also sweep_var is given use indicated sweep_var for expressions
+ * that need it. If sweep_var not given use first raw file variable as sweep variable.
* If varname is already existing and expr given recalculate data
* Example: xschem raw add power {outm outp - i(@r1[i]) *}
*
@@ -3991,10 +3993,33 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
}
} else if(argc > 3 && !strcmp(argv[2], "add")) {
int res = 0;
+ int sweep_idx = 0;
+ if(argc > 5) { /* provided sweep variable */
+ sweep_idx = get_raw_index(argv[5], NULL);
+ if(sweep_idx <= 0) sweep_idx = 0;
+ }
if(argc > 4) {
- res = raw_add_vector(argv[3], argv[4]);
+ #if 0 /* seems not necessary... */
+ int save_datasets = -1, save_npoints = -1;
+ /* transform multiple OP points into a dc sweep */
+ if(sch_waves_loaded()!= -1 && xctx->raw && xctx->raw->sim_type && !strcmp(xctx->raw->sim_type, "op")
+ && xctx->raw->datasets > 1 && xctx->raw->npoints[0] == 1) {
+ save_datasets = xctx->raw->datasets;
+ xctx->raw->datasets = 1;
+ save_npoints = xctx->raw->npoints[0];
+ xctx->raw->npoints[0] = xctx->raw->allpoints;
+ }
+ #endif
+ res = raw_add_vector(argv[3], argv[4], sweep_idx);
+
+ #if 0
+ if(sch_waves_loaded()!= -1 && save_npoints != -1) { /* restore multiple OP points */
+ xctx->raw->datasets = save_datasets;
+ xctx->raw->npoints[0] = save_npoints;
+ }
+ #endif
} else {
- res = raw_add_vector(argv[3], NULL);
+ res = raw_add_vector(argv[3], NULL, 0);
}
Tcl_SetResult(interp, my_itoa(res), TCL_VOLATILE);
} else if(argc > 2 && !strcmp(argv[2], "datasets")) {
diff --git a/src/xschem.h b/src/xschem.h
index b1343e8b..0d04e06a 100644
--- a/src/xschem.h
+++ b/src/xschem.h
@@ -1250,7 +1250,7 @@ extern int filter_data(const char *din, const size_t ilen,
extern int embed_rawfile(const char *rawfile);
extern int read_rawfile_from_attr(const char *b64s, size_t length, const char *type);
extern int raw_read_from_attr(Raw **rawptr, const char *type, double sweep1, double sweep2);
-extern int raw_add_vector(const char *varname, const char *expr);
+extern int raw_add_vector(const char *varname, const char *expr, int sweep_idx);
extern int raw_deletevar(const char *name);
extern int new_rawfile(const char *name, const char *type, const char *sweepvar,
double start, double end, double step);