allow @symname , @param (param defined in symbol template string) translation in instance or symbol spice_sym_def attributes

This commit is contained in:
stefan schippers 2024-06-14 08:21:43 +02:00
parent d7c77718c0
commit f267077e99
4 changed files with 57 additions and 12 deletions

View File

@ -94,16 +94,19 @@ int find_gl(const char *name, int logdepth, int fatal)
int find_gl_vao(const char *name, int logdepth, int fatal)
{
const char *test_c =
const char *test_c_templ =
NL "#include <stdio.h>"
NL "#include <%s/gl.h>"
NL "int main()"
NL "{"
NL " glBindVertexArray(0);"
NL " return 0;"
NL "}"
NL;
const char *incs_templ = "#define GL_GLEXT_PROTOTYPES\n%s\n#include <%s/gl.h>\n#include <%s/glext.h>";
char test_c[512], incs2[512];
const char *node = "libs/gui/gl/vao";
const char *cflags, *ldflags, *incs;
const char *cflags, *ldflags, *incs, *ip;
if (require("cc/cc", logdepth, fatal))
return try_fail(logdepth, node);
@ -114,14 +117,24 @@ int find_gl_vao(const char *name, int logdepth, int fatal)
cflags = get("libs/gui/gl/cflags");
ldflags = get("libs/gui/gl/ldflags");
incs = get("libs/gui/gl/includes");
ip = get("libs/gui/gl/include_prefix");
report("Checking for gl vao... ");
logprintf(logdepth, "find_gl_vao...\n");
logdepth++;
sprintf(test_c, test_c_templ, ip);
logprintf(logdepth, "trying vao with includes '%s'\n", incs);
if (try_icl_norun(logdepth, node, test_c, incs, cflags, ldflags) != 0)
return 0;
if (strlen(ip) + strlen(incs)+ strlen(incs_templ) + 8 < sizeof(incs2)) {
sprintf(incs2, incs_templ, incs, ip, ip);
logprintf(logdepth, "trying vao with includes2 '%s'\n", incs2);
if (try_icl_norun(logdepth, node, test_c, incs2, cflags, ldflags) != 0)
return 0;
}
return try_fail(logdepth, node);
}
@ -137,7 +150,8 @@ int find_gl_fb_attachment(const char *name, int logdepth, int fatal)
NL " return 0;"
NL "}"
NL;
char test_c[512];
const char *incs_templ = "#define GL_GLEXT_PROTOTYPES\n%s\n#include <%s/gl.h>\n#include <%s/glext.h>";
char test_c[512], incs2[512];
const char *node = "libs/gui/gl/fb_attachment";
const char *cflags, *ldflags, *incs, *ip;
@ -157,10 +171,17 @@ int find_gl_fb_attachment(const char *name, int logdepth, int fatal)
logdepth++;
sprintf(test_c, test_c_templ, ip);
logprintf(logdepth, "trying fb_att* with includes '%s'\n", incs);
if (try_icl_norun(logdepth, node, test_c, incs, cflags, ldflags) != 0)
return 0;
if (strlen(ip) + strlen(incs)+ strlen(incs_templ) + 8 < sizeof(incs2)) {
sprintf(incs2, incs_templ, incs, ip, ip);
logprintf(logdepth, "trying fb_att* with includes2 '%s'\n", incs2);
if (try_icl_norun(logdepth, node, test_c, incs2, cflags, ldflags) != 0)
return 0;
}
return try_fail(logdepth, node);
}

View File

@ -1942,9 +1942,9 @@ void get_additional_symbols(int what)
char symbol_base_sch[PATH_MAX] = "";
/* copy instance based *_sym_def attributes to symbol */
my_strdup(_ALLOC_ID_, &spice_sym_def, get_tok_value(xctx->inst[i].prop_ptr,"spice_sym_def",0));
my_strdup(_ALLOC_ID_, &verilog_sym_def, get_tok_value(xctx->inst[i].prop_ptr,"verilog_sym_def",0));
my_strdup(_ALLOC_ID_, &vhdl_sym_def, get_tok_value(xctx->inst[i].prop_ptr,"vhdl_sym_def",0));
my_strdup(_ALLOC_ID_, &spice_sym_def, get_tok_value(xctx->inst[i].prop_ptr,"spice_sym_def",4));
my_strdup(_ALLOC_ID_, &verilog_sym_def, get_tok_value(xctx->inst[i].prop_ptr,"verilog_sym_def",4));
my_strdup(_ALLOC_ID_, &vhdl_sym_def, get_tok_value(xctx->inst[i].prop_ptr,"vhdl_sym_def",4));
my_strdup2(_ALLOC_ID_, &sch, tcl_hook2(
str_replace( get_tok_value(xctx->inst[i].prop_ptr,"schematic",2), "@symname",
get_cell(xctx->inst[i].name, 0), '\\')));

View File

@ -605,7 +605,7 @@ int spice_block_netlist(FILE *fd, int i)
/* int multip; */
char *extra=NULL;
int split_f;
const char *sym_def;
char *sym_def = NULL;
char *name = NULL;
const char *default_schematic;
@ -636,9 +636,20 @@ int spice_block_netlist(FILE *fd, int i)
fprintf(fd, "\n* expanding symbol: %s # of pins=%d\n", name,xctx->sym[i].rects[PINLAYER] );
if(xctx->sym[i].base_name) fprintf(fd, "** sym_path: %s\n", abs_sym_path(xctx->sym[i].base_name, ""));
else fprintf(fd, "** sym_path: %s\n", sanitized_abs_sym_path(name, ""));
sym_def = get_tok_value(xctx->sym[i].prop_ptr,"spice_sym_def",0);
if(sym_def[0]) {
fprintf(fd, "%s\n", sym_def);
my_strdup(_ALLOC_ID_, &sym_def, get_tok_value(xctx->sym[i].prop_ptr,"spice_sym_def",0));
if(sym_def) {
char *symname_attr = NULL;
char *templ = NULL;
const char *translated_sym_def;
my_strdup2(_ALLOC_ID_, &templ, get_tok_value(xctx->sym[i].prop_ptr, "template", 0));
my_mstrcat(_ALLOC_ID_, &symname_attr, "symname=", get_cell(name, 0), NULL);
translated_sym_def = translate3(sym_def, 1, "",
templ,
symname_attr);
my_free(_ALLOC_ID_, &templ);
my_free(_ALLOC_ID_, &symname_attr);
fprintf(fd, "%s\n", translated_sym_def);
my_free(_ALLOC_ID_, &sym_def);
} else {
const char *s = sanitize(get_cell(name, 0));
fprintf(fd, "** sch_path: %s\n", sanitized_abs_sym_path(filename, ""));

View File

@ -1822,14 +1822,21 @@ void print_tedax_subckt(FILE *fd, int symbol)
static int has_included_subcircuit(int inst, int symbol, char **result)
{
char *spice_sym_def = NULL;
const char *translated_sym_def;
int ret = 0;
my_strdup2(_ALLOC_ID_, &spice_sym_def, get_tok_value(xctx->inst[inst].prop_ptr, "spice_sym_def", 0));
if(!spice_sym_def[0]) {
my_strdup2(_ALLOC_ID_, &spice_sym_def, get_tok_value(xctx->sym[symbol].prop_ptr, "spice_sym_def", 0));
}
if(xctx->tok_size) {
char *symname = NULL;
char *templ = NULL;
char *symname_attr = NULL;
my_strdup2(_ALLOC_ID_, &templ, get_tok_value(xctx->sym[symbol].prop_ptr, "template", 0));
my_strdup2(_ALLOC_ID_, &symname, get_tok_value(xctx->inst[inst].prop_ptr, "schematic", 0));
if(!symname[0]) {
my_strdup2(_ALLOC_ID_, &symname, get_tok_value(xctx->sym[symbol].prop_ptr, "schematic", 0));
@ -1837,10 +1844,16 @@ static int has_included_subcircuit(int inst, int symbol, char **result)
if(!symname[0]) {
my_strdup2(_ALLOC_ID_, &symname, xctx->sym[symbol].name);
}
my_mstrcat(_ALLOC_ID_, &symname_attr, "symname=", get_cell(symname, 0), NULL);
translated_sym_def = translate3(spice_sym_def, 1, "",
templ,
symname_attr);
strtolower(symname);
tclvareval("has_included_subcircuit {", get_cell(symname, 0), "} {",
spice_sym_def, "}", NULL);
translated_sym_def, "}", NULL);
my_free(_ALLOC_ID_, &templ);
my_free(_ALLOC_ID_, &symname);
my_free(_ALLOC_ID_, &symname_attr);
if(tclresult()[0]) {
char *subckt_pin, *pin_save;
char *net, *net_save;