remove spaces on line ends, brace expr tcl expression when possible, resize rectangle in intuitive interface made easier at far zoom levels

This commit is contained in:
stef 2025-12-13 11:51:05 +01:00
parent 688f5fd128
commit 7d8ce2f9ad
97 changed files with 2625 additions and 2625 deletions

View File

@ -280,12 +280,12 @@ int hook_detect_target()
append("cc/cflags", " "); append("cc/cflags", " ");
append("cc/cflags", get("cc/argstd/Wall")); append("cc/cflags", get("cc/argstd/Wall"));
} }
if (require("cc/argstd/std_c89", 0, 0) == 0) { if (require("cc/argstd/std_c89", 0, 0) == 0) {
append("cc/cflags", " "); append("cc/cflags", " ");
append("cc/cflags", get("cc/argstd/std_c89")); append("cc/cflags", get("cc/argstd/std_c89"));
} }
if (require("cc/argstd/pedantic", 0, 0) == 0) { if (require("cc/argstd/pedantic", 0, 0) == 0) {
append("cc/cflags", " "); append("cc/cflags", " ");
append("cc/cflags", get("cc/argstd/pedantic")); append("cc/cflags", get("cc/argstd/pedantic"));
@ -305,7 +305,7 @@ int hook_detect_target()
append("cc/ldflags", get("cc/argstd/pg")); append("cc/ldflags", get("cc/argstd/pg"));
} }
/* no-pie no more needed it seems */ /* no-pie no more needed it seems */
/* /*
if (require("cc/argstd/no-pie", 0, 0) == 0) { if (require("cc/argstd/no-pie", 0, 0) == 0) {
append("cc/cflags", " "); append("cc/cflags", " ");
append("cc/cflags", get("cc/argstd/no-pie")); append("cc/cflags", get("cc/argstd/no-pie"));

View File

@ -33,9 +33,9 @@ void here(double i)
/* super simple 32 bit hashing function for files /* super simple 32 bit hashing function for files
* It is suppoded to be used on text files. * It is suppoded to be used on text files.
* Calculates the same hash on windows (crlf) and unix (lf) text files. * Calculates the same hash on windows (crlf) and unix (lf) text files.
* If you want high collision resistance and * If you want high collision resistance and
* avoid 'birthday problem' collisions use a better hash function, like md5sum * avoid 'birthday problem' collisions use a better hash function, like md5sum
* or sha256sum * or sha256sum
*/ */
unsigned int hash_file(const char *f, int skip_path_lines) unsigned int hash_file(const char *f, int skip_path_lines)
{ {
@ -107,8 +107,8 @@ const char *get_text_floater(int i)
if(!xctx->floater_inst_table.table) { if(!xctx->floater_inst_table.table) {
floater_hash_all_names(); floater_hash_all_names();
} }
if(xctx->text[i].floater_instname) if(xctx->text[i].floater_instname)
instname = xctx->text[i].floater_instname; instname = xctx->text[i].floater_instname;
else { else {
instname = get_tok_value(xctx->text[i].prop_ptr, "name", 0); instname = get_tok_value(xctx->text[i].prop_ptr, "name", 0);
@ -128,7 +128,7 @@ const char *get_text_floater(int i)
} }
dbg(1, "floater: %s\n",txt_ptr); dbg(1, "floater: %s\n",txt_ptr);
} else { } else {
/* do just a tcl substitution if floater does not reference an existing instance /* do just a tcl substitution if floater does not reference an existing instance
* (but name=something or floater=something attribute must be present) and text * (but name=something or floater=something attribute must be present) and text
* matches tcleval(...) or contains '@' */ * matches tcleval(...) or contains '@' */
if(strstr(txt_ptr, "tcleval(") == txt_ptr || strchr(txt_ptr, '@')) { if(strstr(txt_ptr, "tcleval(") == txt_ptr || strchr(txt_ptr, '@')) {
@ -139,7 +139,7 @@ const char *get_text_floater(int i)
} }
} }
return txt_ptr; return txt_ptr;
} }
/* mod: /* mod:
* 0 : clear modified flag, update title and tab names, upd. simulation button colors. * 0 : clear modified flag, update title and tab names, upd. simulation button colors.
@ -154,7 +154,7 @@ const char *get_text_floater(int i)
int set_modify(int mod) int set_modify(int mod)
{ {
int i, floaters = 0; int i, floaters = 0;
dbg(1, "set_modify(): %d, prev_set_modify=%d\n", mod, xctx->prev_set_modify); dbg(1, "set_modify(): %d, prev_set_modify=%d\n", mod, xctx->prev_set_modify);
/* set modify state */ /* set modify state */
@ -187,8 +187,8 @@ int set_modify(int mod)
tclvareval("catch {", xctx->top_path, ".menubar entryconfigure Waves -background $simulate_bg}", NULL); tclvareval("catch {", xctx->top_path, ".menubar entryconfigure Waves -background $simulate_bg}", NULL);
} }
} }
} }
/* clear floater caches */ /* clear floater caches */
if(mod == 1 || mod == -2 || mod == -1) { if(mod == 1 || mod == -2 || mod == -1) {
for(i = 0; i < xctx->texts; i++) for(i = 0; i < xctx->texts; i++)
@ -279,7 +279,7 @@ char *escape_chars(const char *source, const char *charset)
dest[d++] = source[s]; dest[d++] = source[s];
} }
} else { } else {
if(strchr(charset, source[s])) { if(strchr(charset, source[s])) {
dest[d++] = '\\'; dest[d++] = '\\';
dest[d++] = source[s]; dest[d++] = source[s];
} else { } else {
@ -337,15 +337,15 @@ void set_grid(double newgrid)
} }
/* /*
*
* *
*
* what==0: force creation of $netlist_dir (if netlist_dir variable not empty) * what==0: force creation of $netlist_dir (if netlist_dir variable not empty)
* and return current setting. * and return current setting.
* *
* what==1: if no dir given prompt user * what==1: if no dir given prompt user
* else set netlist_dir to dir * else set netlist_dir to dir
* *
* what==2: just set netlist_dir according to local_netlist_dir setting * what==2: just set netlist_dir according to local_netlist_dir setting
*/ */
int set_netlist_dir(int what, const char *dir) int set_netlist_dir(int what, const char *dir)
@ -363,9 +363,9 @@ int set_netlist_dir(int what, const char *dir)
/* wrapper to TCL function */ /* wrapper to TCL function */
/* remove parameter section of symbol generator before calculating abs path : xxx(a,b) -> xxx */ /* remove parameter section of symbol generator before calculating abs path : xxx(a,b) -> xxx */
const char *sanitized_abs_sym_path(const char *s, const char *ext) const char *sanitized_abs_sym_path(const char *s, const char *ext)
{ {
char c[PATH_MAX+1000]; char c[PATH_MAX+1000];
my_snprintf(c, S(c), "abs_sym_path [regsub {\\(.*} {%s} {}] {%s}", s, ext); my_snprintf(c, S(c), "abs_sym_path [regsub {\\(.*} {%s} {}] {%s}", s, ext);
tcleval(c); tcleval(c);
return tclresult(); return tclresult();
@ -493,12 +493,12 @@ void new_xschem_process(const char* cell, int symbol)
ZeroMemory(&si, sizeof(si)); ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si); si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi)); ZeroMemory(&pi, sizeof(pi));
/* "detach" (-b) is not processed for Windows, so /* "detach" (-b) is not processed for Windows, so
use DETACHED_PROCESS in CreateProcessA to not create use DETACHED_PROCESS in CreateProcessA to not create
a TCL shell a TCL shell
*/ */
if (!cell || !cell[0]) { if (!cell || !cell[0]) {
if (!symbol) if (!symbol)
my_snprintf(cmd_line, S(cmd_line), "%s -b -s --tcl \"set XSCHEM_START_WINDOW {}\"", xschem_executable); my_snprintf(cmd_line, S(cmd_line), "%s -b -s --tcl \"set XSCHEM_START_WINDOW {}\"", xschem_executable);
else else
my_snprintf(cmd_line, S(cmd_line), "%s -b -y --tcl \"set XSCHEM_START_WINDOW {}\"", xschem_executable); my_snprintf(cmd_line, S(cmd_line), "%s -b -y --tcl \"set XSCHEM_START_WINDOW {}\"", xschem_executable);
@ -537,7 +537,7 @@ const char *get_file_path(char *f)
* 1 : file saved or not needed to save since no change * 1 : file saved or not needed to save since no change
* -1 : user cancel * -1 : user cancel
* 0 : file not saved due to errors or per user request * 0 : file not saved due to errors or per user request
* confirm: * confirm:
* 0 : do not ask user to save * 0 : do not ask user to save
* 1 : ask user to save * 1 : ask user to save
* fast: * fast:
@ -557,7 +557,7 @@ int save(int confirm, int fast)
force = 1; force = 1;
confirm = 0; confirm = 0;
} }
} }
if(force || xctx->modified) if(force || xctx->modified)
{ {
@ -624,7 +624,7 @@ void ask_new_file(int in_new_window, char *filename)
char win_path[WINDOW_PATH_SIZE]; char win_path[WINDOW_PATH_SIZE];
int skip = 0; int skip = 0;
dbg(1, "ask_new_file(): load: f=%s\n", f); dbg(1, "ask_new_file(): load: f=%s\n", f);
if(check_loaded(f, win_path) && !filename && if(check_loaded(f, win_path) && !filename &&
xctx->current_win_path && strcmp(win_path, xctx->current_win_path)) { xctx->current_win_path && strcmp(win_path, xctx->current_win_path)) {
char msg[PATH_MAX + 100]; char msg[PATH_MAX + 100];
@ -687,7 +687,7 @@ void remove_symbol(int j)
} }
my_free(_ALLOC_ID_, &xctx->sym[j].poly[c]); my_free(_ALLOC_ID_, &xctx->sym[j].poly[c]);
xctx->sym[j].polygons[c] = 0; xctx->sym[j].polygons[c] = 0;
for(i=0;i<xctx->sym[j].lines[c]; ++i) { for(i=0;i<xctx->sym[j].lines[c]; ++i) {
if(xctx->sym[j].line[c][i].prop_ptr != NULL) { if(xctx->sym[j].line[c][i].prop_ptr != NULL) {
my_free(_ALLOC_ID_, &xctx->sym[j].line[c][i].prop_ptr); my_free(_ALLOC_ID_, &xctx->sym[j].line[c][i].prop_ptr);
@ -695,7 +695,7 @@ void remove_symbol(int j)
} }
my_free(_ALLOC_ID_, &xctx->sym[j].line[c]); my_free(_ALLOC_ID_, &xctx->sym[j].line[c]);
xctx->sym[j].lines[c] = 0; xctx->sym[j].lines[c] = 0;
for(i=0;i<xctx->sym[j].arcs[c]; ++i) { for(i=0;i<xctx->sym[j].arcs[c]; ++i) {
if(xctx->sym[j].arc[c][i].prop_ptr != NULL) { if(xctx->sym[j].arc[c][i].prop_ptr != NULL) {
my_free(_ALLOC_ID_, &xctx->sym[j].arc[c][i].prop_ptr); my_free(_ALLOC_ID_, &xctx->sym[j].arc[c][i].prop_ptr);
@ -703,7 +703,7 @@ void remove_symbol(int j)
} }
my_free(_ALLOC_ID_, &xctx->sym[j].arc[c]); my_free(_ALLOC_ID_, &xctx->sym[j].arc[c]);
xctx->sym[j].arcs[c] = 0; xctx->sym[j].arcs[c] = 0;
for(i=0;i<xctx->sym[j].rects[c]; ++i) { for(i=0;i<xctx->sym[j].rects[c]; ++i) {
if(xctx->sym[j].rect[c][i].prop_ptr != NULL) { if(xctx->sym[j].rect[c][i].prop_ptr != NULL) {
my_free(_ALLOC_ID_, &xctx->sym[j].rect[c][i].prop_ptr); my_free(_ALLOC_ID_, &xctx->sym[j].rect[c][i].prop_ptr);
@ -822,7 +822,7 @@ int set_sym_flags(xSymbol *sym)
sym->flags |= SPECTRE_SHORT; sym->flags |= SPECTRE_SHORT;
else if(!strboolcmp(ptr, "true") || !strcmp(ptr, "open")) else if(!strboolcmp(ptr, "true") || !strcmp(ptr, "open"))
sym->flags |= SPECTRE_IGNORE; sym->flags |= SPECTRE_IGNORE;
ptr = get_tok_value(sym->prop_ptr,"verilog_ignore",0); ptr = get_tok_value(sym->prop_ptr,"verilog_ignore",0);
if(!strcmp(ptr, "short")) if(!strcmp(ptr, "short"))
sym->flags |= VERILOG_SHORT; sym->flags |= VERILOG_SHORT;
@ -869,7 +869,7 @@ int set_inst_flags(xInstance *inst)
inst->flags |= HIDE_INST; inst->flags |= HIDE_INST;
if(!strboolcmp(get_tok_value(inst->prop_ptr,"hide_texts",0), "true")) if(!strboolcmp(get_tok_value(inst->prop_ptr,"hide_texts",0), "true"))
inst->flags |= HIDE_SYMBOL_TEXTS; inst->flags |= HIDE_SYMBOL_TEXTS;
ptr = get_tok_value(inst->prop_ptr,"spice_ignore",0); ptr = get_tok_value(inst->prop_ptr,"spice_ignore",0);
if(!strcmp(ptr, "short")) if(!strcmp(ptr, "short"))
inst->flags |= SPICE_SHORT; inst->flags |= SPICE_SHORT;
@ -881,25 +881,25 @@ int set_inst_flags(xInstance *inst)
inst->flags |= SPECTRE_SHORT; inst->flags |= SPECTRE_SHORT;
else if(!strboolcmp(ptr, "true") || !strcmp(ptr, "open")) else if(!strboolcmp(ptr, "true") || !strcmp(ptr, "open"))
inst->flags |= SPECTRE_IGNORE; inst->flags |= SPECTRE_IGNORE;
ptr = get_tok_value(inst->prop_ptr,"verilog_ignore",0); ptr = get_tok_value(inst->prop_ptr,"verilog_ignore",0);
if(!strcmp(ptr, "short")) if(!strcmp(ptr, "short"))
inst->flags |= VERILOG_SHORT; inst->flags |= VERILOG_SHORT;
else if(!strboolcmp(ptr, "true") || !strcmp(ptr, "open")) else if(!strboolcmp(ptr, "true") || !strcmp(ptr, "open"))
inst->flags |= VERILOG_IGNORE; inst->flags |= VERILOG_IGNORE;
ptr = get_tok_value(inst->prop_ptr,"vhdl_ignore",0); ptr = get_tok_value(inst->prop_ptr,"vhdl_ignore",0);
if(!strcmp(ptr, "short")) if(!strcmp(ptr, "short"))
inst->flags |= VHDL_SHORT; inst->flags |= VHDL_SHORT;
else if(!strboolcmp(ptr, "true") || !strcmp(ptr, "open")) else if(!strboolcmp(ptr, "true") || !strcmp(ptr, "open"))
inst->flags |= VHDL_IGNORE; inst->flags |= VHDL_IGNORE;
ptr = get_tok_value(inst->prop_ptr,"tedax_ignore",0); ptr = get_tok_value(inst->prop_ptr,"tedax_ignore",0);
if(!strcmp(ptr, "short")) if(!strcmp(ptr, "short"))
inst->flags |= TEDAX_SHORT; inst->flags |= TEDAX_SHORT;
else if(!strboolcmp(ptr, "true") || !strcmp(ptr, "open")) else if(!strboolcmp(ptr, "true") || !strcmp(ptr, "open"))
inst->flags |= TEDAX_IGNORE; inst->flags |= TEDAX_IGNORE;
ptr = get_tok_value(inst->prop_ptr,"lvs_ignore",0); ptr = get_tok_value(inst->prop_ptr,"lvs_ignore",0);
if(!strcmp(ptr, "short")) if(!strcmp(ptr, "short"))
inst->flags |= LVS_IGNORE_SHORT; inst->flags |= LVS_IGNORE_SHORT;
@ -958,13 +958,13 @@ void reset_caches(void)
dbg(1, "reset_caches()\n"); dbg(1, "reset_caches()\n");
for(i = 0; i < xctx->instances; i++) { for(i = 0; i < xctx->instances; i++) {
set_inst_flags(&xctx->inst[i]); set_inst_flags(&xctx->inst[i]);
} }
for(i = 0; i < xctx->symbols; i++) { for(i = 0; i < xctx->symbols; i++) {
set_sym_flags(&xctx->sym[i]); set_sym_flags(&xctx->sym[i]);
} }
} }
/* what: /* what:
* 1: create * 1: create
* 0: clear * 0: clear
*/ */
@ -1151,7 +1151,7 @@ int connect_by_kissing(void)
wptr = wptr->next; wptr = wptr->next;
} }
if(kissing) { if(kissing) {
if(!done_undo) { if(!done_undo) {
xctx->push_undo(); xctx->push_undo();
done_undo = 1; done_undo = 1;
@ -1339,7 +1339,7 @@ void attach_labels_to_inst(int interactive) /* offloaded from callback.c 201710
my_strdup(_ALLOC_ID_, &prop, xctx->inst[xctx->sel_array[j].n].instname); my_strdup(_ALLOC_ID_, &prop, xctx->inst[xctx->sel_array[j].n].instname);
my_strcat(_ALLOC_ID_, &prop, "_"); my_strcat(_ALLOC_ID_, &prop, "_");
tclsetvar("custom_label_prefix",prop); tclsetvar("custom_label_prefix",prop);
if(interactive == 1 && !do_all_inst) { if(interactive == 1 && !do_all_inst) {
dbg(1,"attach_labels_to_inst(): invoking tcl attach_labels_to_inst\n"); dbg(1,"attach_labels_to_inst(): invoking tcl attach_labels_to_inst\n");
tcleval("attach_labels_to_inst"); tcleval("attach_labels_to_inst");
@ -1369,7 +1369,7 @@ void attach_labels_to_inst(int interactive) /* offloaded from callback.c 201710
xctx->inst[xctx->sel_array[j].n].x0, xctx->inst[xctx->sel_array[j].n].x0,
xctx->inst[xctx->sel_array[j].n].y0, xctx->inst[xctx->sel_array[j].n].y0,
xctx->sym[xctx->inst[xctx->sel_array[j].n].ptr].name); xctx->sym[xctx->inst[xctx->sel_array[j].n].ptr].name);
x0 = xctx->inst[xctx->sel_array[j].n].x0; x0 = xctx->inst[xctx->sel_array[j].n].x0;
y0 = xctx->inst[xctx->sel_array[j].n].y0; y0 = xctx->inst[xctx->sel_array[j].n].y0;
rot = xctx->inst[xctx->sel_array[j].n].rot; rot = xctx->inst[xctx->sel_array[j].n].rot;
@ -1377,29 +1377,29 @@ void attach_labels_to_inst(int interactive) /* offloaded from callback.c 201710
symbol = xctx->sym + xctx->inst[xctx->sel_array[j].n].ptr; symbol = xctx->sym + xctx->inst[xctx->sel_array[j].n].ptr;
npin = symbol->rects[PINLAYER]; npin = symbol->rects[PINLAYER];
rct=symbol->rect[PINLAYER]; rct=symbol->rect[PINLAYER];
for(i=0;i<npin; ++i) { for(i=0;i<npin; ++i) {
my_strdup(_ALLOC_ID_, &labname,get_tok_value(rct[i].prop_ptr,"name",1)); my_strdup(_ALLOC_ID_, &labname,get_tok_value(rct[i].prop_ptr,"name",1));
dbg(1,"attach_labels_to_inst(): 2 --> labname=%s\n", labname); dbg(1,"attach_labels_to_inst(): 2 --> labname=%s\n", labname);
pinx0 = (rct[i].x1+rct[i].x2)/2; pinx0 = (rct[i].x1+rct[i].x2)/2;
piny0 = (rct[i].y1+rct[i].y2)/2; piny0 = (rct[i].y1+rct[i].y2)/2;
if(strcmp(get_tok_value(rct[i].prop_ptr,"dir",0),"in")) dir=1; /* out or inout pin */ if(strcmp(get_tok_value(rct[i].prop_ptr,"dir",0),"in")) dir=1; /* out or inout pin */
else dir=0; /* input pin */ else dir=0; /* input pin */
/* opin or iopin on left of symbol--> reverse orientation 20171205 */ /* opin or iopin on left of symbol--> reverse orientation 20171205 */
if(rotated_text ==-1 && dir==1 && pinx0<0) dir=0; if(rotated_text ==-1 && dir==1 && pinx0<0) dir=0;
ROTATION(rot, flip, 0.0, 0.0, pinx0, piny0, pinx0, piny0); ROTATION(rot, flip, 0.0, 0.0, pinx0, piny0, pinx0, piny0);
pinx0 += x0; pinx0 += x0;
piny0 += y0; piny0 += y0;
get_square(pinx0, piny0, &sqx, &sqy); get_square(pinx0, piny0, &sqx, &sqy);
iptr=xctx->instpin_spatial_table[sqx][sqy]; iptr=xctx->instpin_spatial_table[sqx][sqy];
wptr=xctx->wire_spatial_table[sqx][sqy]; wptr=xctx->wire_spatial_table[sqx][sqy];
skip=0; skip=0;
while(iptr) { while(iptr) {
ii = iptr->n; ii = iptr->n;
@ -1407,7 +1407,7 @@ void attach_labels_to_inst(int interactive) /* offloaded from callback.c 201710
iptr = iptr->next; iptr = iptr->next;
continue; continue;
} }
if( iptr->x0 == pinx0 && iptr->y0 == piny0 ) { if( iptr->x0 == pinx0 && iptr->y0 == piny0 ) {
skip=1; skip=1;
break; break;
@ -1428,7 +1428,7 @@ void attach_labels_to_inst(int interactive) /* offloaded from callback.c 201710
my_strcat(_ALLOC_ID_, &prop, (char *)tclgetvar("custom_label_prefix")); my_strcat(_ALLOC_ID_, &prop, (char *)tclgetvar("custom_label_prefix"));
} }
/* /20171005 */ /* /20171005 */
my_strcat(_ALLOC_ID_, &prop, labname); my_strcat(_ALLOC_ID_, &prop, labname);
dir ^= flip; /* 20101129 20111030 */ dir ^= flip; /* 20101129 20111030 */
if(rotated_text ==-1) { if(rotated_text ==-1) {
@ -1466,7 +1466,7 @@ void attach_labels_to_inst(int interactive) /* offloaded from callback.c 201710
} }
/* if hilights are present in schematic propagate to new added labels */ /* if hilights are present in schematic propagate to new added labels */
if(xctx->hilight_nets) { if(xctx->hilight_nets) {
propagate_hilights(1, 0, XINSERT_NOREPLACE); propagate_hilights(1, 0, XINSERT_NOREPLACE);
redraw_hilights(0); redraw_hilights(0);
} }
my_free(_ALLOC_ID_, &symname_pin); my_free(_ALLOC_ID_, &symname_pin);
@ -1603,7 +1603,7 @@ int place_symbol(int pos, const char *symbol_name, double x, double y, short rot
} }
dbg(1, "place_symbol(): done set_inst_prop()\n"); /* 03-02-2000 */ dbg(1, "place_symbol(): done set_inst_prop()\n"); /* 03-02-2000 */
xctx->instances++;/* translate expects the correct balue of xctx->instances */ xctx->instances++;/* translate expects the correct balue of xctx->instances */
/* After having assigned prop_ptr to new instance translate symbol reference /* After having assigned prop_ptr to new instance translate symbol reference
* to resolve @params --> res.tcl(@value\) --> res.tcl(100) */ * to resolve @params --> res.tcl(@value\) --> res.tcl(100) */
@ -1647,10 +1647,10 @@ int place_symbol(int pos, const char *symbol_name, double x, double y, short rot
dbg(0, "%s", msg); dbg(0, "%s", msg);
if(has_x) tclvareval("alert_ {", msg, "} {} 1", NULL); if(has_x) tclvareval("alert_ {", msg, "} {} 1", NULL);
#if 1 #if 1
if(xctx->inst[n].instname) my_free(_ALLOC_ID_, &xctx->inst[n].instname); if(xctx->inst[n].instname) my_free(_ALLOC_ID_, &xctx->inst[n].instname);
if(xctx->inst[n].name) my_free(_ALLOC_ID_, &xctx->inst[n].name); if(xctx->inst[n].name) my_free(_ALLOC_ID_, &xctx->inst[n].name);
if(xctx->inst[n].prop_ptr) my_free(_ALLOC_ID_, &xctx->inst[n].prop_ptr); if(xctx->inst[n].prop_ptr) my_free(_ALLOC_ID_, &xctx->inst[n].prop_ptr);
if(xctx->inst[n].lab) my_free(_ALLOC_ID_, &xctx->inst[n].lab); if(xctx->inst[n].lab) my_free(_ALLOC_ID_, &xctx->inst[n].lab);
if(prop) my_free(_ALLOC_ID_, &prop); if(prop) my_free(_ALLOC_ID_, &prop);
xctx->instances--; xctx->instances--;
return 0; return 0;
@ -1701,7 +1701,7 @@ void symbol_in_new_window(int new_process)
char filename[PATH_MAX]; char filename[PATH_MAX];
char win_path[WINDOW_PATH_SIZE]; char win_path[WINDOW_PATH_SIZE];
rebuild_selected_array(); rebuild_selected_array();
if(xctx->lastsel !=1 || xctx->sel_array[0].type!=ELEMENT) { if(xctx->lastsel !=1 || xctx->sel_array[0].type!=ELEMENT) {
if(tclgetboolvar("search_schematic")) { if(tclgetboolvar("search_schematic")) {
my_strncpy(filename, abs_sym_path(xctx->current_name, ".sym"), S(filename)); my_strncpy(filename, abs_sym_path(xctx->current_name, ".sym"), S(filename));
@ -1736,7 +1736,7 @@ int copy_hierarchy_data(const char *from_win_path, const char *to_win_path)
Str_hashentry **fromnext; Str_hashentry **fromnext;
Str_hashentry **tonext; Str_hashentry **tonext;
if(!get_window_count()) { return 0; } if(!get_window_count()) { return 0; }
save_xctx = get_save_xctx(); save_xctx = get_save_xctx();
n = get_tab_or_window_number(from_win_path); n = get_tab_or_window_number(from_win_path);
@ -1889,7 +1889,7 @@ void launcher(void)
} }
/* get symbol reference of instance 'inst', looking into /* get symbol reference of instance 'inst', looking into
* instance 'schematic' attribute (and appending '.sym') if set * instance 'schematic' attribute (and appending '.sym') if set
* or get it from inst[inst].name. * or get it from inst[inst].name.
* perform tcl substitution of the result and * perform tcl substitution of the result and
@ -1904,9 +1904,9 @@ const char *get_sym_name(int inst, int ndir, int ext, int abs_path)
/* resolve schematic=generator.tcl( @n ) where n=11 is defined in instance attrs */ /* resolve schematic=generator.tcl( @n ) where n=11 is defined in instance attrs */
my_strdup2(_ALLOC_ID_, &sch, get_tok_value(xctx->inst[inst].prop_ptr,"schematic", 6)); my_strdup2(_ALLOC_ID_, &sch, get_tok_value(xctx->inst[inst].prop_ptr,"schematic", 6));
schematic_token_found = xctx->tok_size; schematic_token_found = xctx->tok_size;
if(sch && sch[0]) if(sch && sch[0])
my_strdup2(_ALLOC_ID_, &sch, translate3(sch, 1, xctx->inst[inst].prop_ptr, NULL, NULL, NULL)); my_strdup2(_ALLOC_ID_, &sch, translate3(sch, 1, xctx->inst[inst].prop_ptr, NULL, NULL, NULL));
if(sch && sch[0]) if(sch && sch[0])
my_strdup2(_ALLOC_ID_, &sch, tcl_hook2( my_strdup2(_ALLOC_ID_, &sch, tcl_hook2(
str_replace(sch, "@symname", get_cell(xctx->inst[inst].name, 0), '\\', -1))); str_replace(sch, "@symname", get_cell(xctx->inst[inst].name, 0), '\\', -1)));
@ -1916,12 +1916,12 @@ const char *get_sym_name(int inst, int ndir, int ext, int abs_path)
*/ */
dbg(1, "get_sym_name(): sch=%s\n", sch); dbg(1, "get_sym_name(): sch=%s\n", sch);
if(schematic_token_found) { /* token exists */ if(schematic_token_found) { /* token exists */
if(abs_path) if(abs_path)
sym = abs_sym_path(sch, ".sym"); sym = abs_sym_path(sch, ".sym");
else else
sym = add_ext(rel_sym_path(sch), ".sym"); sym = add_ext(rel_sym_path(sch), ".sym");
} }
else { else {
if(abs_path) if(abs_path)
sym = abs_sym_path(tcl_hook2(xctx->inst[inst].name), ""); sym = abs_sym_path(tcl_hook2(xctx->inst[inst].name), "");
@ -1937,7 +1937,7 @@ const char *get_sym_name(int inst, int ndir, int ext, int abs_path)
void copy_symbol(xSymbol *dest_sym, xSymbol *src_sym) void copy_symbol(xSymbol *dest_sym, xSymbol *src_sym)
{ {
int c, j; int c, j;
dest_sym->minx = src_sym->minx; dest_sym->minx = src_sym->minx;
dest_sym->maxx = src_sym->maxx; dest_sym->maxx = src_sym->maxx;
dest_sym->miny = src_sym->miny; dest_sym->miny = src_sym->miny;
@ -1974,14 +1974,14 @@ void copy_symbol(xSymbol *dest_sym, xSymbol *src_sym)
for(c = 0;c<cadlayers; ++c) { for(c = 0;c<cadlayers; ++c) {
/* symbol lines */ /* symbol lines */
dest_sym->line[c] = my_calloc(_ALLOC_ID_, src_sym->lines[c], sizeof(xLine)); dest_sym->line[c] = my_calloc(_ALLOC_ID_, src_sym->lines[c], sizeof(xLine));
for(j = 0; j < src_sym->lines[c]; ++j) { for(j = 0; j < src_sym->lines[c]; ++j) {
dest_sym->line[c][j] = src_sym->line[c][j]; dest_sym->line[c][j] = src_sym->line[c][j];
dest_sym->line[c][j].prop_ptr = NULL; dest_sym->line[c][j].prop_ptr = NULL;
my_strdup(_ALLOC_ID_, &dest_sym->line[c][j].prop_ptr, src_sym->line[c][j].prop_ptr); my_strdup(_ALLOC_ID_, &dest_sym->line[c][j].prop_ptr, src_sym->line[c][j].prop_ptr);
} }
/* symbol rects */ /* symbol rects */
dest_sym->rect[c] = my_calloc(_ALLOC_ID_, src_sym->rects[c], sizeof(xRect)); dest_sym->rect[c] = my_calloc(_ALLOC_ID_, src_sym->rects[c], sizeof(xRect));
for(j = 0; j < src_sym->rects[c]; ++j) { for(j = 0; j < src_sym->rects[c]; ++j) {
dest_sym->rect[c][j] = src_sym->rect[c][j]; dest_sym->rect[c][j] = src_sym->rect[c][j];
dest_sym->rect[c][j].prop_ptr = NULL; dest_sym->rect[c][j].prop_ptr = NULL;
dest_sym->rect[c][j].extraptr = NULL; dest_sym->rect[c][j].extraptr = NULL;
@ -1989,14 +1989,14 @@ void copy_symbol(xSymbol *dest_sym, xSymbol *src_sym)
} }
/* symbol arcs */ /* symbol arcs */
dest_sym->arc[c] = my_calloc(_ALLOC_ID_, src_sym->arcs[c], sizeof(xArc)); dest_sym->arc[c] = my_calloc(_ALLOC_ID_, src_sym->arcs[c], sizeof(xArc));
for(j = 0; j < src_sym->arcs[c]; ++j) { for(j = 0; j < src_sym->arcs[c]; ++j) {
dest_sym->arc[c][j] = src_sym->arc[c][j]; dest_sym->arc[c][j] = src_sym->arc[c][j];
dest_sym->arc[c][j].prop_ptr = NULL; dest_sym->arc[c][j].prop_ptr = NULL;
my_strdup(_ALLOC_ID_, &dest_sym->arc[c][j].prop_ptr, src_sym->arc[c][j].prop_ptr); my_strdup(_ALLOC_ID_, &dest_sym->arc[c][j].prop_ptr, src_sym->arc[c][j].prop_ptr);
} }
/* symbol polygons */ /* symbol polygons */
dest_sym->poly[c] = my_calloc(_ALLOC_ID_, src_sym->polygons[c], sizeof(xPoly)); dest_sym->poly[c] = my_calloc(_ALLOC_ID_, src_sym->polygons[c], sizeof(xPoly));
for(j = 0; j < src_sym->polygons[c]; ++j) { for(j = 0; j < src_sym->polygons[c]; ++j) {
int points = src_sym->poly[c][j].points; int points = src_sym->poly[c][j].points;
dest_sym->poly[c][j] = src_sym->poly[c][j]; dest_sym->poly[c][j] = src_sym->poly[c][j];
dest_sym->poly[c][j].prop_ptr = NULL; dest_sym->poly[c][j].prop_ptr = NULL;
@ -2025,7 +2025,7 @@ void copy_symbol(xSymbol *dest_sym, xSymbol *src_sym)
my_strdup2(_ALLOC_ID_, &dest_sym->text[j].font, src_sym->text[j].font); my_strdup2(_ALLOC_ID_, &dest_sym->text[j].font, src_sym->text[j].font);
my_strdup2(_ALLOC_ID_, &dest_sym->text[j].floater_instname, src_sym->text[j].floater_instname); my_strdup2(_ALLOC_ID_, &dest_sym->text[j].floater_instname, src_sym->text[j].floater_instname);
} }
} }
void toggle_ignore(void) void toggle_ignore(void)
{ {
@ -2057,7 +2057,7 @@ void toggle_ignore(void)
else if(flag == 1) flag = 2; else if(flag == 1) flag = 2;
else flag = 0; else flag = 0;
if(flag == 1) { if(flag == 1) {
my_strdup(_ALLOC_ID_, &xctx->inst[i].prop_ptr, subst_token(xctx->inst[i].prop_ptr, attr, "true")); my_strdup(_ALLOC_ID_, &xctx->inst[i].prop_ptr, subst_token(xctx->inst[i].prop_ptr, attr, "true"));
} else if(flag == 2) { } else if(flag == 2) {
@ -2104,7 +2104,7 @@ void get_additional_symbols(int what)
char *sch = NULL; char *sch = NULL;
char symbol_base_sch[PATH_MAX] = ""; char symbol_base_sch[PATH_MAX] = "";
size_t schematic_token_found = 0; size_t schematic_token_found = 0;
if(xctx->inst[i].ptr < 0) continue; if(xctx->inst[i].ptr < 0) continue;
dbg(1, "get_additional_symbols(): inst=%d (%s) sch=%s\n",i, xctx->inst[i].name, sch); dbg(1, "get_additional_symbols(): inst=%d (%s) sch=%s\n",i, xctx->inst[i].name, sch);
/* copy instance based *_sym_def attributes to symbol */ /* copy instance based *_sym_def attributes to symbol */
@ -2120,7 +2120,7 @@ void get_additional_symbols(int what)
my_strdup2(_ALLOC_ID_, &sch, translate3(sch, 1, xctx->inst[i].prop_ptr, NULL, NULL, NULL)); my_strdup2(_ALLOC_ID_, &sch, translate3(sch, 1, xctx->inst[i].prop_ptr, NULL, NULL, NULL));
dbg(1, " get_additional_symbols(): sch=%s tok_size= %ld\n", sch, xctx->tok_size); dbg(1, " get_additional_symbols(): sch=%s tok_size= %ld\n", sch, xctx->tok_size);
my_strdup2(_ALLOC_ID_, &sch, tcl_hook2( my_strdup2(_ALLOC_ID_, &sch, tcl_hook2(
str_replace(sch, "@symname", get_cell(xctx->inst[i].name, 0), '\\', -1))); str_replace(sch, "@symname", get_cell(xctx->inst[i].name, 0), '\\', -1)));
dbg(1, " get_additional_symbols(): sch=%s\n", sch); dbg(1, " get_additional_symbols(): sch=%s\n", sch);
@ -2155,13 +2155,13 @@ void get_additional_symbols(int what)
my_mstrcat(_ALLOC_ID_, &symname_attr, "symname=", get_cell(sym, 0), NULL); my_mstrcat(_ALLOC_ID_, &symname_attr, "symname=", get_cell(sym, 0), NULL);
my_mstrcat(_ALLOC_ID_, &symname_attr, " symref=", get_sym_name(i, 9999, 1, 1), NULL); my_mstrcat(_ALLOC_ID_, &symname_attr, " symref=", get_sym_name(i, 9999, 1, 1), NULL);
my_strdup(_ALLOC_ID_, &spice_sym_def, my_strdup(_ALLOC_ID_, &spice_sym_def,
translate3(spice_sym_def, 1, xctx->inst[i].prop_ptr, translate3(spice_sym_def, 1, xctx->inst[i].prop_ptr,
symptr->templ, symptr->templ,
symname_attr, NULL)); symname_attr, NULL));
my_strdup(_ALLOC_ID_, &spectre_sym_def, my_strdup(_ALLOC_ID_, &spectre_sym_def,
translate3(spectre_sym_def, 1, xctx->inst[i].prop_ptr, translate3(spectre_sym_def, 1, xctx->inst[i].prop_ptr,
symptr->templ, symptr->templ,
symname_attr, NULL)); symname_attr, NULL));
my_free(_ALLOC_ID_, &symname_attr); my_free(_ALLOC_ID_, &symname_attr);
/* if instance symbol has default_schematic set to ignore copy the symbol anyway, since /* if instance symbol has default_schematic set to ignore copy the symbol anyway, since
@ -2180,7 +2180,7 @@ void get_additional_symbols(int what)
/* the copied symbol will not inherit the default_schematic attribute otherwise it will also /* the copied symbol will not inherit the default_schematic attribute otherwise it will also
* be skipped */ * be skipped */
if(default_schematic) { if(default_schematic) {
my_strdup(_ALLOC_ID_, &xctx->sym[j].prop_ptr, my_strdup(_ALLOC_ID_, &xctx->sym[j].prop_ptr,
subst_token(xctx->sym[j].prop_ptr, "default_schematic", NULL)); /* delete attribute */ subst_token(xctx->sym[j].prop_ptr, "default_schematic", NULL)); /* delete attribute */
} }
/* if symbol has no corresponding schematic file use symbol base schematic */ /* if symbol has no corresponding schematic file use symbol base schematic */
@ -2189,11 +2189,11 @@ void get_additional_symbols(int what)
subst_token(xctx->sym[j].prop_ptr, "schematic", symbol_base_sch)); subst_token(xctx->sym[j].prop_ptr, "schematic", symbol_base_sch));
} }
if(spice_sym_def) { if(spice_sym_def) {
my_strdup(_ALLOC_ID_, &xctx->sym[j].prop_ptr, my_strdup(_ALLOC_ID_, &xctx->sym[j].prop_ptr,
subst_token(xctx->sym[j].prop_ptr, "spice_sym_def", spice_sym_def)); subst_token(xctx->sym[j].prop_ptr, "spice_sym_def", spice_sym_def));
} }
if(spectre_sym_def) { if(spectre_sym_def) {
my_strdup(_ALLOC_ID_, &xctx->sym[j].prop_ptr, my_strdup(_ALLOC_ID_, &xctx->sym[j].prop_ptr,
subst_token(xctx->sym[j].prop_ptr, "spectre_sym_def", spectre_sym_def)); subst_token(xctx->sym[j].prop_ptr, "spectre_sym_def", spectre_sym_def));
} }
if(verilog_sym_def) { if(verilog_sym_def) {
@ -2263,7 +2263,7 @@ void get_sch_from_sym(char *filename, xSymbol *sym, int inst, int fallback)
/* instance based symbol selection */ /* instance based symbol selection */
/* resolve schematic=generator.tcl( @n ) where n=11 is defined in instance attrs */ /* resolve schematic=generator.tcl( @n ) where n=11 is defined in instance attrs */
my_strdup2(_ALLOC_ID_, &str_tmp, get_tok_value(xctx->inst[inst].prop_ptr,"schematic", 6)); my_strdup2(_ALLOC_ID_, &str_tmp, get_tok_value(xctx->inst[inst].prop_ptr,"schematic", 6));
if(str_tmp[0]) if(str_tmp[0])
my_strdup2(_ALLOC_ID_, &str_tmp, translate3(str_tmp, 1, xctx->inst[inst].prop_ptr, NULL, NULL, NULL)); my_strdup2(_ALLOC_ID_, &str_tmp, translate3(str_tmp, 1, xctx->inst[inst].prop_ptr, NULL, NULL, NULL));
/* /*
* my_strdup(_ALLOC_ID_, &str_tmp, translate3(get_tok_value(xctx->inst[inst].prop_ptr,"schematic", 6), * my_strdup(_ALLOC_ID_, &str_tmp, translate3(get_tok_value(xctx->inst[inst].prop_ptr,"schematic", 6),
@ -2286,7 +2286,7 @@ void get_sch_from_sym(char *filename, xSymbol *sym, int inst, int fallback)
else my_strncpy(filename, abs_sym_path(sch, ""), PATH_MAX); else my_strncpy(filename, abs_sym_path(sch, ""), PATH_MAX);
} }
} }
if(has_x && fallback && !is_gen && filename[0]) { if(has_x && fallback && !is_gen && filename[0]) {
file_exists = !stat(filename, &buf); file_exists = !stat(filename, &buf);
if(!file_exists) { if(!file_exists) {
@ -2339,7 +2339,7 @@ void get_sch_from_sym(char *filename, xSymbol *sym, int inst, int fallback)
dbg(1, "get_sch_from_sym(): sym->name=%s, filename=%s\n", sym->name, filename); dbg(1, "get_sch_from_sym(): sym->name=%s, filename=%s\n", sym->name, filename);
} }
/* When descended into an i-th instance of a vector instance this function allows /* When descended into an i-th instance of a vector instance this function allows
* to change the path to the j-th instance. the instnumber parameters follows the same rules * to change the path to the j-th instance. the instnumber parameters follows the same rules
* as descend_schematic() */ * as descend_schematic() */
int change_sch_path(int instnumber, int dr) int change_sch_path(int instnumber, int dr)
@ -2389,7 +2389,7 @@ int change_sch_path(int instnumber, int dr)
* if set_title == 0 do not set window title (faster) * if set_title == 0 do not set window title (faster)
* == 1 do set_title * == 1 do set_title
* == 2 do not process instance pins/nets * == 2 do not process instance pins/nets
* == 4 do not descend into i-th instance of vecrtor instance. just * == 4 do not descend into i-th instance of vecrtor instance. just
* concatenate instance name as is to path and descend. * concatenate instance name as is to path and descend.
* above flags can be ORed together */ * above flags can be ORed together */
int descend_schematic(int instnumber, int fallback, int alert, int set_title) int descend_schematic(int instnumber, int fallback, int alert, int set_title)
@ -2416,7 +2416,7 @@ int descend_schematic(int instnumber, int fallback, int alert, int set_title)
{ {
char cmd[PATH_MAX+1000]; char cmd[PATH_MAX+1000];
char res[PATH_MAX]; char res[PATH_MAX];
my_strncpy(filename, xctx->sch[xctx->currsch], S(filename)); my_strncpy(filename, xctx->sch[xctx->currsch], S(filename));
my_snprintf(cmd, S(cmd), "save_file_dialog {Save file} * INITIALLOADDIR {%s}", filename); my_snprintf(cmd, S(cmd), "save_file_dialog {Save file} * INITIALLOADDIR {%s}", filename);
tcleval(cmd); tcleval(cmd);
@ -2439,12 +2439,12 @@ int descend_schematic(int instnumber, int fallback, int alert, int set_title)
) return 0; ) return 0;
if(xctx->modified) { if(xctx->modified) {
int ret; int ret;
ret = save(1, 0); ret = save(1, 0);
/* if circuit is changed but not saved before descending /* if circuit is changed but not saved before descending
* state will be inconsistent when returning, can not propagare hilights * state will be inconsistent when returning, can not propagare hilights
* save() return value: * save() return value:
* 1 : file saved * 1 : file saved
* -1 : user cancel * -1 : user cancel
* 0 : file not saved due to errors or per user request * 0 : file not saved due to errors or per user request
*/ */
@ -2453,7 +2453,7 @@ int descend_schematic(int instnumber, int fallback, int alert, int set_title)
} }
/* build up current hierarchy path */ /* build up current hierarchy path */
dbg(1, "descend_schematic(): selected instname=%s\n", xctx->inst[n].instname); dbg(1, "descend_schematic(): selected instname=%s\n", xctx->inst[n].instname);
if(xctx->inst[n].instname && xctx->inst[n].instname[0]) { if(xctx->inst[n].instname && xctx->inst[n].instname[0]) {
if(set_title & 4) { if(set_title & 4) {
my_strdup2(_ALLOC_ID_, &str, xctx->inst[n].instname); my_strdup2(_ALLOC_ID_, &str, xctx->inst[n].instname);
@ -2532,10 +2532,10 @@ int descend_schematic(int instnumber, int fallback, int alert, int set_title)
my_free(_ALLOC_ID_, &pin_node); my_free(_ALLOC_ID_, &pin_node);
} }
my_strdup(_ALLOC_ID_, &xctx->hier_attr[xctx->currsch].prop_ptr, my_strdup(_ALLOC_ID_, &xctx->hier_attr[xctx->currsch].prop_ptr,
xctx->inst[n].prop_ptr); xctx->inst[n].prop_ptr);
my_strdup(_ALLOC_ID_, &xctx->hier_attr[xctx->currsch].templ, xctx->sym[xctx->inst[n].ptr].templ); my_strdup(_ALLOC_ID_, &xctx->hier_attr[xctx->currsch].templ, xctx->sym[xctx->inst[n].ptr].templ);
my_strdup(_ALLOC_ID_, &xctx->hier_attr[xctx->currsch].sym_extra, my_strdup(_ALLOC_ID_, &xctx->hier_attr[xctx->currsch].sym_extra,
get_tok_value(xctx->sym[xctx->inst[n].ptr].prop_ptr, "extra", 0)); get_tok_value(xctx->sym[xctx->inst[n].ptr].prop_ptr, "extra", 0));
dbg(1,"descend_schematic(): inst_number=%d\n", inst_number); dbg(1,"descend_schematic(): inst_number=%d\n", inst_number);
@ -2546,7 +2546,7 @@ int descend_schematic(int instnumber, int fallback, int alert, int set_title)
xctx->sch_inst_number[xctx->currsch] = inst_number; xctx->sch_inst_number[xctx->currsch] = inst_number;
dbg(1, "descend_schematic(): current path: %s\n", xctx->sch_path[xctx->currsch+1]); dbg(1, "descend_schematic(): current path: %s\n", xctx->sch_path[xctx->currsch+1]);
dbg(1, "descend_schematic(): inst_number=%d\n", inst_number); dbg(1, "descend_schematic(): inst_number=%d\n", inst_number);
xctx->previous_instance[xctx->currsch]=n; xctx->previous_instance[xctx->currsch]=n;
xctx->zoom_array[xctx->currsch].x=xctx->xorigin; xctx->zoom_array[xctx->currsch].x=xctx->xorigin;
xctx->zoom_array[xctx->currsch].y=xctx->yorigin; xctx->zoom_array[xctx->currsch].y=xctx->yorigin;
@ -2564,7 +2564,7 @@ int descend_schematic(int instnumber, int fallback, int alert, int set_title)
propagate_hilights(1, 0, XINSERT_NOREPLACE); propagate_hilights(1, 0, XINSERT_NOREPLACE);
} }
dbg(1, "descend_schematic(): before zoom(): prep_hash_inst=%d\n", xctx->prep_hash_inst); dbg(1, "descend_schematic(): before zoom(): prep_hash_inst=%d\n", xctx->prep_hash_inst);
if(xctx->rects[GRIDLAYER] > 0 && tcleval("info exists ngspice::ngspice_data")[0] == '0') { if(xctx->rects[GRIDLAYER] > 0 && tcleval("info exists ngspice::ngspice_data")[0] == '0') {
Graph_ctx *gr = &xctx->graph_struct; Graph_ctx *gr = &xctx->graph_struct;
xRect *r = &xctx->rect[GRIDLAYER][0]; xRect *r = &xctx->rect[GRIDLAYER][0];
@ -2580,8 +2580,8 @@ int descend_schematic(int instnumber, int fallback, int alert, int set_title)
return descend_ok; return descend_ok;
} }
/* /*
* what: * what:
* 1: ask gui user confirm if schematic modified * 1: ask gui user confirm if schematic modified
* 2: do *NOT* reset window title * 2: do *NOT* reset window title
*/ */
@ -2609,7 +2609,7 @@ void go_back(int what)
else if(!strcmp(tclresult(), "") ) return; else if(!strcmp(tclresult(), "") ) return;
} }
/* do not automatically save if confirm==0. Script developers should take care of this */ /* do not automatically save if confirm==0. Script developers should take care of this */
/* /*
* else { * else {
* save_ok = save_schematic(xctx->sch[xctx->currsch], 0); * save_ok = save_schematic(xctx->sch[xctx->currsch], 0);
* } * }
@ -2649,7 +2649,7 @@ void go_back(int what)
xctx->modified=save_modified; /* to force ask save embedded sym in parent schematic */ xctx->modified=save_modified; /* to force ask save embedded sym in parent schematic */
if(xctx->hilight_nets) { if(xctx->hilight_nets) {
if(prev_sch_type != CAD_SYMBOL_ATTRS) hilight_parent_pins(); if(prev_sch_type != CAD_SYMBOL_ATTRS) hilight_parent_pins();
propagate_hilights(1, 1, XINSERT_NOREPLACE); propagate_hilights(1, 1, XINSERT_NOREPLACE);
} }
xctx->xorigin=xctx->zoom_array[xctx->currsch].x; xctx->xorigin=xctx->zoom_array[xctx->currsch].x;
@ -2788,7 +2788,7 @@ void calc_drawing_bbox(xRect *boundbox, int selected)
{ {
if(selected == 1 && !xctx->rect[c][i].sel) continue; if(selected == 1 && !xctx->rect[c][i].sel) continue;
/* skip graph objects if no datafile loaded */ /* skip graph objects if no datafile loaded */
if(c == GRIDLAYER && xctx->rect[c][i].flags) { if(c == GRIDLAYER && xctx->rect[c][i].flags) {
if(hide_graphs && !waves) continue; if(hide_graphs && !waves) continue;
} }
rect.x1=xctx->rect[c][i].x1; rect.x1=xctx->rect[c][i].x1;
@ -2809,7 +2809,7 @@ void calc_drawing_bbox(xRect *boundbox, int selected)
* str = get_tok_value(xctx->wire[i].prop_ptr, "lab",0); * str = get_tok_value(xctx->wire[i].prop_ptr, "lab",0);
* if(!str[0] || !bus_hilight_hash_lookup(str, 0,XLOOKUP)) continue; * if(!str[0] || !bus_hilight_hash_lookup(str, 0,XLOOKUP)) continue;
*/ */
if(!xctx->hilight_nets || !xctx->wire[i].node || if(!xctx->hilight_nets || !xctx->wire[i].node ||
!xctx->wire[i].node[0] || !bus_hilight_hash_lookup(xctx->wire[i].node, 0,XLOOKUP)) continue; !xctx->wire[i].node[0] || !bus_hilight_hash_lookup(xctx->wire[i].node, 0,XLOOKUP)) continue;
} }
if(xctx->wire[i].bus == -1.0){ if(xctx->wire[i].bus == -1.0){
@ -2830,8 +2830,8 @@ void calc_drawing_bbox(xRect *boundbox, int selected)
} }
if(has_x && selected != 2) { if(has_x && selected != 2) {
for(i=0;i<xctx->texts; ++i) for(i=0;i<xctx->texts; ++i)
{ {
int no_of_lines; int no_of_lines;
double longest_line; double longest_line;
if(selected == 1 && !xctx->text[i].sel) continue; if(selected == 1 && !xctx->text[i].sel) continue;
@ -3109,11 +3109,11 @@ void draw_stuff(void)
#ifdef STORE #ifdef STORE
xctx->rectcolor = (int) (16.0*rand()/(RAND_MAX+1.0))+4; xctx->rectcolor = (int) (16.0*rand()/(RAND_MAX+1.0))+4;
storeobject(-1, x1, y1, x2, y2, xRECT,xctx->rectcolor, 0, NULL); storeobject(-1, x1, y1, x2, y2, xRECT,xctx->rectcolor, 0, NULL);
#else #else
drawtemprect(xctx->gc[xctx->rectcolor], ADD, x1, y1, x2, y2); drawtemprect(xctx->gc[xctx->rectcolor], ADD, x1, y1, x2, y2);
#endif #endif
} }
for(i = 0; i < n; ++i) for(i = 0; i < n; ++i)
{ {
w=(xctx->areaw*xctx->zoom/80) * rand() / (RAND_MAX+1.0); w=(xctx->areaw*xctx->zoom/80) * rand() / (RAND_MAX+1.0);
@ -3126,11 +3126,11 @@ void draw_stuff(void)
#ifdef STORE #ifdef STORE
xctx->rectcolor = (int) (16.0*rand()/(RAND_MAX+1.0))+4; xctx->rectcolor = (int) (16.0*rand()/(RAND_MAX+1.0))+4;
storeobject(-1, x1, y1, x2, y2,xRECT,xctx->rectcolor, 0, NULL); storeobject(-1, x1, y1, x2, y2,xRECT,xctx->rectcolor, 0, NULL);
#else #else
drawtemprect(xctx->gc[xctx->rectcolor], ADD, x1, y1, x2, y2); drawtemprect(xctx->gc[xctx->rectcolor], ADD, x1, y1, x2, y2);
#endif #endif
} }
for(i = 0; i < n; ++i) for(i = 0; i < n; ++i)
{ {
w=xctx->zoom * rand() / (RAND_MAX+1.0); w=xctx->zoom * rand() / (RAND_MAX+1.0);
@ -3143,7 +3143,7 @@ void draw_stuff(void)
#ifdef STORE #ifdef STORE
xctx->rectcolor = (int) (16.0*rand()/(RAND_MAX+1.0))+4; xctx->rectcolor = (int) (16.0*rand()/(RAND_MAX+1.0))+4;
storeobject(-1, x1, y1, x2, y2,xRECT,xctx->rectcolor, 0, NULL); storeobject(-1, x1, y1, x2, y2,xRECT,xctx->rectcolor, 0, NULL);
#else #else
drawtemprect(xctx->gc[xctx->rectcolor], ADD, x1, y1, x2, y2); drawtemprect(xctx->gc[xctx->rectcolor], ADD, x1, y1, x2, y2);
#endif #endif
} }
@ -3188,7 +3188,7 @@ void new_wire(int what, double mx_snap, double my_snap)
drawline(WIRELAYER,NOW, nl_xx1,nl_yy1,nl_xx2,nl_yy1, 0.0, 0, NULL); drawline(WIRELAYER,NOW, nl_xx1,nl_yy1,nl_xx2,nl_yy1, 0.0, 0, NULL);
} }
if(xctx->nl_y2!=xctx->nl_y1) { if(xctx->nl_y2!=xctx->nl_y1) {
nl_xx1 = xctx->nl_x1; nl_yy1 = xctx->nl_y1; nl_xx1 = xctx->nl_x1; nl_yy1 = xctx->nl_y1;
nl_xx2 = xctx->nl_x2; nl_yy2 = xctx->nl_y2; nl_xx2 = xctx->nl_x2; nl_yy2 = xctx->nl_y2;
ORDER(nl_xx2,nl_yy1,nl_xx2,nl_yy2); ORDER(nl_xx2,nl_yy1,nl_xx2,nl_yy2);
storeobject(-1, nl_xx2,nl_yy1,nl_xx2,nl_yy2,WIRE,0,0,NULL); storeobject(-1, nl_xx2,nl_yy1,nl_xx2,nl_yy2,WIRE,0,0,NULL);
@ -3280,7 +3280,7 @@ void change_layer()
store_arc(-1, x1, y1, r, a, b, xctx->rectcolor, 0, xctx->arc[c][n].prop_ptr); store_arc(-1, x1, y1, r, a, b, xctx->rectcolor, 0, xctx->arc[c][n].prop_ptr);
} }
if(type==POLYGON && xctx->poly[c][n].sel==SELECTED) { if(type==POLYGON && xctx->poly[c][n].sel==SELECTED) {
store_poly(-1, xctx->poly[c][n].x, xctx->poly[c][n].y, store_poly(-1, xctx->poly[c][n].x, xctx->poly[c][n].y,
xctx->poly[c][n].points, xctx->rectcolor, 0, xctx->poly[c][n].prop_ptr); xctx->poly[c][n].points, xctx->rectcolor, 0, xctx->poly[c][n].prop_ptr);
} }
else if(type==xRECT && xctx->rect[c][n].sel==SELECTED) { else if(type==xRECT && xctx->rect[c][n].sel==SELECTED) {
@ -3294,7 +3294,7 @@ void change_layer()
else if(type==xTEXT && xctx->text[n].sel==SELECTED) { else if(type==xTEXT && xctx->text[n].sel==SELECTED) {
if(xctx->rectcolor != xctx->text[n].layer) { if(xctx->rectcolor != xctx->text[n].layer) {
char *p; char *p;
my_strdup2(_ALLOC_ID_, &xctx->text[n].prop_ptr, my_strdup2(_ALLOC_ID_, &xctx->text[n].prop_ptr,
subst_token(xctx->text[n].prop_ptr, "layer", dtoa(xctx->rectcolor) )); subst_token(xctx->text[n].prop_ptr, "layer", dtoa(xctx->rectcolor) ));
xctx->text[n].layer = xctx->rectcolor; xctx->text[n].layer = xctx->rectcolor;
p = xctx->text[n].prop_ptr; p = xctx->text[n].prop_ptr;
@ -3438,10 +3438,10 @@ void new_line(int what, double mx_snap, double my_snap)
drawtemp_manhattanline(xctx->gctiled, NOW, xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2, 0); drawtemp_manhattanline(xctx->gctiled, NOW, xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2, 0);
restore_selection(xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2); restore_selection(xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2);
xctx->nl_x2 = mx_snap; xctx->nl_y2 = my_snap; xctx->nl_x2 = mx_snap; xctx->nl_y2 = my_snap;
if(!(what & CLEAR)) { if(!(what & CLEAR)) {
drawtemp_manhattanline(xctx->gc[xctx->rectcolor], NOW, xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2, 0); drawtemp_manhattanline(xctx->gc[xctx->rectcolor], NOW, xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2, 0);
} }
} }
} }
void new_rect(int what, double mousex_snap, double mousey_snap) void new_rect(int what, double mousex_snap, double mousey_snap)
@ -3664,7 +3664,7 @@ int text_bbox(const char *str,double xscale, double yscale,
{ {
register int c=0, length =0; register int c=0, length =0;
double w, h; double w, h;
w=0;h=1; w=0;h=1;
*cairo_lines = 1; *cairo_lines = 1;
if(str!=NULL) while( str[c] ) if(str!=NULL) while( str[c] )
@ -3870,7 +3870,7 @@ void pan(int what, int mx, int my)
} }
} }
/* instead of doing a drawtemprect(xctx->gctiled, NOW, ....) do 4 /* instead of doing a drawtemprect(xctx->gctiled, NOW, ....) do 4
* XCopy Area operations */ * XCopy Area operations */
void fix_restore_rect(double x1, double y1, double x2, double y2) void fix_restore_rect(double x1, double y1, double x2, double y2)
{ {
@ -3907,7 +3907,7 @@ void select_rect(int stretch, int what, int select)
double nl_xx1, nl_yy1, nl_xx2, nl_yy2; double nl_xx1, nl_yy1, nl_xx2, nl_yy2;
int incremental_select = tclgetboolvar("incremental_select"); int incremental_select = tclgetboolvar("incremental_select");
int sel_touch = tclgetboolvar("select_touch"); int sel_touch = tclgetboolvar("select_touch");
dbg(1, "select_rect(): what=%d, mousex_save=%g mousey_save=%g, mousex=%g mousey=%g\n", dbg(1, "select_rect(): what=%d, mousex_save=%g mousey_save=%g, mousex=%g mousey=%g\n",
what, xctx->mx_double_save, xctx->my_double_save, xctx->mousex, xctx->mousey); what, xctx->mx_double_save, xctx->my_double_save, xctx->mousex, xctx->mousey);
if(what & RUBBER) if(what & RUBBER)
{ {
@ -3959,7 +3959,7 @@ void select_rect(int stretch, int what, int select)
if(!sel_touch || xctx->nl_dir == 0) if(!sel_touch || xctx->nl_dir == 0)
select_inside(stretch, xctx->nl_xr,xctx->nl_yr,xctx->nl_xr2,xctx->nl_yr2, xctx->nl_sel); select_inside(stretch, xctx->nl_xr,xctx->nl_yr,xctx->nl_xr2,xctx->nl_yr2, xctx->nl_sel);
else else
select_touch(xctx->nl_xr,xctx->nl_yr,xctx->nl_xr2,xctx->nl_yr2, xctx->nl_sel); select_touch(xctx->nl_xr,xctx->nl_yr,xctx->nl_xr2,xctx->nl_yr2, xctx->nl_sel);
draw_selection(xctx->gc[SELLAYER], 0); draw_selection(xctx->gc[SELLAYER], 0);

View File

@ -34,7 +34,7 @@ if {[lsearch -exact $toolbar_list MyButton] < 0} {
} }
## Create an image object. Name should be img<name of button> ## Create an image object. Name should be img<name of button>
image create photo imgMyButton image create photo imgMyButton
imgMyButton put $MyButtonData imgMyButton put $MyButtonData
} }

View File

@ -1,22 +1,22 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
# #
# File: break.awk # File: break.awk
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers # Copyright (C) 1998-2024 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -44,9 +44,9 @@ BEGIN{ quote=0 }
for(i=1;i<=l;i++) { for(i=1;i<=l;i++) {
pos++ pos++
c = substr($0,i,1) c = substr($0,i,1)
if(c ~/[{}']/) quote=!quote if(c ~/[{}']/) quote=!quote
if(!nobreak && pos> 130 && !quote && (c ~/[ \t]/)) { if(!nobreak && pos> 130 && !quote && (c ~/[ \t]/)) {
if(first=="*") if(first=="*")
c = "\n*+" c c = "\n*+" c
else else
c = "\n+" c c = "\n+" c
@ -54,7 +54,7 @@ BEGIN{ quote=0 }
} }
printf "%s",c printf "%s",c
} }
printf "\n" printf "\n"
} else { #20151203 } else { #20151203
split($0, a, /[^ \t]+/) split($0, a, /[^ \t]+/)
for(i=1;i<=NF;i++) { for(i=1;i<=NF;i++) {

File diff suppressed because it is too large Load Diff

View File

@ -1,22 +1,22 @@
#!/bin/sh #!/bin/sh
# #
# File: change_ref.awk # File: change_ref.awk
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers # Copyright (C) 1998-2024 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

View File

@ -26,7 +26,7 @@
#endif #endif
static int check_includes(double x1a, double y1a, double x2a, double y2a, static int check_includes(double x1a, double y1a, double x2a, double y2a,
double x1b, double y1b, double x2b, double y2b) double x1b, double y1b, double x2b, double y2b)
{ {
if( x1b >= x1a && x2b <= x2a && y1b >= y1a && y2b <= y2a && if( x1b >= x1a && x2b <= x2a && y1b >= y1a && y2b <= y2a &&
( (x2a-x1a)*(y2b-y1b) == (x2b-x1b)*(y2a-y1a) ) /* parallel */ ( (x2a-x1a)*(y2b-y1b) == (x2b-x1b)*(y2a-y1a) ) /* parallel */
) { ) {
@ -37,7 +37,7 @@ static int check_includes(double x1a, double y1a, double x2a, double y2a,
static int check_breaks(double x1, double y1, double x2, double y2, double x, double y) static int check_breaks(double x1, double y1, double x2, double y2, double x, double y)
{ {
if( ( (x > x1 && x < x2) || (y > y1 && y < y2) ) && if( ( (x > x1 && x < x2) || (y > y1 && y < y2) ) &&
( (x2-x1)*(y-y1) == (x-x1)*(y2-y1) ) /* parallel */ ( (x2-x1)*(y-y1) == (x-x1)*(y2-y1) ) /* parallel */
) { ) {
return 1; return 1;
@ -258,7 +258,7 @@ void trim_wires(void)
} }
j = wptr->n; j = wptr->n;
if(i == j || wireflag[j]) continue; if(i == j || wireflag[j]) continue;
includes = check_includes(xctx->wire[i].x1, xctx->wire[i].y1, xctx->wire[i].x2, xctx->wire[i].y2, includes = check_includes(xctx->wire[i].x1, xctx->wire[i].y1, xctx->wire[i].x2, xctx->wire[i].y2,
xctx->wire[j].x1, xctx->wire[j].y1, xctx->wire[j].x2, xctx->wire[j].y2); xctx->wire[j].x1, xctx->wire[j].y1, xctx->wire[j].x2, xctx->wire[j].y2);
if(includes) { if(includes) {
@ -272,7 +272,7 @@ void trim_wires(void)
} }
} }
/* dbg(1, "trim_wires(): included: %g\n", timer(1)); */ /* dbg(1, "trim_wires(): included: %g\n", timer(1)); */
/* delete wires */ /* delete wires */
j = 0; j = 0;
for(i=0;i<xctx->wires; ++i) for(i=0;i<xctx->wires; ++i)
@ -294,7 +294,7 @@ void trim_wires(void)
changed = 1; changed = 1;
} }
/* dbg(1, "trim_wires(): delete_1: %g\n", timer(1)); */ /* dbg(1, "trim_wires(): delete_1: %g\n", timer(1)); */
/* after wire deletions full rehash is needed */ /* after wire deletions full rehash is needed */
hash_wires(); hash_wires();
@ -335,12 +335,12 @@ void trim_wires(void)
if(k == 1) xctx->wire[i].end1 += 1; if(k == 1) xctx->wire[i].end1 += 1;
else xctx->wire[i].end2 += 1; else xctx->wire[i].end2 += 1;
} }
} }
} }
} }
} }
/* dbg(1, "trim_wires(): endpoints: %g\n", timer(1)); */ /* dbg(1, "trim_wires(): endpoints: %g\n", timer(1)); */
/* merge parallel touching (in wire[i].x2, wire[i].y2) wires */ /* merge parallel touching (in wire[i].x2, wire[i].y2) wires */
for(i=0;i<xctx->wires; ++i) { for(i=0;i<xctx->wires; ++i) {
if(wireflag[i]) continue; if(wireflag[i]) continue;
@ -353,7 +353,7 @@ void trim_wires(void)
if( touch(xctx->wire[j].x1, xctx->wire[j].y1, xctx->wire[j].x2, xctx->wire[j].y2, x0,y0) && if( touch(xctx->wire[j].x1, xctx->wire[j].y1, xctx->wire[j].x2, xctx->wire[j].y2, x0,y0) &&
/* parallel */ /* parallel */
(xctx->wire[i].x2 - xctx->wire[i].x1) * (xctx->wire[j].y2 - xctx->wire[j].y1) == (xctx->wire[i].x2 - xctx->wire[i].x1) * (xctx->wire[j].y2 - xctx->wire[j].y1) ==
(xctx->wire[j].x2 - xctx->wire[j].x1) * (xctx->wire[i].y2 - xctx->wire[i].y1) && (xctx->wire[j].x2 - xctx->wire[j].x1) * (xctx->wire[i].y2 - xctx->wire[i].y1) &&
/* touch in wire[j].x1, wire[j].y1 */ /* touch in wire[j].x1, wire[j].y1 */
xctx->wire[j].x1 == x0 && xctx->wire[j].y1 == y0 && xctx->wire[j].x1 == x0 && xctx->wire[j].y1 == y0 &&
/* no other connecting wires */ /* no other connecting wires */
@ -368,7 +368,7 @@ void trim_wires(void)
} }
} }
/* dbg(1, "trim_wires(): merge: %g\n", timer(1)); */ /* dbg(1, "trim_wires(): merge: %g\n", timer(1)); */
/* delete wires */ /* delete wires */
j = 0; j = 0;
for(i=0;i<xctx->wires; ++i) for(i=0;i<xctx->wires; ++i)
@ -426,7 +426,7 @@ static int touches_inst_pin(double x, double y, int inst)
/* return 2 if x0, y0 is on the segment /* return 2 if x0, y0 is on the segment
* return 1 if x0, y0 is less than cadsnap (10) from the segment * return 1 if x0, y0 is less than cadsnap (10) from the segment
* return 0 if nothing will be cut (mouse too far away or degenerated segment) * return 0 if nothing will be cut (mouse too far away or degenerated segment)
* In this case x0, y0 are reset to the closest point on the segment */ * In this case x0, y0 are reset to the closest point on the segment */
static int closest_point_calculation(double x1, double y1, double x2, double y2, static int closest_point_calculation(double x1, double y1, double x2, double y2,
double *x0, double *y0, int align) double *x0, double *y0, int align)
@ -500,7 +500,7 @@ void break_wires_at_point(double x0, double y0, int align)
xctx->wire[xctx->wires].bus = xctx->wire[i].bus; xctx->wire[xctx->wires].bus = xctx->wire[i].bus;
xctx->wire[xctx->wires].node=NULL; xctx->wire[xctx->wires].node=NULL;
hash_wire(XINSERT, xctx->wires, 0); /* insertion happens at beginning of list */ hash_wire(XINSERT, xctx->wires, 0); /* insertion happens at beginning of list */
dbg(1, "break_wires_at_pins(): hashing new wire %d: %g %g %g %g\n", dbg(1, "break_wires_at_pins(): hashing new wire %d: %g %g %g %g\n",
xctx->wires, xctx->wire[xctx->wires].x1, xctx->wire[xctx->wires].y1, xctx->wires, xctx->wire[xctx->wires].x1, xctx->wire[xctx->wires].y1,
xctx->wire[xctx->wires].x2, xctx->wire[xctx->wires].y2); xctx->wire[xctx->wires].x2, xctx->wire[xctx->wires].y2);
my_strdup(_ALLOC_ID_, &xctx->wire[xctx->wires].node, xctx->wire[i].node); my_strdup(_ALLOC_ID_, &xctx->wire[xctx->wires].node, xctx->wire[i].node);
@ -558,9 +558,9 @@ void break_wires_at_pins(int remove)
i, xctx->wire[i].x1, xctx->wire[i].y1, xctx->wire[i].x2, xctx->wire[i].y2); i, xctx->wire[i].x1, xctx->wire[i].y1, xctx->wire[i].x2, xctx->wire[i].y2);
if(!changed) { xctx->push_undo(); changed=1;} if(!changed) { xctx->push_undo(); changed=1;}
check_wire_storage(); check_wire_storage();
if(!remove || !RECT_INSIDE(xctx->wire[i].x1, xctx->wire[i].y1, x0, y0, if(!remove || !RECT_INSIDE(xctx->wire[i].x1, xctx->wire[i].y1, x0, y0,
xctx->inst[k].xx1, xctx->inst[k].yy1, xctx->inst[k].xx2, xctx->inst[k].yy2) xctx->inst[k].xx1, xctx->inst[k].yy1, xctx->inst[k].xx2, xctx->inst[k].yy2)
|| (!touches_inst_pin(xctx->wire[i].x1, xctx->wire[i].y1, k) && xctx->wire[i].end1 > 0) || (!touches_inst_pin(xctx->wire[i].x1, xctx->wire[i].y1, k) && xctx->wire[i].end1 > 0)
) { ) {
xctx->wire[xctx->wires].x1=xctx->wire[i].x1; xctx->wire[xctx->wires].x1=xctx->wire[i].x1;
xctx->wire[xctx->wires].y1=xctx->wire[i].y1; xctx->wire[xctx->wires].y1=xctx->wire[i].y1;
@ -574,7 +574,7 @@ void break_wires_at_pins(int remove)
xctx->wire[xctx->wires].bus = xctx->wire[i].bus; xctx->wire[xctx->wires].bus = xctx->wire[i].bus;
xctx->wire[xctx->wires].node=NULL; xctx->wire[xctx->wires].node=NULL;
hash_wire(XINSERT, xctx->wires, 0); /* insertion happens at beginning of list */ hash_wire(XINSERT, xctx->wires, 0); /* insertion happens at beginning of list */
dbg(1, "break_wires_at_pins(): hashing new wire %d: %g %g %g %g\n", dbg(1, "break_wires_at_pins(): hashing new wire %d: %g %g %g %g\n",
xctx->wires, xctx->wire[xctx->wires].x1, xctx->wire[xctx->wires].y1, xctx->wires, xctx->wire[xctx->wires].x1, xctx->wire[xctx->wires].y1,
xctx->wire[xctx->wires].x2, xctx->wire[xctx->wires].y2); xctx->wire[xctx->wires].x2, xctx->wire[xctx->wires].y2);
my_strdup(_ALLOC_ID_, &xctx->wire[xctx->wires].node, xctx->wire[i].node); my_strdup(_ALLOC_ID_, &xctx->wire[xctx->wires].node, xctx->wire[i].node);
@ -590,7 +590,7 @@ void break_wires_at_pins(int remove)
xctx->inst[k].xx1, xctx->inst[k].yy1, xctx->inst[k].xx2, xctx->inst[k].yy2)) { xctx->inst[k].xx1, xctx->inst[k].yy1, xctx->inst[k].xx2, xctx->inst[k].yy2)) {
if(touches_inst_pin(xctx->wire[i].x2, xctx->wire[i].y2, k) || xctx->wire[i].end2 == 0) { if(touches_inst_pin(xctx->wire[i].x2, xctx->wire[i].y2, k) || xctx->wire[i].end2 == 0) {
dbg(1, "break_wires_at_pins(): wire %d needs to be deleted: %g %g %g %g\n", dbg(1, "break_wires_at_pins(): wire %d needs to be deleted: %g %g %g %g\n",
i, xctx->wire[i].x1, xctx->wire[i].y1, xctx->wire[i].x2, xctx->wire[i].y2); i, xctx->wire[i].x1, xctx->wire[i].y1, xctx->wire[i].x2, xctx->wire[i].y2);
/* mark for deletion only if no other nets attached */ /* mark for deletion only if no other nets attached */
xctx->wire[i].sel = SELECTED4; /* use a special flag to later delete these wires xctx->wire[i].sel = SELECTED4; /* use a special flag to later delete these wires
@ -608,7 +608,7 @@ void break_wires_at_pins(int remove)
xctx->inst[k].xx1, xctx->inst[k].yy1, xctx->inst[k].xx2, xctx->inst[k].yy2); xctx->inst[k].xx1, xctx->inst[k].yy1, xctx->inst[k].xx2, xctx->inst[k].yy2);
dbg(1, "i=%d, t1=%d, t2=%d, e1=%d, e2=%d\n", i, t1, t2, e1, e2); dbg(1, "i=%d, t1=%d, t2=%d, e1=%d, e2=%d\n", i, t1, t2, e1, e2);
if(inside && ( (t1 && t2) || (t1 && e2 == 0) || (t2 && e1 == 0) )) { if(inside && ( (t1 && t2) || (t1 && e2 == 0) || (t2 && e1 == 0) )) {
xctx->wire[i].sel = SELECTED4; xctx->wire[i].sel = SELECTED4;
if(!changed) { xctx->push_undo(); changed=1;} if(!changed) { xctx->push_undo(); changed=1;}
} }
} }

View File

@ -136,7 +136,7 @@ void clip_xy_to_short(double x, double y, short *sx, short *sy)
*sy = (short) (y * r); *sy = (short) (y * r);
} }
/* /*
*static short clip_to_short(double n) *static short clip_to_short(double n)
*{ *{
* return n > SHRT_MAX ? SHRT_MAX : n < SHRT_MIN ? SHRT_MIN : n; * return n > SHRT_MAX ? SHRT_MAX : n < SHRT_MIN ? SHRT_MIN : n;

View File

@ -1,22 +1,22 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
# #
# File: convert_to_verilog2001.awk # File: convert_to_verilog2001.awk
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers # Copyright (C) 1998-2024 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -42,7 +42,7 @@ module==1 && $0 == ");" {
port_decl==1 && $1 ~ /^(output|input|inout)$/{ port_decl==1 && $1 ~ /^(output|input|inout)$/{
dir=$1 #20161118 dir=$1 #20161118
getline getline
sub(/;[ \t]*$/,"") sub(/;[ \t]*$/,"")
$1 = dir " " $1 $1 = dir " " $1
if(comma) ports = ports ",\n" if(comma) ports = ports ",\n"
@ -50,7 +50,7 @@ port_decl==1 && $1 ~ /^(output|input|inout)$/{
comma=1 comma=1
next next
} }
port_decl==1 && $0 ~ /^parameter/{ port_decl==1 && $0 ~ /^parameter/{
sub(/[ \t]*;[ \t]*$/, "") sub(/[ \t]*;[ \t]*$/, "")
if(parameter!="") parameter = parameter ",\n" if(parameter!="") parameter = parameter ",\n"
@ -61,7 +61,7 @@ port_decl==1 && $0 ~/^[ \t]*$/{
port_decl=0 port_decl=0
if(parameter) print "#(\n" parameter "\n)" if(parameter) print "#(\n" parameter "\n)"
print "(\n" ports "\n);" print "(\n" ports "\n);"
next next
} }
@ -69,6 +69,6 @@ module==1 || port_decl==1{
next next
} }
{ {
print print
} }

View File

@ -1,22 +1,22 @@
#!/usr/bin/gawk -f #!/usr/bin/gawk -f
# #
# File: create_alloc_ids.awk # File: create_alloc_ids.awk
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers # Copyright (C) 1998-2024 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

View File

@ -1,22 +1,22 @@
#!/usr/bin/gawk -f #!/usr/bin/gawk -f
# #
# File: create_alloc_ids_windows.awk # File: create_alloc_ids_windows.awk
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers # Copyright (C) 1998-2024 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

View File

@ -1,21 +1,21 @@
# #
# File: create_graph.tcl # File: create_graph.tcl
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers # Copyright (C) 1998-2024 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -31,7 +31,7 @@ proc create_graph {title rawfile node {analysis tran} {color {4 5 6 7 8 9 10 11
# clear loaded raw file if any # clear loaded raw file if any
xschem raw_clear xschem raw_clear
# set current layer to graph layer (grey, layer 2) # set current layer to graph layer (grey, layer 2)
xschem set rectcolor 2 xschem set rectcolor 2
# create a 300x400 rectangle # create a 300x400 rectangle
xschem rect 0 -300 400 0 xschem rect 0 -300 400 0
# make it a graph # make it a graph

File diff suppressed because it is too large Load Diff

View File

@ -85,7 +85,7 @@ int my_strncasecmp(const char *s1, const char *s2, size_t n)
* else return 0.0 * else return 0.0
*/ */
double get_attr_val(const char *str) double get_attr_val(const char *str)
{ {
double s = 0.0; double s = 0.0;
char *endptr; char *endptr;
@ -102,7 +102,7 @@ double get_attr_val(const char *str)
} }
return s; return s;
} }
@ -167,7 +167,7 @@ char *my_fgets(FILE *fd, size_t *line_len)
} }
/* split a string into tokens like standard strtok_r, /* split a string into tokens like standard strtok_r,
* if keep_quote == 0: * if keep_quote == 0:
* if quote string is not empty any character matching quote is considered a quoting * if quote string is not empty any character matching quote is considered a quoting
* character, removed from input and all characters before next quote are considered * character, removed from input and all characters before next quote are considered
* as part of the token. backslash can be used to enter literal quoting characters and * as part of the token. backslash can be used to enter literal quoting characters and
@ -185,13 +185,13 @@ char *my_fgets(FILE *fd, size_t *line_len)
* "bbb" * "bbb"
* ccc ddd * ccc ddd
* eee * eee
* *
* my_strtok_r("aaa \\\"bbb\\\" \"ccc ddd\" eee", " ", "\"", 1); * my_strtok_r("aaa \\\"bbb\\\" \"ccc ddd\" eee", " ", "\"", 1);
* aaa * aaa
* \"bbb\" * \"bbb\"
* "ccc ddd" * "ccc ddd"
* eee * eee
* *
* my_strtok_r("aaa \\\"bbb\\\" \"ccc ddd\" eee", " ", "\"", 4); * my_strtok_r("aaa \\\"bbb\\\" \"ccc ddd\" eee", " ", "\"", 4);
* aaa * aaa
* \"bbb\" * \"bbb\"
@ -237,7 +237,7 @@ size_t my_strdup(int id, char **dest, const char *src) /* empty source string --
{ {
size_t len; size_t len;
if(*dest == src && src!=NULL) if(*dest == src && src!=NULL)
dbg(0, "my_strdup(): WARNING: src == *dest == %p, id=%d\n", src, id); dbg(0, "my_strdup(): WARNING: src == *dest == %p, id=%d\n", src, id);
if(src!=NULL && src[0]!='\0') { if(src!=NULL && src[0]!='\0') {
len = strlen(src)+1; len = strlen(src)+1;
@ -471,7 +471,7 @@ size_t my_snprintf(char *string, size_t size, const char *format, ...)
size_t my_strdup2(int id, char **dest, const char *src) /* 20150409 duplicates also empty string */ size_t my_strdup2(int id, char **dest, const char *src) /* 20150409 duplicates also empty string */
{ {
size_t len; size_t len;
if(*dest == src && src!=NULL) if(*dest == src && src!=NULL)
dbg(0, "my_strdup2(): WARNING: src == *dest == %p, id=%d\n", src, id); dbg(0, "my_strdup2(): WARNING: src == *dest == %p, id=%d\n", src, id);
if(src!=NULL) { if(src!=NULL) {
len = strlen(src)+1; len = strlen(src)+1;
@ -699,12 +699,12 @@ size_t my_strcat(int id, char **str, const char *append_str)
/* same as my_strcat, but appending "" to NULL returns "" instead of NULL */ /* same as my_strcat, but appending "" to NULL returns "" instead of NULL */
size_t my_strcat2(int id, char **str, const char *append_str) size_t my_strcat2(int id, char **str, const char *append_str)
{ {
size_t s, a; size_t s, a;
dbg(3,"my_strcat(%d,): str=%s append_str=%s\n", id, dbg(3,"my_strcat(%d,): str=%s append_str=%s\n", id,
*str? *str : "<NULL>", append_str ? append_str : "<NULL>"); *str? *str : "<NULL>", append_str ? append_str : "<NULL>");
if( *str != NULL) if( *str != NULL)
{ {
s = strlen(*str); s = strlen(*str);
if(append_str == NULL || append_str[0]=='\0') return s; if(append_str == NULL || append_str[0]=='\0') return s;
a = strlen(append_str) + 1; a = strlen(append_str) + 1;
@ -924,7 +924,7 @@ float my_atof(const char *p)
double my_atod(const char *p) double my_atod(const char *p)
{ {
static const double p10[]={ static const double p10[]={
1e-1, 1e-2, 1e-3, 1e-4, 1e-5, 1e-6, 1e-7, 1e-8, 1e-9, 1e-1, 1e-2, 1e-3, 1e-4, 1e-5, 1e-6, 1e-7, 1e-8, 1e-9,
1e-10, 1e-11, 1e-12, 1e-13, 1e-14, 1e-15, 1e-16, 1e-17, 1e-18 1e-10, 1e-11, 1e-12, 1e-13, 1e-14, 1e-15, 1e-16, 1e-17, 1e-18
}; };
int frac; int frac;
@ -1413,7 +1413,7 @@ static int edit_text_property(int x)
if(x < 0 || x > 2) { if(x < 0 || x > 2) {
fprintf(errfp, "edit_text_property() : unknown parameter x=%d\n",x); fprintf(errfp, "edit_text_property() : unknown parameter x=%d\n",x);
return 0; return 0;
} }
dbg(1, "edit_text_property(): entering\n"); dbg(1, "edit_text_property(): entering\n");
sel = xctx->sel_array[0].n; sel = xctx->sel_array[0].n;
my_strdup(_ALLOC_ID_, &oldprop, xctx->text[sel].prop_ptr); my_strdup(_ALLOC_ID_, &oldprop, xctx->text[sel].prop_ptr);
@ -1556,7 +1556,7 @@ int drc_check(int i)
if(res) { if(res) {
const char *result; const char *result;
const char *replace_res; const char *replace_res;
replace_res = str_replace(res, "@symname", xctx->sym[xctx->inst[j].ptr].name, '\\', -1); replace_res = str_replace(res, "@symname", xctx->sym[xctx->inst[j].ptr].name, '\\', -1);
result = tcleval(replace_res); result = tcleval(replace_res);
if(result && result[0]) { if(result && result[0]) {
@ -1572,7 +1572,7 @@ int drc_check(int i)
if(has_x) { if(has_x) {
/* tclvareval("alert_ {", check_result, "} {}", NULL); */ /* tclvareval("alert_ {", check_result, "} {}", NULL); */
statusmsg(check_result, 3); statusmsg(check_result, 3);
tcleval("show_infotext 1"); tcleval("show_infotext 1");
} else { } else {
dbg(0, "%s\n", check_result); dbg(0, "%s\n", check_result);
} }
@ -1677,7 +1677,7 @@ static int update_symbol(const char *result, int x, int selected_inst)
my_strdup2(_ALLOC_ID_, &translated_sym, translate(*ii, symbol)); my_strdup2(_ALLOC_ID_, &translated_sym, translate(*ii, symbol));
dbg(1, "update_symbol: %s -- %s\n", translated_sym, old_translated_sym); dbg(1, "update_symbol: %s -- %s\n", translated_sym, old_translated_sym);
if(changed_symbol || if(changed_symbol ||
( !strcmp(symbol, xctx->inst[*ii].name) && strcmp(translated_sym, old_translated_sym) ) ) { ( !strcmp(symbol, xctx->inst[*ii].name) && strcmp(translated_sym, old_translated_sym) ) ) {
sym_number=match_symbol(translated_sym); /* check if exist */ sym_number=match_symbol(translated_sym); /* check if exist */
if(sym_number>=0) { if(sym_number>=0) {
prefix=(get_tok_value(xctx->sym[sym_number].templ, "name",0))[0]; /* get new symbol prefix */ prefix=(get_tok_value(xctx->sym[sym_number].templ, "name",0))[0]; /* get new symbol prefix */
@ -1765,7 +1765,7 @@ static int edit_symbol_property(int x, int first_sel)
*ii=xctx->sel_array[first_sel].n; *ii=xctx->sel_array[first_sel].n;
*netl_com = 0; *netl_com = 0;
if ((xctx->inst[*ii].ptr + xctx->sym)->type!=NULL) if ((xctx->inst[*ii].ptr + xctx->sym)->type!=NULL)
*netl_com = *netl_com =
!strcmp( (xctx->inst[*ii].ptr+ xctx->sym)->type, "netlist_commands"); !strcmp( (xctx->inst[*ii].ptr+ xctx->sym)->type, "netlist_commands");
if(xctx->inst[*ii].prop_ptr!=NULL) { if(xctx->inst[*ii].prop_ptr!=NULL) {
if(*netl_com && x==1) { if(*netl_com && x==1) {
@ -1821,7 +1821,7 @@ void change_elem_order(int n)
xctx->semaphore--; xctx->semaphore--;
if(strcmp(tclgetvar("tctx::retval"),"") ) if(strcmp(tclgetvar("tctx::retval"),"") )
{ {
int c = 0; int c = 0;
xctx->push_undo(); xctx->push_undo();
modified = 1; modified = 1;
xctx->prep_hash_inst=0; xctx->prep_hash_inst=0;
@ -1885,7 +1885,7 @@ void change_elem_order(int n)
if(modified) set_modify(1); if(modified) set_modify(1);
} }
} }
/* replace substring 'rep' in 'str' with 'with', if 'rep' not preceeded by an 'escape' char /* replace substring 'rep' in 'str' with 'with', if 'rep' not preceeded by an 'escape' char
* 'count' indicates the number of replacements to do or all if -1 * 'count' indicates the number of replacements to do or all if -1
*/ */
char *str_replace(const char *str, const char *rep, const char *with, int escape, int count) char *str_replace(const char *str, const char *rep, const char *with, int escape, int count)
@ -1914,7 +1914,7 @@ char *str_replace(const char *str, const char *rep, const char *with, int escape
while(*s) { while(*s) {
STR_ALLOC(&result, result_pos + with_len + 1, &size); STR_ALLOC(&result, result_pos + with_len + 1, &size);
cond = (count == -1 || replacements < count) && cond = (count == -1 || replacements < count) &&
((s == str) || ((*(s - 1) != escape))) && ((s == str) || ((*(s - 1) != escape))) &&
(!strncmp(s, rep, rep_len)); (!strncmp(s, rep, rep_len));
if(cond) { if(cond) {
@ -2019,7 +2019,7 @@ void edit_property(int x)
if(x == 1 && strcmp(tclgetvar("tctx::rcode"),"") ) if(x == 1 && strcmp(tclgetvar("tctx::rcode"),"") )
{ {
if(xctx->netlist_type==CAD_SYMBOL_ATTRS && if(xctx->netlist_type==CAD_SYMBOL_ATTRS &&
(!xctx->schsymbolprop || strcmp(xctx->schsymbolprop, tclgetvar("tctx::retval") ) ) ) { (!xctx->schsymbolprop || strcmp(xctx->schsymbolprop, tclgetvar("tctx::retval") ) ) ) {
xctx->push_undo(); xctx->push_undo();
modified = 1; modified = 1;
@ -2037,7 +2037,7 @@ void edit_property(int x)
xctx->push_undo(); xctx->push_undo();
my_strdup(_ALLOC_ID_, &xctx->schspectreprop, (char *) tclgetvar("tctx::retval")); my_strdup(_ALLOC_ID_, &xctx->schspectreprop, (char *) tclgetvar("tctx::retval"));
} else if(xctx->netlist_type==CAD_SPICE_NETLIST && } else if(xctx->netlist_type==CAD_SPICE_NETLIST &&
(!xctx->schprop || strcmp(xctx->schprop, tclgetvar("tctx::retval") ) ) ) { (!xctx->schprop || strcmp(xctx->schprop, tclgetvar("tctx::retval") ) ) ) {
modified = 1; modified = 1;
xctx->push_undo(); xctx->push_undo();

View File

@ -89,14 +89,14 @@ symrec *tptr; /* For returning symbol-table pointers */
/* Grammar follows */ /* Grammar follows */
%% %%
input: input:
| input line | input line
; ;
line: line:
XCHAR {get_char($1);} XCHAR {get_char($1);}
| EXPR exp ')' {get_expr($2);lex_state = 0;} | EXPR exp ')' {get_expr($2);lex_state = 0;}
| EXPR '\'' exp '\'' ')' {get_expr($3);lex_state = 0;} | EXPR '\'' exp '\'' ')' {get_expr($3);lex_state = 0;}
| EXPR exp error | EXPR exp error
; ;
exp: NUM {$$ = $1;} exp: NUM {$$ = $1;}
@ -223,7 +223,7 @@ void eval_expr_clear_table(void)
my_free(_ALLOC_ID_, &tmp); my_free(_ALLOC_ID_, &tmp);
} }
} }
static int kklex() static int kklex()
{ {
@ -231,7 +231,7 @@ static int kklex()
if(!str) { return 0; } if(!str) { return 0; }
if(strstr(str, "expr(") == str) { if(strstr(str, "expr(") == str) {
lex_state = 1; lex_state = 1;
str += 5; str += 5;
dbg(dbglev, "lex(): EXPR\n"); dbg(dbglev, "lex(): EXPR\n");
engineering = 0; engineering = 0;
@ -268,7 +268,7 @@ static int kklex()
{ {
char s[100] =""; char s[100] ="";
int rd = 0; int rd = 0;
str--; str--;
sscanf(str, "%99[.0-9a-zA-Z_-]%n", s, &rd); sscanf(str, "%99[.0-9a-zA-Z_-]%n", s, &rd);
kklval.val = atof_eng(s); kklval.val = atof_eng(s);

View File

@ -1,8 +1,8 @@
#!/bin/sh #!/bin/sh
awk ' awk '
BEGIN{ BEGIN{
number="[-+]?([0-9]+|[0-9]*\\.[0-9]+)([eE][+-]?[0-9]+)?" number="[-+]?([0-9]+|[0-9]*\\.[0-9]+)([eE][+-]?[0-9]+)?"
operator ="[+-*/]" operator ="[+-*/]"
begin="^(" begin="^("

View File

@ -1,7 +1,7 @@
/* File: expandlabel.y /* File: expandlabel.y
* *
* This file is part of XSCHEM, * This file is part of XSCHEM,
* a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit * a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
* simulation. * simulation.
* Copyright (C) 1998-2023 Stefan Frederik Schippers * Copyright (C) 1998-2023 Stefan Frederik Schippers
* *
@ -39,13 +39,13 @@ typedef struct /* used in expandlabel.y */
} Stringptr; } Stringptr;
#endif #endif
#define YYERROR_VERBOSE #define YYERROR_VERBOSE
#define INITIALIDXSIZE 8 #define INITIALIDXSIZE 8
extern Stringptr dest_string; /* 20140108 */ extern Stringptr dest_string; /* 20140108 */
static int idxsize=INITIALIDXSIZE; static int idxsize=INITIALIDXSIZE;
extern int yylex(); extern int yylex();
/* /*
extern FILE *errfp; extern FILE *errfp;
extern void *my_malloc(int id, size_t size); extern void *my_malloc(int id, size_t size);
extern void my_free(int id, void *ptr); extern void my_free(int id, void *ptr);
@ -169,33 +169,33 @@ static char *expandlabel_strmult(int n, char *s)
memcpy(pos, s, len); /* 20180923 */ memcpy(pos, s, len); /* 20180923 */
pos[len]=','; pos[len]=',';
pos+=len+1; pos+=len+1;
} }
*(pos-1)='\0'; *(pos-1)='\0';
return str; return str;
} }
static char *expandlabel_strbus_suffix(char *s, int *n, char *suffix) static char *expandlabel_strbus_suffix(char *s, int *n, char *suffix)
{ {
int i,l; int i,l;
int tmplen; int tmplen;
char *res=NULL; char *res=NULL;
char *tmp=NULL; char *tmp=NULL;
my_realloc(_ALLOC_ID_, &res, n[0] * (strlen(s) + strlen(suffix) + 30)); my_realloc(_ALLOC_ID_, &res, n[0] * (strlen(s) + strlen(suffix) + 30));
my_realloc(_ALLOC_ID_, &tmp, strlen(s) + strlen(suffix) + 30); my_realloc(_ALLOC_ID_, &tmp, strlen(s) + strlen(suffix) + 30);
l=0; l=0;
for(i=1;i<n[0];i++) for(i=1;i<n[0];i++)
{ {
tmplen = sprintf(tmp, "%s[%d]%s,", s, n[i], suffix); tmplen = sprintf(tmp, "%s[%d]%s,", s, n[i], suffix);
/* strcpy(res+l,tmp); */ /* strcpy(res+l,tmp); */
memcpy(res+l,tmp, tmplen+1); /* 20180923 */ memcpy(res+l,tmp, tmplen+1); /* 20180923 */
l+=tmplen; l+=tmplen;
} }
my_free(_ALLOC_ID_, &tmp); my_free(_ALLOC_ID_, &tmp);
sprintf(res+l, "%s[%d]%s", s, n[i], suffix); sprintf(res+l, "%s[%d]%s", s, n[i], suffix);
return res; return res;
} }
static char *expandlabel_strbus(char *s, int *n) static char *expandlabel_strbus(char *s, int *n)
{ {
int i,l; int i,l;
@ -219,7 +219,7 @@ static char *expandlabel_strbus(char *s, int *n)
static void check_idx(int **ptr,int n) static void check_idx(int **ptr,int n)
{ {
if(n>=idxsize) if(n>=idxsize)
{ {
idxsize*=2; idxsize*=2;
dbg(3, "check_idx(): reallocating idx array: size=%d\n",idxsize); dbg(3, "check_idx(): reallocating idx array: size=%d\n",idxsize);
@ -249,25 +249,25 @@ static char *expandlabel_strbus_nobracket(char *s, int *n)
} }
static char *expandlabel_strbus_nobracket_suffix(char *s, int *n, char *suffix) static char *expandlabel_strbus_nobracket_suffix(char *s, int *n, char *suffix)
{ {
int i,l; int i,l;
int tmplen; int tmplen;
char *res=NULL; char *res=NULL;
char *tmp=NULL; char *tmp=NULL;
my_realloc(_ALLOC_ID_, &res, n[0] * (strlen(s) + strlen(suffix) + 30)); my_realloc(_ALLOC_ID_, &res, n[0] * (strlen(s) + strlen(suffix) + 30));
my_realloc(_ALLOC_ID_, &tmp, strlen(s) + strlen(suffix) + 30); my_realloc(_ALLOC_ID_, &tmp, strlen(s) + strlen(suffix) + 30);
l=0; l=0;
for(i=1;i<n[0];i++) for(i=1;i<n[0];i++)
{ {
tmplen = sprintf(tmp, "%s%d%s,", s, n[i], suffix); tmplen = sprintf(tmp, "%s%d%s,", s, n[i], suffix);
/* strcpy(res+l,tmp); */ /* strcpy(res+l,tmp); */
memcpy(res+l,tmp, tmplen+1); memcpy(res+l,tmp, tmplen+1);
l+=tmplen; l+=tmplen;
} }
my_free(_ALLOC_ID_, &tmp); my_free(_ALLOC_ID_, &tmp);
sprintf(res+l, "%s%d%s", s, n[i], suffix); sprintf(res+l, "%s%d%s", s, n[i], suffix);
return res; return res;
} }
%} %}
@ -308,12 +308,12 @@ int *idx; /* for bus index & bus index ranges */
line: /* empty */ line: /* empty */
| list { | list {
dbg(dbg_var, "yyparse(): list, dest_string.str=%s\n", $1.str); dbg(dbg_var, "yyparse(): list, dest_string.str=%s\n", $1.str);
my_strdup(_ALLOC_ID_, &(dest_string.str),$1.str); my_strdup(_ALLOC_ID_, &(dest_string.str),$1.str);
my_free(_ALLOC_ID_, &$1.str); my_free(_ALLOC_ID_, &$1.str);
dest_string.m=$1.m; dest_string.m=$1.m;
} }
; ;
list: B_NAME { list: B_NAME {
dbg(dbg_var, "yyparse(): B_NAME, $1=%s\n", $1); dbg(dbg_var, "yyparse(): B_NAME, $1=%s\n", $1);
$$.str = expandlabel_strdup($1); $$.str = expandlabel_strdup($1);
my_free(_ALLOC_ID_, &$1); my_free(_ALLOC_ID_, &$1);
@ -325,7 +325,7 @@ list: B_NAME {
my_free(_ALLOC_ID_, &$1); my_free(_ALLOC_ID_, &$1);
$$.m = 1; $$.m = 1;
} }
| list B_NAME { | list B_NAME {
dbg(dbg_var, "yyparse(): list B_NAME, $2=%s\n", $2); dbg(dbg_var, "yyparse(): list B_NAME, $2=%s\n", $2);
$$.str = expandlabel_strcat($1.str, $2); $$.str = expandlabel_strcat($1.str, $2);
my_free(_ALLOC_ID_, &$1.str); my_free(_ALLOC_ID_, &$1.str);
@ -348,7 +348,7 @@ list: B_NAME {
$$.m = $1 * $3.m; $$.m = $1 * $3.m;
my_free(_ALLOC_ID_, &$3.str); my_free(_ALLOC_ID_, &$3.str);
} }
| list ',' list { | list ',' list {
dbg(dbg_var, "yyparse(): list , list\n"); dbg(dbg_var, "yyparse(): list , list\n");
$$.str=expandlabel_strcat_char($1.str, ',', $3.str); $$.str=expandlabel_strcat_char($1.str, ',', $3.str);
$$.m = $1.m + $3.m; $$.m = $1.m + $3.m;
@ -367,7 +367,7 @@ list: B_NAME {
dbg(dbg_var, "yyparse(): ( list )\n"); dbg(dbg_var, "yyparse(): ( list )\n");
$$=$2; $$=$2;
} }
| B_NAME '[' B_NAME ']' | B_NAME '[' B_NAME ']'
{ {
size_t size = strlen($1) + strlen($3) + 3; size_t size = strlen($1) + strlen($3) + 3;
dbg(dbg_var, "yyparse(): B_NAME [ B_NAME ] , $1=%s $3=%s\n", $1, $3); dbg(dbg_var, "yyparse(): B_NAME [ B_NAME ] , $1=%s $3=%s\n", $1, $3);
@ -377,13 +377,13 @@ list: B_NAME {
my_free(_ALLOC_ID_, &$1); my_free(_ALLOC_ID_, &$1);
my_free(_ALLOC_ID_, &$3); my_free(_ALLOC_ID_, &$3);
} }
| B_NAME '[' index ']' | B_NAME '[' index ']'
{ {
dbg(dbg_var, "yyparse(): B_NAME [ index ] , $1=%s $3=%d\n", $1, $3[0]); dbg(dbg_var, "yyparse(): B_NAME [ index ] , $1=%s $3=%d\n", $1, $3[0]);
$$.str=expandlabel_strbus($1,$3); $$.str=expandlabel_strbus($1,$3);
my_free(_ALLOC_ID_, &$1); my_free(_ALLOC_ID_, &$1);
$$.m=$3[0]; $$.m=$3[0];
my_free(_ALLOC_ID_, &$3); my_free(_ALLOC_ID_, &$3);
idxsize=INITIALIDXSIZE; idxsize=INITIALIDXSIZE;
} }
| B_NAME '[' index ']' B_TRAILER | B_NAME '[' index ']' B_TRAILER
@ -397,13 +397,13 @@ list: B_NAME {
idxsize=INITIALIDXSIZE; idxsize=INITIALIDXSIZE;
} }
| B_NAME '[' index_nobracket ']' | B_NAME '[' index_nobracket ']'
{ {
dbg(dbg_var, "yyparse(): B_NAME [ index_nobracket ] $1=%s $3=%d\n",$1, $3[0]); dbg(dbg_var, "yyparse(): B_NAME [ index_nobracket ] $1=%s $3=%d\n",$1, $3[0]);
$$.str=expandlabel_strbus_nobracket($1,$3); $$.str=expandlabel_strbus_nobracket($1,$3);
my_free(_ALLOC_ID_, &$1); my_free(_ALLOC_ID_, &$1);
$$.m=$3[0]; $$.m=$3[0];
my_free(_ALLOC_ID_, &$3); my_free(_ALLOC_ID_, &$3);
idxsize=INITIALIDXSIZE; idxsize=INITIALIDXSIZE;
} }
| B_NAME '[' index_nobracket ']' B_TRAILER | B_NAME '[' index_nobracket ']' B_TRAILER
@ -464,7 +464,7 @@ index: B_IDXNUM ':' B_IDXNUM ':' B_IDXNUM ':' B_IDXNUM
if(i==$3) break; if(i==$3) break;
} }
} }
| B_IDXNUM { | B_IDXNUM {
$$=my_malloc(_ALLOC_ID_, INITIALIDXSIZE*sizeof(int)); $$=my_malloc(_ALLOC_ID_, INITIALIDXSIZE*sizeof(int));
$$[0]=0; $$[0]=0;
check_idx(&$$, ++$$[0]); check_idx(&$$, ++$$[0]);
@ -487,7 +487,7 @@ index: B_IDXNUM ':' B_IDXNUM ':' B_IDXNUM ':' B_IDXNUM
} }
| index ',' B_IDXNUM ':' B_IDXNUM ':' B_IDXNUM | index ',' B_IDXNUM ':' B_IDXNUM ':' B_IDXNUM
{ {
int i; int i;
int sign; int sign;
sign = XSIGN($5-$3); sign = XSIGN($5-$3);
@ -497,7 +497,7 @@ index: B_IDXNUM ':' B_IDXNUM ':' B_IDXNUM ':' B_IDXNUM
$$[$$[0]]=i; $$[$$[0]]=i;
if(sign==1 && i + $7 > $5) break; if(sign==1 && i + $7 > $5) break;
if(sign==-1 && i - $7 < $5) break; if(sign==-1 && i - $7 < $5) break;
} }
} }
| index ',' B_IDXNUM ':' B_IDXNUM | index ',' B_IDXNUM ':' B_IDXNUM
{ {
@ -578,9 +578,9 @@ index_nobracket: B_IDXNUM B_DOUBLEDOT B_IDXNUM B_DOUBLEDOT B_IDXNUM B_DOUBLEDOT
} }
| index_nobracket ',' B_IDXNUM B_DOUBLEDOT B_IDXNUM B_DOUBLEDOT B_IDXNUM | index_nobracket ',' B_IDXNUM B_DOUBLEDOT B_IDXNUM B_DOUBLEDOT B_IDXNUM
{ {
int i; int i;
int sign; int sign;
sign = XSIGN($5-$3); sign = XSIGN($5-$3);
for(i=$3;;i+=sign*$7) for(i=$3;;i+=sign*$7)
{ {

View File

@ -34,7 +34,7 @@ static void find_closest_wire(double mx, double my, int override_lock)
double threshold; double threshold;
double d = distance; double d = distance;
threshold = CADWIREMINDIST * CADWIREMINDIST * xctx->zoom * xctx->zoom * tk_scaling * tk_scaling; threshold = CADWIREMINDIST * CADWIREMINDIST * xctx->zoom * xctx->zoom * tk_scaling * tk_scaling;
dbg(1, "threshold=%g\n", threshold); dbg(1, "threshold=%g\n", threshold);
for(i=0;i<xctx->wires; ++i) for(i=0;i<xctx->wires; ++i)
{ {
@ -46,7 +46,7 @@ static void find_closest_wire(double mx, double my, int override_lock)
if( w != -1 && d <= threshold && if( w != -1 && d <= threshold &&
(override_lock || strboolcmp(get_tok_value(xctx->wire[w].prop_ptr, "lock", 0), "true")) ) (override_lock || strboolcmp(get_tok_value(xctx->wire[w].prop_ptr, "lock", 0), "true")) )
{ {
sel.n = w; sel.type = WIRE; sel.n = w; sel.type = WIRE;
distance = d; distance = d;
} }
} }
@ -137,7 +137,7 @@ static void find_closest_polygon(double mx, double my, int override_lock)
xPoly *p = &xctx->poly[c][i]; xPoly *p = &xctx->poly[c][i];
bezier = !strboolcmp(get_tok_value(p->prop_ptr, "bezier", 0), "true"); bezier = !strboolcmp(get_tok_value(p->prop_ptr, "bezier", 0), "true");
bezier = bezier && (p->points > 2); bezier = bezier && (p->points > 2);
if(bezier) { if(bezier) {
d = find_closest_bezier(mx, my, d, c, i, &l, &col); d = find_closest_bezier(mx, my, d, c, i, &l, &col);
} else { } else {
@ -210,7 +210,7 @@ int find_closest_net_or_symbol_pin(double mx, double my, double *x, double *y)
x1 = X_TO_XSCHEM(xctx->areax1); x1 = X_TO_XSCHEM(xctx->areax1);
y1 = Y_TO_XSCHEM(xctx->areay1); y1 = Y_TO_XSCHEM(xctx->areay1);
x2 = X_TO_XSCHEM(xctx->areax2); x2 = X_TO_XSCHEM(xctx->areax2);
y2 = Y_TO_XSCHEM(xctx->areay2); y2 = Y_TO_XSCHEM(xctx->areay2);
hash_instances(); hash_instances();
@ -409,7 +409,7 @@ static void find_closest_box(double mx ,double my, int override_lock)
for(i=0;i<xctx->rects[c]; ++i) for(i=0;i<xctx->rects[c]; ++i)
{ {
if( POINTINSIDE(mx, my, xctx->rect[c][i].x1 - threshold, xctx->rect[c][i].y1 - threshold, if( POINTINSIDE(mx, my, xctx->rect[c][i].x1 - threshold, xctx->rect[c][i].y1 - threshold,
xctx->rect[c][i].x2 + threshold, xctx->rect[c][i].y2 + threshold) && xctx->rect[c][i].x2 + threshold, xctx->rect[c][i].y2 + threshold) &&
!POINTINSIDE(mx, my, xctx->rect[c][i].x1 + threshold, xctx->rect[c][i].y1 + threshold, !POINTINSIDE(mx, my, xctx->rect[c][i].x1 + threshold, xctx->rect[c][i].y1 + threshold,
xctx->rect[c][i].x2 - threshold, xctx->rect[c][i].y2 - threshold)) xctx->rect[c][i].x2 - threshold, xctx->rect[c][i].y2 - threshold))
{ {

View File

@ -1,22 +1,22 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
# #
# File: flatten.awk # File: flatten.awk
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers # Copyright (C) 1998-2024 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -66,7 +66,7 @@ BEGIN{
sub(/^\*\*/,"",$0) sub(/^\*\*/,"",$0)
} }
if($0 ~ /^\**\.ENDS/ && first_subckt) { if($0 ~ /^\**\.ENDS/ && first_subckt) {
first_subckt = 0 first_subckt = 0
sub(/^\*\*/,"",$0) sub(/^\*\*/,"",$0)
} }
if($0 ~/^\+/) # join folded lines if($0 ~/^\+/) # join folded lines
@ -76,7 +76,7 @@ BEGIN{
gsub(/[\t ]*=[\t ]*/, "=") gsub(/[\t ]*=[\t ]*/, "=")
a[lines++]=$0 a[lines++]=$0
} }
END{ END{
@ -86,14 +86,14 @@ END{
devpattern = devpattern j devpattern = devpattern j
} }
devpattern = devpattern "]" devpattern = devpattern "]"
for(j=0;j<lines;j++) for(j=0;j<lines;j++)
{ {
$0=a[j] $0=a[j]
if($1 ~ /\.GLOBAL/) # get global nodes if($1 ~ /\.GLOBAL/) # get global nodes
for(i=2;i<=NF;i++) global[$i]=i; for(i=2;i<=NF;i++) global[$i]=i;
if($1 ~ /^\.SUBCKT/) # parse subckts if($1 ~ /^\.SUBCKT/) # parse subckts
{ # subckt["name","first"]= first line { # subckt["name","first"]= first line
subname=$2 # subckt["name","last"]= last line subname=$2 # subckt["name","last"]= last line
subckt[subname,"first"]=j # subckt["name", "ports"] = # of ports subckt[subname,"first"]=j # subckt["name", "ports"] = # of ports
for(k=3;k<=NF;k++) # subckt["name", "port","node"]= for(k=3;k<=NF;k++) # subckt["name", "port","node"]=
@ -102,14 +102,14 @@ END{
if($k ~ /=/) break if($k ~ /=/) break
subckt[subname,"port",$k]=k-2 subckt[subname,"port",$k]=k-2
} }
subckt[subname,"ports"]=k-3 subckt[subname,"ports"]=k-3
for(;k<=NF;k++) # subckt["name", "param", "parname"]= for(;k<=NF;k++) # subckt["name", "param", "parname"]=
if($k ~ /=/) # default value if($k ~ /=/) # default value
{ {
split($k,tmp,"=") split($k,tmp,"=")
subckt[subname,"param",tmp[1]]=tmp[2] subckt[subname,"param",tmp[1]]=tmp[2]
} }
} }
if($1 ~ /^\.ENDS/) { if($1 ~ /^\.ENDS/) {
subckt[subname,"last"]=j subckt[subname,"last"]=j
} }
@ -117,13 +117,13 @@ END{
print "** " topcell " flat netlist" print "** " topcell " flat netlist"
expand(topcell,"","","") expand(topcell,"","","")
print ".end" print ".end"
# parameters: # parameters:
# - subckt name to expand # - subckt name to expand
# - current path (will be prefixed to inst & node names) # - current path (will be prefixed to inst & node names)
# - string of params: par1=val1 par2=val2 par3=val3 ... # - string of params: par1=val1 par2=val2 par3=val3 ...
# - port list to connect the subckt to. # - port list to connect the subckt to.
} }
# recursive routine!!! private variables must be declared local !! # recursive routine!!! private variables must be declared local !!
@ -138,7 +138,7 @@ function expand(name, path, param,ports, # func. params
pathname=pathsep path ; pathnode=path pathsep pathname=pathsep path ; pathnode=path pathsep
} }
split(param,paramarray) split(param,paramarray)
for(k in paramarray) for(k in paramarray)
{ {
split(paramarray[k],parameter,"=") split(paramarray[k],parameter,"=")
paramarray2[parameter[1]]=parameter[2] paramarray2[parameter[1]]=parameter[2]
@ -156,17 +156,17 @@ function expand(name, path, param,ports, # func. params
paramlist = ""; portlist = ""; subname="" paramlist = ""; portlist = ""; subname=""
for(k=num;k>=2;k--) for(k=num;k>=2;k--)
{ {
if(line[k] ~ /=/) if(line[k] ~ /=/)
{ {
split(line[k],parameter,"=") split(line[k],parameter,"=")
if(parameter[2] in paramarray2) if(parameter[2] in paramarray2)
paramlist= parameter[1] "=" paramarray2[parameter[2]] " " paramlist paramlist= parameter[1] "=" paramarray2[parameter[2]] " " paramlist
else paramlist= line[k] " " paramlist else paramlist= line[k] " " paramlist
} }
else if(subname=="") {subname=line[k]; subname_pos=k } else if(subname=="") {subname=line[k]; subname_pos=k }
else if( (subname,ports) in subckt && k<=subckt[subname,"ports"]+1) else if( (subname,ports) in subckt && k<=subckt[subname,"ports"]+1)
portlist = getnode(name,pathnode,portarray,line[k]) " " portlist portlist = getnode(name,pathnode,portarray,line[k]) " " portlist
else if(k<subname_pos){ else if(k<subname_pos){
# 30032003 undefined subcircuit # 30032003 undefined subcircuit
portlist = getnode(name,pathnode,portarray,line[k]) " " portlist portlist = getnode(name,pathnode,portarray,line[k]) " " portlist
} }
@ -180,7 +180,7 @@ function expand(name, path, param,ports, # func. params
printf "%s %s %s %s\n",line[1] pathname , portlist, subname, paramlist printf "%s %s %s %s\n",line[1] pathname , portlist, subname, paramlist
} }
print "*--------END___" pathnode line[1] "->" subname print "*--------END___" pathnode line[1] "->" subname
} }
else else
{ {
@ -210,7 +210,7 @@ function expand(name, path, param,ports, # func. params
} }
else { # if parameter get actual value else { # if parameter get actual value
if(line[k] in paramarray2) line[k] = paramarray2[line[k]] if(line[k] in paramarray2) line[k] = paramarray2[line[k]]
else { # try to see if parameter inside quotes or braces else { # try to see if parameter inside quotes or braces
m = line[k] m = line[k]
gsub(/[{}']/, "", m) gsub(/[{}']/, "", m)
if(m in paramarray2) line[k] = paramarray2[m] if(m in paramarray2) line[k] = paramarray2[m]
@ -218,7 +218,7 @@ function expand(name, path, param,ports, # func. params
printf "%s ", line[k] printf "%s ", line[k]
} }
} }
} }
else if(line[1] ~/^\.(SAVE|PRINT|PROBE)/) { else if(line[1] ~/^\.(SAVE|PRINT|PROBE)/) {
printf "%s ", general_sub(a[j],name,pathnode,portarray) printf "%s ", general_sub(a[j],name,pathnode,portarray)
} }
@ -235,7 +235,7 @@ function subst_param(s, pa, p, i, ss)
{ {
for(p in pa) { for(p in pa) {
while(1) { while(1) {
i = match(s, "[^a-zA-Z0-9_]" p "[^=a-zA-Z0-9_]") i = match(s, "[^a-zA-Z0-9_]" p "[^=a-zA-Z0-9_]")
ss = "" ss = ""
if(i) { if(i) {
ss = ss substr(s, 1, RSTART) ss = ss substr(s, 1, RSTART)
@ -255,7 +255,7 @@ function subst_param(s, pa, p, i, ss)
function getnode(name, path, portarray, node) function getnode(name, path, portarray, node)
# return the full path-name of <node> in subckt <name> # return the full path-name of <node> in subckt <name>
# in path <path>, called with ports <portarray> # in path <path>, called with ports <portarray>
{ {
sub(/ *$/, "", node) sub(/ *$/, "", node)
@ -263,7 +263,7 @@ function getnode(name, path, portarray, node)
if(name!=topcell) # if we are in top cell, nothing to do if(name!=topcell) # if we are in top cell, nothing to do
{ {
if(name SUBSEP "port" SUBSEP node in subckt) if(name SUBSEP "port" SUBSEP node in subckt)
return portarray[subckt[name,"port",node]] # <node> is a port, return portarray[subckt[name,"port",node]] # <node> is a port,
#return port mapping #return port mapping
if(!(node in global)) return path node # local node if(!(node in global)) return path node # local node
} }

View File

@ -1,22 +1,22 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
# #
# File: flatten.awk # File: flatten.awk
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers # Copyright (C) 1998-2024 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -65,7 +65,7 @@ BEGIN{
sub(/^\*\*/,"",$0) sub(/^\*\*/,"",$0)
} }
if(toupper($0) ~ /^\**\.ENDS/ && first_subckt) { if(toupper($0) ~ /^\**\.ENDS/ && first_subckt) {
first_subckt = 0 first_subckt = 0
sub(/^\*\*/,"",$0) sub(/^\*\*/,"",$0)
} }
if($0 ~/^\+/) # join folded lines if($0 ~/^\+/) # join folded lines
@ -73,16 +73,16 @@ BEGIN{
a[lines-1]=a[lines-1] " " substr($0,2); next a[lines-1]=a[lines-1] " " substr($0,2); next
} }
a[lines++]=$0 a[lines++]=$0
} }
END{ END{
for(j=0;j<lines;j++) for(j=0;j<lines;j++)
{ {
$0=a[j] $0=a[j]
if(toupper($1) ~ /\.GLOBAL/) # get global nodes if(toupper($1) ~ /\.GLOBAL/) # get global nodes
for(i=2;i<=NF;i++) global[$i]=i; for(i=2;i<=NF;i++) global[$i]=i;
if(toupper($1) ~ /^\.SUBCKT/) # parse subckts if(toupper($1) ~ /^\.SUBCKT/) # parse subckts
{ # subckt["name","first"]= first line { # subckt["name","first"]= first line
subname=$2 # subckt["name","last"]= last line subname=$2 # subckt["name","last"]= last line
subckt[subname,"first"]=j # subckt["name", "ports"] = # of ports subckt[subname,"first"]=j # subckt["name", "ports"] = # of ports
for(k=3;k<=NF;k++) # subckt["name", "port","node"]= for(k=3;k<=NF;k++) # subckt["name", "port","node"]=
@ -91,21 +91,21 @@ END{
if($k ~ /=/) break if($k ~ /=/) break
subckt[subname,"port",$k]=k-2 subckt[subname,"port",$k]=k-2
} }
subckt[subname,"ports"]=k-3 subckt[subname,"ports"]=k-3
} }
if(toupper($1) ~ /^\.ENDS/) { if(toupper($1) ~ /^\.ENDS/) {
subckt[subname,"last"]=j subckt[subname,"last"]=j
} }
} }
print "** flattened .save nodes" print "** flattened .save nodes"
expand(topcell,"","") expand(topcell,"","")
# parameters: # parameters:
# - subckt name to expand # - subckt name to expand
# - current path (will be prefixed to inst & node names) # - current path (will be prefixed to inst & node names)
# - port list to connect the subckt to. # - port list to connect the subckt to.
if(do_end !="") print do_end if(do_end !="") print do_end
} }
# recursive routine!!! private variables must be declared local !! # recursive routine!!! private variables must be declared local !!
function expand(name, path,ports, # func. params function expand(name, path,ports, # func. params
@ -125,9 +125,9 @@ function expand(name, path,ports, # func. params
for(k=num;k>=2;k--) { for(k=num;k>=2;k--) {
if(line[k] !~ /=/) { if(line[k] !~ /=/) {
if(subname=="") {subname=line[k]; subname_pos=k } if(subname=="") {subname=line[k]; subname_pos=k }
else if( (subname,ports) in subckt && k<subckt[subname,"ports"]+0) else if( (subname,ports) in subckt && k<subckt[subname,"ports"]+0)
portlist = getnode(name,pathnode,portarray,line[k]) " " portlist portlist = getnode(name,pathnode,portarray,line[k]) " " portlist
else if(k<subname_pos){ else if(k<subname_pos){
# undefined subcircuit # undefined subcircuit
portlist = getnode(name,pathnode,portarray,line[k]) " " portlist portlist = getnode(name,pathnode,portarray,line[k]) " " portlist
} }
@ -136,13 +136,13 @@ function expand(name, path,ports, # func. params
# print "*--------BEGIN_" pathnode line[1]_"->" subname # print "*--------BEGIN_" pathnode line[1]_"->" subname
if( (subname,"first") in subckt) # 30032003 do not expand subcircuit call if undefined subckt if( (subname,"first") in subckt) # 30032003 do not expand subcircuit call if undefined subckt
expand(subname,pathnode line[1],portlist) expand(subname,pathnode line[1],portlist)
# print "*--------END___" pathnode line[1] "->" subname # print "*--------END___" pathnode line[1] "->" subname
} }
else { else {
if(toupper(line[1]) ~ /^\.(SAVE|PRINT)$/ && toupper(line[2]) !~/^ALL$/) { if(toupper(line[1]) ~ /^\.(SAVE|PRINT)$/ && toupper(line[2]) !~/^ALL$/) {
printf line[1] " " printf line[1] " "
for(k = 2; k <= num; k++) { for(k = 2; k <= num; k++) {
if(k > 2) printf " " if(k > 2) printf " "
if(line[k] ~ /^[iI]\($/ && line[k+2]==")" && do_save == 1) { if(line[k] ~ /^[iI]\($/ && line[k+2]==")" && do_save == 1) {
if(name != topcell) if(name != topcell)
if(xyce==1) if(xyce==1)
@ -169,7 +169,7 @@ function expand(name, path,ports, # func. params
} }
function getnode(name, path, portarray, node) function getnode(name, path, portarray, node)
# return the full path-name of <node> in subckt <name> # return the full path-name of <node> in subckt <name>
# in path <path>, called with ports <portarray> # in path <path>, called with ports <portarray>
{ {
if(name!=topcell) { # if we are in top cell, nothing to do if(name!=topcell) { # if we are in top cell, nothing to do

View File

@ -1,22 +1,22 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
# #
# File: flatten_tedax.awk # File: flatten_tedax.awk
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers # Copyright (C) 1998-2024 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -71,7 +71,7 @@ function expand(cell, instname, path, maplist, i, j, subpos, subcell, subi
for(i = start[cell]+1; i <= end[cell]-1; i++) { for(i = start[cell]+1; i <= end[cell]-1; i++) {
$0 = netlist[i] $0 = netlist[i]
reparse() reparse()
# __subcircuit__ pcb_voltage_protection x0 # __subcircuit__ pcb_voltage_protection x0
# __map__ VOUT -> VOUTXX # __map__ VOUT -> VOUTXX
# __map__ ... -> ... # __map__ ... -> ...
if($1 == "__subcircuit__") { if($1 == "__subcircuit__") {
@ -80,7 +80,7 @@ function expand(cell, instname, path, maplist, i, j, subpos, subcell, subi
subpos = i subpos = i
sub(/__subcircuit__/, "subcircuit", $0) sub(/__subcircuit__/, "subcircuit", $0)
out("#" spaces(hier * 2 - 1) $0) out("#" spaces(hier * 2 - 1) $0)
submaplist = "" submaplist = ""
for(i++; ;i++) { for(i++; ;i++) {
$0 = netlist[i] $0 = netlist[i]
reparse() reparse()
@ -91,9 +91,9 @@ function expand(cell, instname, path, maplist, i, j, subpos, subcell, subi
sub(/__map__/, "map", $0) sub(/__map__/, "map", $0)
out("#" spaces(hier * 2 - 1) $0) out("#" spaces(hier * 2 - 1) $0)
} }
expand(subcell, subinst, path subinst hiersep, submaplist) expand(subcell, subinst, path subinst hiersep, submaplist)
i--; continue; # redo processing of current line i--; continue; # redo processing of current line
} }
if($1 == "conn") { if($1 == "conn") {
@ -112,7 +112,7 @@ function expand(cell, instname, path, maplist, i, j, subpos, subcell, subi
function spaces(n, s) function spaces(n, s)
{ {
n = (n > 0) ? n - 1 : 0 n = (n > 0) ? n - 1 : 0
s =" " s =" "
while(length(s) < n) s = s s while(length(s) < n) s = s s
return substr(s,1,n) return substr(s,1,n)
@ -120,7 +120,7 @@ function spaces(n, s)
function out(s) function out(s)
{ {
if(length(s) > 512) if(length(s) > 512)
print "flatten_tedax: WARNING: >> " s "\n line length > 512 chars, this breaks tEDAx" > "/dev/stderr" print "flatten_tedax: WARNING: >> " s "\n line length > 512 chars, this breaks tEDAx" > "/dev/stderr"
print s print s
} }
@ -130,7 +130,7 @@ function dbg(s)
if(debug) print s > "/dev/stderr" if(debug) print s > "/dev/stderr"
} }
function resolve_node(node, path, maplist, arr, n, retnode, i) function resolve_node(node, path, maplist, arr, n, retnode, i)
{ {
dbg("resolve_node: node=" node " maplist=" maplist) dbg("resolve_node: node=" node " maplist=" maplist)
gsub(/\\ /, SUBSEP "s", maplist) gsub(/\\ /, SUBSEP "s", maplist)

View File

@ -53,7 +53,7 @@ xinit.c \
| awk '{ | awk '{
if(n>0 && $1 <= prev) print ">>>>>>>>>>> ERROR >>>>>>>>> " $0 if(n>0 && $1 <= prev) print ">>>>>>>>>>> ERROR >>>>>>>>> " $0
else if(n>0 && $1 != prev+1) { else if(n>0 && $1 != prev+1) {
if($1-1 > prev+1) if($1-1 > prev+1)
print ">>>>>>>>>>> FREE >>>>>>>>> " prev+1 ":" $1-1 print ">>>>>>>>>>> FREE >>>>>>>>> " prev+1 ":" $1-1
else else
print ">>>>>>>>>>> FREE >>>>>>>>> " $1-1 print ">>>>>>>>>>> FREE >>>>>>>>> " $1-1

View File

@ -1,22 +1,22 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
# #
# File: gschemtoxschem.awk # File: gschemtoxschem.awk
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers # Copyright (C) 1998-2024 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -33,7 +33,7 @@ BEGIN{
debug=0 # set to 1 to print debug info to stderr debug=0 # set to 1 to print debug info to stderr
} }
#### on first line #### on first line
FNR==1{ FNR==1{
if(FILENAME ~/\.sym$/) is_symbol = 1 if(FILENAME ~/\.sym$/) is_symbol = 1
sch = FILENAME sch = FILENAME
@ -63,7 +63,7 @@ FNR==1{
y2 = $5 / 10 y2 = $5 / 10
lines = lines "L 4 " order(x1, y1, x2, y2) " {}\n" lines = lines "L 4 " order(x1, y1, x2, y2) " {}\n"
} }
#### Text objects #### Text objects
# T x y color size visibility show angle alignment num_lines # T x y color size visibility show angle alignment num_lines
# 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10
@ -122,14 +122,14 @@ FNR==1{
# if($0 ~ /^(device|description|footprint|source|numslots)=/) { # if($0 ~ /^(device|description|footprint|source|numslots)=/) {
# attributes = $0 # attributes = $0
# sub(/=.*/, "", attributes) # sub(/=.*/, "", attributes)
# if(extra !="") extra = extra " " # if(extra !="") extra = extra " "
# if(extra_pinnumber !="") extra_pinnumber = extra_pinnumber " " # if(extra_pinnumber !="") extra_pinnumber = extra_pinnumber " "
# extra = extra attributes # extra = extra attributes
# extra_pinnumber = extra_pinnumber "-" # extra_pinnumber = extra_pinnumber "-"
# } # }
save = $0 save = $0
sub(/^device=/, "type=") sub(/^device=/, "type=")
if ($0 ~/^value=IO/) { # inconsistency in io-1.sym if ($0 ~/^value=IO/) { # inconsistency in io-1.sym
$0 = "type=IO" $0 = "type=IO"
} }
@ -138,7 +138,7 @@ FNR==1{
if($0 ~/=OUTPUT/) {pin = 1; sub(/=.*/, "=opin"); template_attrs = template_attrs "lab=xxx "} if($0 ~/=OUTPUT/) {pin = 1; sub(/=.*/, "=opin"); template_attrs = template_attrs "lab=xxx "}
if($0 ~/=IO/) {pin = 1; sub(/=.*/, "=iopin"); template_attrs = template_attrs "lab=xxx "} if($0 ~/=IO/) {pin = 1; sub(/=.*/, "=iopin"); template_attrs = template_attrs "lab=xxx "}
if(is_symbol && has_schematic) global_attrs = "type=subcircuit\n" global_attrs if(is_symbol && has_schematic) global_attrs = "type=subcircuit\n" global_attrs
else global_attrs = $0 "\n" global_attrs else global_attrs = $0 "\n" global_attrs
} }
$0 = save $0 = save
if(show == 1) { if(show == 1) {
@ -156,8 +156,8 @@ FNR==1{
if(visibility) { if(visibility) {
texts = texts "T {" text "} " xt " " (-yt) " " int(angle/90) " " flip " " size " " size " {" text_align "}\n" texts = texts "T {" text "} " xt " " (-yt) " " int(angle/90) " " flip " " size " " size " {" text_align "}\n"
} }
} }
#### box objects #### box objects
else if($0 ~ /^B/){ else if($0 ~ /^B/){
x1 = $2 / 10 x1 = $2 / 10
@ -169,24 +169,24 @@ FNR==1{
boxes = boxes "L 4 " x1 " " (-y2) " " x2 " " (-y2) " {}\n" boxes = boxes "L 4 " x1 " " (-y2) " " x2 " " (-y2) " {}\n"
boxes = boxes "L 4 " x1 " " (-y2) " " x1 " " (-y1) " {}\n" boxes = boxes "L 4 " x1 " " (-y2) " " x1 " " (-y1) " {}\n"
} }
#### circle objects #### circle objects
else if($0 ~ /^V/){ #circle else if($0 ~ /^V/){ #circle
circles = circles "A 4 " ($2/10) " " (-$3/10) " " ($4/10) " " 0 " " 360 " {}\n" circles = circles "A 4 " ($2/10) " " (-$3/10) " " ($4/10) " " 0 " " 360 " {}\n"
} }
#### arc objects #### arc objects
# A 1000 1000 100 90 180 3 0 0 0 -1 -1 # A 1000 1000 100 90 180 3 0 0 0 -1 -1
else if($0 ~ /^A/){ #arc else if($0 ~ /^A/){ #arc
arcs = arcs "A 4 " ($2/10) " " (-$3/10) " " ($4/10) " " ($5) " " ($6) " {}\n" arcs = arcs "A 4 " ($2/10) " " (-$3/10) " " ($4/10) " " ($5) " " ($6) " {}\n"
} }
#### path objects: use xschem polygon #### path objects: use xschem polygon
# H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 <--n_lines # H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 <--n_lines
#path object --> simulate with polygon #path object --> simulate with polygon
else if($0 ~ /^H/){ else if($0 ~ /^H/){
numlines =$NF numlines =$NF
polys = polys "P 4 " numlines " " polys = polys "P 4 " numlines " "
for(i = 0; i < numlines; i++) { for(i = 0; i < numlines; i++) {
getline getline
sub(/,/, " ", $0) sub(/,/, " ", $0)
@ -197,11 +197,11 @@ FNR==1{
polyx[i] = $2/10 polyx[i] = $2/10
polyy[i] = -$3/10 polyy[i] = -$3/10
} }
polys = polys polyx[i] " " polyy[i] " " polys = polys polyx[i] " " polyy[i] " "
} }
polys = polys "{fill=true}\n" polys = polys "{fill=true}\n"
} }
#### net (wire) objects #### net (wire) objects
# N 39000 50400 39000 51000 4 # N 39000 50400 39000 51000 4
else if($0 ~/^N/) { else if($0 ~/^N/) {
@ -248,12 +248,12 @@ FNR==1{
wires = wires "C {lab_wire.sym} " tx " " ty " 0 1 {" propstring "}\n" wires = wires "C {lab_wire.sym} " tx " " ty " 0 1 {" propstring "}\n"
} }
} }
#### component instance object #### component instance object
# selectable angle flip # selectable angle flip
#C 36700 54700 1 90 0 resistor-1.sym #C 36700 54700 1 90 0 resistor-1.sym
#component #component
else if($0 ~ /^C/){ else if($0 ~ /^C/){
cx = $2/10 cx = $2/10
cy=-$3/10 cy=-$3/10
crot = $5/90 crot = $5/90
@ -295,7 +295,7 @@ FNR==1{
getline getline
continue continue
} }
} }
gsub(/ /, "\\\\\\\\ ", $0) # prefix spaces with double backslash gsub(/ /, "\\\\\\\\ ", $0) # prefix spaces with double backslash
propstring = propstring $0 "\n" propstring = propstring $0 "\n"
@ -314,7 +314,7 @@ FNR==1{
} }
components = components "C {" symbol "} " cx " " cy " " crot " " cflip " {" propstring "}\n" components = components "C {" symbol "} " cx " " cy " " crot " " cflip " {" propstring "}\n"
} }
#### pin object #### pin object
# P 900 100 750 100 1 0 0 # P 900 100 750 100 1 0 0
else if($0 ~ /^P/){ else if($0 ~ /^P/){
@ -322,9 +322,9 @@ FNR==1{
pin_idx++ pin_idx++
pin_line[pin_idx] = "L 3 " order($2, $3, $4, $5) " {}" pin_line[pin_idx] = "L 3 " order($2, $3, $4, $5) " {}"
if($8 == 0) { if($8 == 0) {
pin_box[pin_idx] = "B 5 " $2-halfpinsize " " (-$3-halfpinsize) " " $2+halfpinsize " " (-$3+halfpinsize) pin_box[pin_idx] = "B 5 " $2-halfpinsize " " (-$3-halfpinsize) " " $2+halfpinsize " " (-$3+halfpinsize)
} else { } else {
pin_box[pin_idx] = "B 5 " $4-halfpinsize " " (-$5-halfpinsize) " " $4+halfpinsize " " (-$5+halfpinsize) pin_box[pin_idx] = "B 5 " $4-halfpinsize " " (-$5-halfpinsize) " " $4+halfpinsize " " (-$5+halfpinsize)
} }
ret = getline ret = getline
if($0 == "{") { if($0 == "{") {
@ -363,19 +363,19 @@ FNR==1{
attr = "name" attr = "name"
found_name = 1 found_name = 1
} }
if(attr == "pintype") { if(attr == "pintype") {
found_pintype=1 found_pintype=1
attr = "dir" attr = "dir"
if(value=="clk") value = "in" if(value=="clk") value = "in"
if(value!="in" && value !="out") value = "inout" if(value!="in" && value !="out") value = "inout"
} }
if(attr == "pinseq") { if(attr == "pinseq") {
pin_index[value] = pin_idx pin_index[value] = pin_idx
pinseq++ pinseq++
if(value > max_pinseq) max_pinseq = value if(value > max_pinseq) max_pinseq = value
} }
gsub(/\\/, "\\\\\\\\", value) # replace single slash with double backslash. gsub(/\\/, "\\\\\\\\", value) # replace single slash with double backslash.
gsub(/ /, "\\\\\\\\ ", value) # prefix spaces with double backslash gsub(/ /, "\\\\\\\\ ", value) # prefix spaces with double backslash
gsub(/\\_/, "_", value) gsub(/\\_/, "_", value)
pin_attr[pin_idx, nattr] = attr pin_attr[pin_idx, nattr] = attr
@ -430,14 +430,14 @@ function print_header()
sub(/:.*/,"", netname) sub(/:.*/,"", netname)
sub(/.*:/, "", pinnumber) sub(/.*:/, "", pinnumber)
template_attrs = template_attrs netname "=" netname "\n" template_attrs = template_attrs netname "=" netname "\n"
if(extra !="") extra = extra " " if(extra !="") extra = extra " "
if(extra_format !="") extra_format = extra_format " " if(extra_format !="") extra_format = extra_format " "
if(extra_pinnumber !="") extra_pinnumber = extra_pinnumber " " if(extra_pinnumber !="") extra_pinnumber = extra_pinnumber " "
extra = extra netname extra = extra netname
extra_pinnumber = extra_pinnumber pinnumber extra_pinnumber = extra_pinnumber pinnumber
extra_format = extra_format "@" netname extra_format = extra_format "@" netname
} }
} }
if(extra) { if(extra) {
extra = "extra=\"" extra "\"" extra = "extra=\"" extra "\""
@ -446,7 +446,7 @@ function print_header()
extra_pinnumber = "extra_pinnumber=\"" extra_pinnumber "\"" extra_pinnumber = "extra_pinnumber=\"" extra_pinnumber "\""
} }
if(pin == 1) spice_attrs = tedax_attrs="" if(pin == 1) spice_attrs = tedax_attrs=""
else if(pin == 2) { else if(pin == 2) {
spice_attrs = tedax_attrs="" spice_attrs = tedax_attrs=""
sub(/type=[^ ]+\n/, "type=label\n", global_attrs) sub(/type=[^ ]+\n/, "type=label\n", global_attrs)
@ -465,13 +465,13 @@ function print_header()
template_attrs = "template=\"" template_attrs "\"\n" template_attrs = "template=\"" template_attrs "\"\n"
if(FILENAME ~/\.sym$/) { if(FILENAME ~/\.sym$/) {
if(global_attrs !~ /type=/) if(global_attrs !~ /type=/)
if(pin == 2) { if(pin == 2) {
global_attrs = "type=label\n" global_attrs global_attrs = "type=label\n" global_attrs
} else { } else {
global_attrs = "type=symbol\n" global_attrs global_attrs = "type=symbol\n" global_attrs
} }
print "K {" global_attrs template_attrs tedax_attrs spice_attrs print "K {" global_attrs template_attrs tedax_attrs spice_attrs
if(extra) { if(extra) {
print extra print extra
} }
@ -498,11 +498,11 @@ function file_exists(f, r, c)
else return 1 else return 1
} }
function order(x1, y1, x2, y2, tmp) function order(x1, y1, x2, y2, tmp)
{ {
y1 = -y1 y1 = -y1
y2 = -y2 y2 = -y2
if(x2<x1) { if(x2<x1) {
tmp = x1; x1 = x2; x2 = tmp; tmp = y1; y1 = y2; y2 = tmp tmp = x1; x1 = x2; x2 = tmp; tmp = y1; y1 = y2; y2 = tmp
} else if(x2 == x1 && y2 < y1) { } else if(x2 == x1 && y2 < y1) {
tmp = y1; y1 = y2; y2 = tmp tmp = y1; y1 = y2; y2 = tmp
@ -510,7 +510,7 @@ function order(x1, y1, x2, y2, tmp)
return x1 " " y1 " " x2 " " y2 return x1 " " y1 " " x2 " " y2
} }
function rectorder(x1, y1, x2, y2, tmp) function rectorder(x1, y1, x2, y2, tmp)
{ {
y1 = -y1 y1 = -y1
y2 = -y2 y2 = -y2
@ -647,7 +647,7 @@ END{
len = length(pin_value[idx, j]) len = length(pin_value[idx, j])
correct_align() correct_align()
if( visible ) { if( visible ) {
if(pin_attr[idx, j] ~/^pinnumber$/) text_attr="layer=13" if(pin_attr[idx, j] ~/^pinnumber$/) text_attr="layer=13"
else text_attr="" else text_attr=""
print "T {" attr "} " xt " " (-yt) " " int(angle/90) " " flip " " size " " size " {" text_attr text_align "}" print "T {" attr "} " xt " " (-yt) " " int(angle/90) " " flip " " size " " size " {" text_attr text_align "}"
} }
@ -655,4 +655,4 @@ END{
npin++ npin++
} # end print pins } # end print pins
} }

View File

@ -26,7 +26,7 @@ void init_inst_iterator(Iterator_ctx *ctx, double x1, double y1, double x2, doub
{ {
ctx->instflag = NULL; ctx->instflag = NULL;
dbg(3, "init_inst_iterator(): instances=%d\n", xctx->instances); dbg(3, "init_inst_iterator(): instances=%d\n", xctx->instances);
if(xctx->instances) { if(xctx->instances) {
my_realloc(_ALLOC_ID_, &ctx->instflag, xctx->instances*sizeof(unsigned short)); my_realloc(_ALLOC_ID_, &ctx->instflag, xctx->instances*sizeof(unsigned short));
memset(ctx->instflag, 0, xctx->instances*sizeof(unsigned short)); memset(ctx->instflag, 0, xctx->instances*sizeof(unsigned short));

View File

@ -4,16 +4,16 @@ BEGIN{
} }
{ {
debug=0 debug=0
if($1=="model") macro=$2 if($1=="model") macro=$2
if( $1=="inst") { if( $1=="inst") {
props="" props=""
inst_nonets=1 inst_nonets=1
printf "%s ", expand_label(prefix[macro] $2) printf "%s ", expand_label(prefix[macro] $2)
} }
if($1=="nets") { if($1=="nets") {
inst_nonets=0 inst_nonets=0
$1=""; $0 = $0 $1=""; $0 = $0
@ -30,7 +30,7 @@ BEGIN{
if ( !(macroport[macro,i] in instport) ) { if ( !(macroport[macro,i] in instport) ) {
print "hercules2spice: " macroport[macro,i] " not in instport (" $0 ")" > "/dev/stderr" print "hercules2spice: " macroport[macro,i] " not in instport (" $0 ")" > "/dev/stderr"
} }
s = expand_label(instport[ macroport[macro,i] ] ) s = expand_label(instport[ macroport[macro,i] ] )
expand_label(macroport[macro,i]) # calculate label_width ... expand_label(macroport[macro,i]) # calculate label_width ...
printf "@%d %s ", label_width,s printf "@%d %s ", label_width,s
} }
@ -40,13 +40,13 @@ BEGIN{
if( $1 == "props" ) { if( $1 == "props" ) {
$1=""; $0 = $0 $1=""; $0 = $0
sub(/^ /, "") sub(/^ /, "")
n = split($0, s_arr, /\\/) n = split($0, s_arr, /\\/)
props="" props=""
for(i=1; i<=n; i+=2) { for(i=1; i<=n; i+=2) {
if( 1 ) { ############## s_arr[i] ~ /^[wWlL]$/) { if( 1 ) { ############## s_arr[i] ~ /^[wWlL]$/) {
if(props !="") props = props " " if(props !="") props = props " "
props = props s_arr[i] "=\"" s_arr[i+1] "\"" props = props s_arr[i] "=\"" s_arr[i+1] "\""
} }
} }
} }
@ -66,7 +66,7 @@ BEGIN{
if(startmacro!="") print ".ends" if(startmacro!="") print ".ends"
printf "\n.subckt %s ", $3 printf "\n.subckt %s ", $3
startmacro=$1 startmacro=$1
} }
if($1=="prefix") { if($1=="prefix") {
prefix[macroname] = $2 prefix[macroname] = $2
@ -102,7 +102,7 @@ BEGIN{
if(defaults !="") defaults = defaults " " if(defaults !="") defaults = defaults " "
defaults = defaults s_arr[i] "=\"" s_arr[i+1] "\"" defaults = defaults s_arr[i] "=\"" s_arr[i+1] "\""
} }
} }
@ -138,13 +138,13 @@ BEGIN{
} }
} }
END{ END{
print ".ends" print ".ends"
} }
@ -193,8 +193,8 @@ function expand_label(s, tmp, n, i, j, l, mult, s_arr, lab, idx_le
l = l expand_label( substr(s_arr[i], 1, tmp-1) ">") l = l expand_label( substr(s_arr[i], 1, tmp-1) ">")
if(l!="") l = l "," if(l!="") l = l ","
l = l expand_label( lab "<" substr(s_arr[i], tmp+1)) l = l expand_label( lab "<" substr(s_arr[i], tmp+1))
} else if(s_arr[i] ~ /^[^<>]+<[0-9]+:[0-9]+:[0-9]+>$/) { } else if(s_arr[i] ~ /^[^<>]+<[0-9]+:[0-9]+:[0-9]+>$/) {
lab = incr = idx_left = idx_right = s_arr[i] lab = incr = idx_left = idx_right = s_arr[i]

View File

@ -34,7 +34,7 @@ static unsigned int hi_hash(const char *tok)
hash += (hash << 5) + c; hash += (hash << 5) + c;
} }
xctx->sch_path_hash[xctx->currsch] = hash; xctx->sch_path_hash[xctx->currsch] = hash;
} else { } else {
hash = xctx->sch_path_hash[xctx->currsch]; hash = xctx->sch_path_hash[xctx->currsch];
} }
while ( (c = (unsigned char)*tok++) ) { while ( (c = (unsigned char)*tok++) ) {
@ -48,8 +48,8 @@ static void hilight_hash_free_entry(Hilight_hashentry *entry)
Hilight_hashentry *tmp; Hilight_hashentry *tmp;
while(entry) { while(entry) {
tmp = entry->next; tmp = entry->next;
my_free(_ALLOC_ID_, &entry->token); my_free(_ALLOC_ID_, &entry->token);
my_free(_ALLOC_ID_, &entry->path); my_free(_ALLOC_ID_, &entry->path);
my_free(_ALLOC_ID_, &entry); my_free(_ALLOC_ID_, &entry);
entry = tmp; entry = tmp;
} }
@ -79,7 +79,7 @@ static Hilight_hashentry *hilight_hash_lookup(const char *token, int value, int
{ {
unsigned int hashcode, index; unsigned int hashcode, index;
Hilight_hashentry **preventry; Hilight_hashentry **preventry;
if(token==NULL) return NULL; if(token==NULL) return NULL;
hashcode=hi_hash(token); hashcode=hi_hash(token);
index=hashcode % HASHSIZE; index=hashcode % HASHSIZE;
@ -151,7 +151,7 @@ Hilight_hashentry *bus_hilight_hash_lookup(const char *token, int value, int wha
char *string=NULL; char *string=NULL;
Hilight_hashentry *ptr1=NULL, *ptr2=NULL; Hilight_hashentry *ptr1=NULL, *ptr2=NULL;
int mult; int mult;
dbg(1, "bus_hilight_hash_lookup(): token=%s value=%d what=%d\n", dbg(1, "bus_hilight_hash_lookup(): token=%s value=%d what=%d\n",
token ? token : "<NULL>", value, what); token ? token : "<NULL>", value, what);
xctx->some_nets_added = 0; xctx->some_nets_added = 0;
@ -218,10 +218,10 @@ void copy_hilights(void)
new_entry = &xctx->hilight_table[i]; new_entry = &xctx->hilight_table[i];
while(entry && *entry) { while(entry && *entry) {
Hilight_hashentry *new = (Hilight_hashentry *)my_calloc(_ALLOC_ID_, 1, sizeof( Hilight_hashentry )); Hilight_hashentry *new = (Hilight_hashentry *)my_calloc(_ALLOC_ID_, 1, sizeof( Hilight_hashentry ));
if(*new_entry) (*new_entry) = new; if(*new_entry) (*new_entry) = new;
xctx->hilight_nets = 1; xctx->hilight_nets = 1;
my_strdup2(_ALLOC_ID_, &(new->token), (*entry)->token); my_strdup2(_ALLOC_ID_, &(new->token), (*entry)->token);
my_strdup2(_ALLOC_ID_, &(new->path), (*entry)->path); my_strdup2(_ALLOC_ID_, &(new->path), (*entry)->path);
new->hash = (*entry)->hash; new->hash = (*entry)->hash;
@ -267,7 +267,7 @@ void display_hilights(int what, char **str)
my_strcat(_ALLOC_ID_, str,"}"); my_strcat(_ALLOC_ID_, str,"}");
first = 0; first = 0;
} }
skip: skip:
entry = entry->next; entry = entry->next;
} }
} }
@ -282,7 +282,7 @@ static int there_are_hilights()
if(hiptr[i]) return 1; if(hiptr[i]) return 1;
} }
for(i = 0; i < xctx->instances; ++i) { for(i = 0; i < xctx->instances; ++i) {
if(inst[i].color != -10000) return 1; if(inst[i].color != -10000) return 1;
} }
return 0; return 0;
} }
@ -304,13 +304,13 @@ int hilight_graph_node(const char *node, int col)
path_skip++; /* skip initial '.' */ path_skip++; /* skip initial '.' */
/* skip path components that are above the level where raw file was loaded */ /* skip path components that are above the level where raw file was loaded */
while(*path_skip && skip < start_level) { while(*path_skip && skip < start_level) {
if(*path_skip == '.') skip++; if(*path_skip == '.') skip++;
++path_skip; ++path_skip;
} }
my_strdup2(_ALLOC_ID_, &n, node); my_strdup2(_ALLOC_ID_, &n, node);
nptr = n; nptr = n;
dbg(1, "hilight_graph_node(): path_skip=%s, %s: %d\n", path_skip, node, col); dbg(1, "hilight_graph_node(): path_skip=%s, %s: %d\n", path_skip, node, col);
if(strstr(n, "i(v.")) {current = 1; nptr += 4;} if(strstr(n, "i(v.")) {current = 1; nptr += 4;}
else if(strstr(n, "I(V.")) {current = 1; nptr += 4;} else if(strstr(n, "I(V.")) {current = 1; nptr += 4;}
@ -326,7 +326,7 @@ int hilight_graph_node(const char *node, int col)
nptr = ptr2 + 1; nptr = ptr2 + 1;
if(!strstr(path_skip, path3)) if(!strstr(path_skip, path3))
my_mstrcat(_ALLOC_ID_, &path2, path, path3, ".", NULL); my_mstrcat(_ALLOC_ID_, &path2, path, path3, ".", NULL);
else else
my_strdup2(_ALLOC_ID_, &path2, path); my_strdup2(_ALLOC_ID_, &path2, path);
} }
else { else {
@ -347,7 +347,7 @@ int hilight_graph_node(const char *node, int col)
return 1; return 1;
} }
/* by default: /* by default:
* xctx->active_layer[0] = 7 * xctx->active_layer[0] = 7
* xctx->active_layer[1] = 8 * xctx->active_layer[1] = 8
* xctx->active_layer[2] = 10 if 9 is disabled it is skipped * xctx->active_layer[2] = 10 if 9 is disabled it is skipped
@ -375,7 +375,7 @@ void incr_hilight_color(void)
dbg(1, "incr_hilight_color(): xctx->hilight_color=%d\n", xctx->hilight_color); dbg(1, "incr_hilight_color(): xctx->hilight_color=%d\n", xctx->hilight_color);
} }
static void set_rawfile_for_bespice() static void set_rawfile_for_bespice()
{ {
char raw_file[PATH_MAX]; char raw_file[PATH_MAX];
char netlist_file[PATH_MAX]; char netlist_file[PATH_MAX];
@ -392,7 +392,7 @@ static void set_rawfile_for_bespice()
tclvareval("puts $bespice_server_getdata(sock) ", tclvareval("puts $bespice_server_getdata(sock) ",
"{create_equivalent_nets \"", raw_file, "\" \"", netlist_file, "\"}", "{create_equivalent_nets \"", raw_file, "\" \"", netlist_file, "\"}",
NULL); NULL);
/* (3) make sure that the raw file is used for commands plotting voltages and currents /* (3) make sure that the raw file is used for commands plotting voltages and currents
this is important if more than one file has been opened. */ this is important if more than one file has been opened. */
tclvareval("puts $bespice_server_getdata(sock) ", tclvareval("puts $bespice_server_getdata(sock) ",
"{use_file_for_link_to_schematic \"", raw_file, "\"}", "{use_file_for_link_to_schematic \"", raw_file, "\"}",
@ -460,7 +460,7 @@ void create_plot_cmd(void)
c = get_color(entry->value); c = get_color(entry->value);
++idx; ++idx;
if(viewer == NGSPICE) { if(viewer == NGSPICE) {
sprintf(color_str, "%02x/%02x/%02x", sprintf(color_str, "%02x/%02x/%02x",
xctx->xcolor_array[c].red>>8, xctx->xcolor_array[c].green>>8, xctx->xcolor_array[c].blue>>8); xctx->xcolor_array[c].red>>8, xctx->xcolor_array[c].green>>8, xctx->xcolor_array[c].blue>>8);
if(idx > 9) { if(idx > 9) {
idx = 2; idx = 2;
@ -481,7 +481,7 @@ void create_plot_cmd(void)
} }
if(viewer == GAW) { if(viewer == GAW) {
char *t=NULL, *p=NULL; char *t=NULL, *p=NULL;
sprintf(color_str, "%02x%02x%02x", sprintf(color_str, "%02x%02x%02x",
xctx->xcolor_array[c].red>>8, xctx->xcolor_array[c].green>>8, xctx->xcolor_array[c].blue>>8); xctx->xcolor_array[c].red>>8, xctx->xcolor_array[c].green>>8, xctx->xcolor_array[c].blue>>8);
my_strdup(_ALLOC_ID_, &t, tok); my_strdup(_ALLOC_ID_, &t, tok);
my_strdup2(_ALLOC_ID_, &p, (entry->path)+1); my_strdup2(_ALLOC_ID_, &p, (entry->path)+1);
@ -502,12 +502,12 @@ void create_plot_cmd(void)
} }
if(viewer == BESPICE) { if(viewer == BESPICE) {
char *t=NULL, *p=NULL; char *t=NULL, *p=NULL;
sprintf(color_str, "#%02x%02x%02x", sprintf(color_str, "#%02x%02x%02x",
xctx->xcolor_array[c].red>>8, xctx->xcolor_array[c].green>>8, xctx->xcolor_array[c].blue>>8); xctx->xcolor_array[c].red>>8, xctx->xcolor_array[c].green>>8, xctx->xcolor_array[c].blue>>8);
my_strdup(_ALLOC_ID_, &t, tok); my_strdup(_ALLOC_ID_, &t, tok);
my_strdup2(_ALLOC_ID_, &p, (entry->path)+1); my_strdup2(_ALLOC_ID_, &p, (entry->path)+1);
/* bespice command syntax : /* bespice command syntax :
add_voltage_on_spice_node_to_plot <plot name> <section name> <hierarchical spice node name> <flag clear> [<color>] add_voltage_on_spice_node_to_plot <plot name> <section name> <hierarchical spice node name> <flag clear> [<color>]
plot name is "*" => automatic plot name is "*" => automatic
section name is empty => automatic or user defined section name is empty => automatic or user defined
@ -560,7 +560,7 @@ void hilight_net_pin_mismatches(void)
int mult; int mult;
xRect *rct; xRect *rct;
int incr_hi; int incr_hi;
incr_hi = tclgetboolvar("incr_hilight"); incr_hi = tclgetboolvar("incr_hilight");
rebuild_selected_array(); rebuild_selected_array();
prepare_netlist_structs(0); prepare_netlist_structs(0);
@ -608,7 +608,7 @@ void hilight_parent_pins(void)
inst_number = xctx->sch_inst_number[xctx->currsch]; inst_number = xctx->sch_inst_number[xctx->currsch];
/* may be set to -1 by descend_symbol to notify we are /* may be set to -1 by descend_symbol to notify we are
* descending into a smbol from an instance with no embed flag set * descending into a smbol from an instance with no embed flag set
* this is used when descending into symbols created from generators */ * this is used when descending into symbols created from generators */
if(inst_number == -1) inst_number = 1; if(inst_number == -1) inst_number = 1;
@ -620,7 +620,7 @@ void hilight_parent_pins(void)
/* propagate global nets */ /* propagate global nets */
for(j=0;j<HASHSIZE; ++j) { for(j=0;j<HASHSIZE; ++j) {
entry=xctx->hilight_table[j]; entry=xctx->hilight_table[j];
for( entry=xctx->hilight_table[j]; entry; entry = entry->next) { for( entry=xctx->hilight_table[j]; entry; entry = entry->next) {
if(entry->token[0] == ' ') continue; /* skip instances, process only nets */ if(entry->token[0] == ' ') continue; /* skip instances, process only nets */
if(record_global_node(3, NULL, entry->token)) { if(record_global_node(3, NULL, entry->token)) {
dbg(1, "entry token=%s, value=%d\n", entry->token, entry->value); dbg(1, "entry token=%s, value=%d\n", entry->token, entry->value);
@ -651,7 +651,7 @@ void hilight_parent_pins(void)
if(entry) if(entry)
{ {
dbg(1, "found hilight entry in child: %s\n", entry->token); dbg(1, "found hilight entry in child: %s\n", entry->token);
bus_hilight_hash_lookup(find_nth(net_node, ",", "", 0, bus_hilight_hash_lookup(find_nth(net_node, ",", "", 0,
((inst_number - 1) * mult + k - 1) % net_mult + 1), entry->value, XINSERT); ((inst_number - 1) * mult + k - 1) % net_mult + 1), entry->value, XINSERT);
} }
else else
@ -662,7 +662,7 @@ void hilight_parent_pins(void)
* in the hierarchy. If you want to see how child pins propagate upstream * in the hierarchy. If you want to see how child pins propagate upstream
* you should unhilight all net probes, hilight the desired child pins and then go up */ * you should unhilight all net probes, hilight the desired child pins and then go up */
/* /*
* bus_hilight_hash_lookup(find_nth(net_node, ",", "", 0, * bus_hilight_hash_lookup(find_nth(net_node, ",", "", 0,
* ((inst_number - 1) * mult + k - 1) % net_mult + 1), 0, XDELETE); * ((inst_number - 1) * mult + k - 1) % net_mult + 1), 0, XDELETE);
*/ */
@ -703,7 +703,7 @@ void hilight_child_pins(void)
} }
/* may be set to -1 by descend_symbol to notify we are /* may be set to -1 by descend_symbol to notify we are
* descending into a smbol from an instance with no embed flag set * descending into a smbol from an instance with no embed flag set
* this is used when descending into symbols created from generators */ * this is used when descending into symbols created from generators */
if(inst_number == -1) inst_number = 1; if(inst_number == -1) inst_number = 1;
@ -752,7 +752,7 @@ static int bus_search(const char*s)
} }
#ifndef __unix__ #ifndef __unix__
int win_regexec(const char *options, const char *pattern, const char *name) int win_regexec(const char *options, const char *pattern, const char *name)
{ {
if (options!=NULL) if (options!=NULL)
tclvareval("regexp {", options,"} {", pattern, "} {", name, "}", NULL); tclvareval("regexp {", options,"} {", pattern, "} {", name, "}", NULL);
@ -797,7 +797,7 @@ int search(const char *tok, const char *val, int sub, int sel, int match_case, i
} }
save_draw = xctx->draw_window; save_draw = xctx->draw_window;
xctx->draw_window=1; xctx->draw_window=1;
/* replace strcmp and strstr with my_strcasecmp and my_strcasestr /* replace strcmp and strstr with my_strcasecmp and my_strcasestr
* if SPICE or VHDL (case insensitive) netlist mode is set */ * if SPICE or VHDL (case insensitive) netlist mode is set */
if(!match_case) { if(!match_case) {
comparefn = my_strcasecmp; comparefn = my_strcasecmp;
@ -808,7 +808,7 @@ int search(const char *tok, const char *val, int sub, int sel, int match_case, i
cflags |= REG_ICASE; /* ignore case for Spice and VHDL (these are case insensitive netlists) */ cflags |= REG_ICASE; /* ignore case for Spice and VHDL (these are case insensitive netlists) */
} }
if(regcomp(&re, val , cflags)) return TCL_ERROR; if(regcomp(&re, val , cflags)) return TCL_ERROR;
#else #else
if(!match_case) { if(!match_case) {
my_strdup(_ALLOC_ID_, &regexp_options, "-nocase"); my_strdup(_ALLOC_ID_, &regexp_options, "-nocase");
} }
@ -1119,7 +1119,7 @@ static void drill_hilight(int mode)
if( (entry=bus_hilight_hash_lookup(netbitname, 0, XLOOKUP)) ) { if( (entry=bus_hilight_hash_lookup(netbitname, 0, XLOOKUP)) ) {
if( hilight_connected_inst || (symbol->type && IS_LABEL_SH_OR_PIN(symbol->type)) ) { if( hilight_connected_inst || (symbol->type && IS_LABEL_SH_OR_PIN(symbol->type)) ) {
xctx->inst[i].color = entry->value; xctx->inst[i].color = entry->value;
inst_hilight_hash_lookup(i, entry->value, XINSERT_NOREPLACE); inst_hilight_hash_lookup(i, entry->value, XINSERT_NOREPLACE);
} }
my_strdup(_ALLOC_ID_, &propagate_str, get_tok_value(rct[j].prop_ptr, "propag", 0)); my_strdup(_ALLOC_ID_, &propagate_str, get_tok_value(rct[j].prop_ptr, "propag", 0));
if(propagate_str) { if(propagate_str) {
@ -1204,7 +1204,7 @@ static void send_net_to_bespice(int simtype, const char *node)
my_strdup2(_ALLOC_ID_, &p, xctx->sch_path[xctx->currsch]+1); my_strdup2(_ALLOC_ID_, &p, xctx->sch_path[xctx->currsch]+1);
for(k=1; k<=tok_mult; ++k) { for(k=1; k<=tok_mult; ++k) {
my_strdup(_ALLOC_ID_, &t, find_nth(expanded_tok, ",", "", 0, k)); my_strdup(_ALLOC_ID_, &t, find_nth(expanded_tok, ",", "", 0, k));
/* bespice command syntax : /* bespice command syntax :
add_voltage_on_spice_node_to_plot <plot name> <section name> <hierarchical spice node name> <flag clear> [<color>] add_voltage_on_spice_node_to_plot <plot name> <section name> <hierarchical spice node name> <flag clear> [<color>]
plot name is "*" => automatic plot name is "*" => automatic
section name is empty => automatic or user defined section name is empty => automatic or user defined
@ -1298,7 +1298,7 @@ static void send_current_to_bespice(int simtype, const char *node)
const char *tok; const char *tok;
char color_str[30]; char color_str[30];
char *t=NULL, *p=NULL; char *t=NULL, *p=NULL;
set_rawfile_for_bespice(); set_rawfile_for_bespice();
if(!node || !node[0]) return; if(!node || !node[0]) return;
@ -1311,7 +1311,7 @@ static void send_current_to_bespice(int simtype, const char *node)
my_strdup2(_ALLOC_ID_, &p, xctx->sch_path[xctx->currsch]+1); my_strdup2(_ALLOC_ID_, &p, xctx->sch_path[xctx->currsch]+1);
for(k=1; k<=tok_mult; ++k) { for(k=1; k<=tok_mult; ++k) {
my_strdup(_ALLOC_ID_, &t, find_nth(expanded_tok, ",", "", 0, k)); my_strdup(_ALLOC_ID_, &t, find_nth(expanded_tok, ",", "", 0, k));
/* bespice command syntax : /* bespice command syntax :
add_current_through_spice_device_to_plot <plot name> <section name> <hierarchical spice device name> <flag clear> [<color>] add_current_through_spice_device_to_plot <plot name> <section name> <hierarchical spice device name> <flag clear> [<color>]
plot name is "*" => automatic plot name is "*" => automatic
section name is empty => automatic or user defined section name is empty => automatic or user defined
@ -1358,7 +1358,7 @@ static void send_current_to_graph(char **s, int simtype, const char *node)
my_snprintf(ss, S(ss), "i(%s%s%s) %d", there_is_hierarchy ? "v." : "", path, t, c); my_snprintf(ss, S(ss), "i(%s%s%s) %d", there_is_hierarchy ? "v." : "", path, t, c);
my_strcat(_ALLOC_ID_, s, ss); my_strcat(_ALLOC_ID_, s, ss);
} else { /* Xyce */ } else { /* Xyce */
/* /*
my_snprintf(ss, S(ss), "%s%s%s#branch %d", there_is_hierarchy ? "v." : "", my_snprintf(ss, S(ss), "%s%s%s#branch %d", there_is_hierarchy ? "v." : "",
path, (there_is_hierarchy ? t+1 : t) , c); path, (there_is_hierarchy ? t+1 : t) , c);
*/ */
@ -1428,7 +1428,7 @@ void propagate_hilights(int set, int clear, int mode)
dbg(1, "propagate_hilights() for %s\n", xctx->current_name); dbg(1, "propagate_hilights() for %s\n", xctx->current_name);
en_hi = tclgetboolvar("en_hilight_conn_inst"); en_hi = tclgetboolvar("en_hilight_conn_inst");
prepare_netlist_structs(0); prepare_netlist_structs(0);
for(i = 0; i < xctx->instances; ++i) { for(i = 0; i < xctx->instances; ++i) {
if(xctx->inst[i].ptr < 0 ) { if(xctx->inst[i].ptr < 0 ) {
@ -1437,7 +1437,7 @@ void propagate_hilights(int set, int clear, int mode)
continue; continue;
} }
type = (xctx->inst[i].ptr+ xctx->sym)->type; type = (xctx->inst[i].ptr+ xctx->sym)->type;
hilight_connected_inst = en_hi && hilight_connected_inst = en_hi &&
((xctx->inst[i].flags & HILIGHT_CONN) || ((xctx->inst[i].ptr+ xctx->sym)->flags & HILIGHT_CONN)); ((xctx->inst[i].flags & HILIGHT_CONN) || ((xctx->inst[i].ptr+ xctx->sym)->flags & HILIGHT_CONN));
/* hilight/clear instances with highlight=true attr set and en_hilight_conn_inst option is set ... */ /* hilight/clear instances with highlight=true attr set and en_hilight_conn_inst option is set ... */
if(type && !IS_LABEL_SH_OR_PIN(type)) { if(type && !IS_LABEL_SH_OR_PIN(type)) {
@ -1473,7 +1473,7 @@ void propagate_hilights(int set, int clear, int mode)
entry=bus_hilight_hash_lookup( xctx->inst[i].node[0], 0, XLOOKUP); entry=bus_hilight_hash_lookup( xctx->inst[i].node[0], 0, XLOOKUP);
if(entry && set) { if(entry && set) {
xctx->inst[i].color = entry->value; xctx->inst[i].color = entry->value;
inst_hilight_hash_lookup(i, entry->value, XINSERT_NOREPLACE); inst_hilight_hash_lookup(i, entry->value, XINSERT_NOREPLACE);
} }
else if(!entry && clear) xctx->inst[i].color = -10000; else if(!entry && clear) xctx->inst[i].color = -10000;
} }
@ -1702,7 +1702,7 @@ static void create_simdata(void)
xctx->simdata[i].pin[j].go_to=NULL; xctx->simdata[i].pin[j].go_to=NULL;
my_snprintf(function, S(function), "function%d", j); my_snprintf(function, S(function), "function%d", j);
my_strdup(_ALLOC_ID_, &xctx->simdata[i].pin[j].function, get_tok_value(symbol->prop_ptr, function, 0)); my_strdup(_ALLOC_ID_, &xctx->simdata[i].pin[j].function, get_tok_value(symbol->prop_ptr, function, 0));
my_strdup(_ALLOC_ID_, &xctx->simdata[i].pin[j].go_to, my_strdup(_ALLOC_ID_, &xctx->simdata[i].pin[j].go_to,
get_tok_value(symbol->rect[PINLAYER][j].prop_ptr, "goto", 0)); get_tok_value(symbol->rect[PINLAYER][j].prop_ptr, "goto", 0));
str = get_tok_value(symbol->rect[PINLAYER][j].prop_ptr, "clock", 0); str = get_tok_value(symbol->rect[PINLAYER][j].prop_ptr, "clock", 0);
xctx->simdata[i].pin[j].clock = str[0] ? str[0] - '0' : -1; xctx->simdata[i].pin[j].clock = str[0] ? str[0] - '0' : -1;
@ -1810,9 +1810,9 @@ static void propagate_logic()
if(newval != 4 && xctx->simdata[i].pin[propagate].value != val ) { if(newval != 4 && xctx->simdata[i].pin[propagate].value != val ) {
found=1; /* keep looping until no more nets are found. */ found=1; /* keep looping until no more nets are found. */
xctx->simdata[i].pin[propagate].value = val; xctx->simdata[i].pin[propagate].value = val;
dbg(1, "propagate_logic(): DRIVERS inst %s pin %d, net %s --> value %d\n", dbg(1, "propagate_logic(): DRIVERS inst %s pin %d, net %s --> value %d\n",
xctx->inst[i].instname, j, xctx->inst[i].node[propagate], val); xctx->inst[i].instname, j, xctx->inst[i].node[propagate], val);
} }
} /* while( ith-goto ) */ } /* while( ith-goto ) */
} /* if((xctx->simdata && xctx->simdata[i].pin && xctx->simdata[i].pin[j].go_to) */ } /* if((xctx->simdata && xctx->simdata[i].pin && xctx->simdata[i].pin[j].go_to) */
} /* for(j...) */ } /* for(j...) */
@ -1825,7 +1825,7 @@ static void propagate_logic()
for(j=0;j < xctx->simdata[i].npin; ++j) { for(j=0;j < xctx->simdata[i].npin; ++j) {
if(xctx->simdata[i].pin[j].value != -10000) { if(xctx->simdata[i].pin[j].value != -10000) {
if(!xctx->inst[i].node || !xctx->inst[i].node[j]) continue; if(!xctx->inst[i].node || !xctx->inst[i].node[j]) continue;
entry = hilight_hash_lookup(xctx->inst[i].node[j], 0, XLOOKUP); entry = hilight_hash_lookup(xctx->inst[i].node[j], 0, XLOOKUP);
if(!entry || xctx->hilight_time != entry->time) { if(!entry || xctx->hilight_time != entry->time) {
hilight_hash_lookup(xctx->inst[i].node[j], xctx->simdata[i].pin[j].value, XINSERT); hilight_hash_lookup(xctx->inst[i].node[j], xctx->simdata[i].pin[j].value, XINSERT);
dbg(1, "propagate_logic(): UPDATE1 inst %s pin %d, net %s --> value %d\n", dbg(1, "propagate_logic(): UPDATE1 inst %s pin %d, net %s --> value %d\n",
@ -1860,7 +1860,7 @@ void logic_set(int value, int num, const char *net_name)
int big = xctx->wires> 2000 || xctx->instances > 2000 ; int big = xctx->wires> 2000 || xctx->instances > 2000 ;
static const int map[] = {LOGIC_0, LOGIC_1, LOGIC_X, LOGIC_Z, LOGIC_NOUP}; static const int map[] = {LOGIC_0, LOGIC_1, LOGIC_X, LOGIC_Z, LOGIC_NOUP};
Hilight_hashentry *entry; Hilight_hashentry *entry;
tclsetvar("tclstop", "0"); tclsetvar("tclstop", "0");
prepare_netlist_structs(0); prepare_netlist_structs(0);
if(!xctx->simdata) create_simdata(); if(!xctx->simdata) create_simdata();
@ -2060,7 +2060,7 @@ void select_hilight_net(void)
for(i=0;i<xctx->instances; ++i) { for(i=0;i<xctx->instances; ++i) {
type = (xctx->inst[i].ptr+ xctx->sym)->type; type = (xctx->inst[i].ptr+ xctx->sym)->type;
hilight_connected_inst = en_hi && hilight_connected_inst = en_hi &&
((xctx->inst[i].flags & HILIGHT_CONN) || ((xctx->inst[i].ptr+ xctx->sym)->flags & HILIGHT_CONN)); ((xctx->inst[i].flags & HILIGHT_CONN) || ((xctx->inst[i].ptr+ xctx->sym)->flags & HILIGHT_CONN));
if( xctx->inst[i].color != -10000) { if( xctx->inst[i].color != -10000) {
dbg(1, "select_hilight_net(): instance %d flags & HILIGHT_CONN true\n", i); dbg(1, "select_hilight_net(): instance %d flags & HILIGHT_CONN true\n", i);
@ -2092,7 +2092,7 @@ void select_hilight_net(void)
xctx->need_reb_sel_arr = 1; xctx->need_reb_sel_arr = 1;
rebuild_selected_array(); /* sets or clears xctx->ui_state SELECTION flag */ rebuild_selected_array(); /* sets or clears xctx->ui_state SELECTION flag */
redraw_hilights(0); redraw_hilights(0);
} }
@ -2324,13 +2324,13 @@ void print_hilight_net(int show)
/* before invoking this function, in this case --> skip */ /* before invoking this function, in this case --> skip */
if(node_entry && !strcmp(xctx->sch_path[xctx->currsch], entry->path)) { if(node_entry && !strcmp(xctx->sch_path[xctx->currsch], entry->path)) {
if(show==3) { if(show==3) {
if(xctx->netlist_type == CAD_SPICE_NETLIST) if(xctx->netlist_type == CAD_SPICE_NETLIST)
fprintf(fd, ".save v(%s%s)\n", fprintf(fd, ".save v(%s%s)\n",
entry->path + 1, entry->path + 1,
entry->token[0] == '#' ? entry->token + 1 : entry->token ); entry->token[0] == '#' ? entry->token + 1 : entry->token );
else else
fprintf(fd, "%s%s\n", fprintf(fd, "%s%s\n",
entry->path + 1, entry->path + 1,
entry->token[0] == '#' ? entry->token + 1 : entry->token ); entry->token[0] == '#' ? entry->token + 1 : entry->token );
} else if(show==1) { } else if(show==1) {
fprintf(fd, "%s\n", entry->token); fprintf(fd, "%s\n", entry->token);
@ -2407,7 +2407,7 @@ void list_hilights(int all)
entry->token, " ", my_itoa(entry->value), "\n", NULL); entry->token, " ", my_itoa(entry->value), "\n", NULL);
} }
} }
} else } else
for(i=0;i<HASHSIZE; ++i) { for(i=0;i<HASHSIZE; ++i) {
entry=xctx->hilight_table[i]; entry=xctx->hilight_table[i];
while(entry) { while(entry) {

View File

@ -1,21 +1,21 @@
# #
# File: hspice_backannotate.tcl # File: hspice_backannotate.tcl
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers # Copyright (C) 1998-2024 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -100,24 +100,24 @@ proc annotate {} {
xschem push_undo xschem push_undo
xschem set no_undo 1 xschem set no_undo 1
xschem set no_draw 1 xschem set no_draw 1
read_hspice_log $::netlist_dir/hspice.out read_hspice_log $::netlist_dir/hspice.out
set lastinst [xschem get instances] set lastinst [xschem get instances]
for { set i 0 } { $i < $lastinst } {incr i } { for { set i 0 } { $i < $lastinst } {incr i } {
set name [xschem getprop instance $i name] set name [xschem getprop instance $i name]
set type [xschem getprop instance $i cell::type] set type [xschem getprop instance $i cell::type]
if { $type == "probe"} { if { $type == "probe"} {
set net [xschem instance_net $i p] set net [xschem instance_net $i p]
if {[catch {xschem setprop -fast instance $i voltage [get_voltage $net]} err]} { if {[catch {xschem setprop -fast instance $i voltage [get_voltage $net]} err]} {
puts "1 error : $err net: $net" puts "1 error : $err net: $net"
} }
} }
if { $type == "current_probe"} { if { $type == "current_probe"} {
if {[catch {xschem setprop -fast instance $i current [get_current $name]} err]} { if {[catch {xschem setprop -fast instance $i current [get_current $name]} err]} {
puts "2 error : $err" puts "2 error : $err"
} }
} }
if { $type == "differential_probe"} { if { $type == "differential_probe"} {
set netp [xschem instance_net $i p] set netp [xschem instance_net $i p]
set netm [xschem instance_net $i m] set netm [xschem instance_net $i m]
if {[catch {xschem setprop -fast instance $i voltage [get_diff_voltage $netp $netm]} err]} { if {[catch {xschem setprop -fast instance $i voltage [get_diff_voltage $netp $netm]} err]} {
@ -126,13 +126,13 @@ proc annotate {} {
} }
# puts "$i $name $type" # puts "$i $name $type"
} }
# re-enable undo and draw # re-enable undo and draw
xschem set no_undo 0 xschem set no_undo 0
xschem set no_draw 0 xschem set no_draw 0
xschem redraw xschem redraw
### xschem setprop instructions have not altered circuit topology so ### xschem setprop instructions have not altered circuit topology so
### in this case a connectivity rebuild is not needed. ### in this case a connectivity rebuild is not needed.
# xschem rebuild_connectivity # xschem rebuild_connectivity
# #

View File

@ -1,8 +1,8 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
# import a opus generated list of symbols (cell_pinouts) # import a opus generated list of symbols (cell_pinouts)
# (generated with the cell_binding.il skill) # (generated with the cell_binding.il skill)
# and outputs a tcl source file. # and outputs a tcl source file.
# this source file can be sourced by the xschem tcl interpreter # this source file can be sourced by the xschem tcl interpreter
# to generate schematics and symbols # to generate schematics and symbols
# IMPORTANT: set the target library in library variable !!!! # IMPORTANT: set the target library in library variable !!!!
# #
@ -26,7 +26,7 @@ BEGIN{
delete opins delete opins
delete iopins delete iopins
} }
if($6=="input") ipins[$4]=1 if($6=="input") ipins[$4]=1
if($6=="output") opins[$4]=1 if($6=="output") opins[$4]=1
if($6=="inputOutput") iopins[$4]=1 if($6=="inputOutput") iopins[$4]=1
@ -43,20 +43,20 @@ END{
function print_cell() function print_cell()
{ {
print "set cellname " library "/" oldcell print "set cellname " library "/" oldcell
printf "set gensch_i_pin {" printf "set gensch_i_pin {"
for(i in ipins) { for(i in ipins) {
printf "%s ", i printf "%s ", i
} }
printf "}\n" printf "}\n"
printf "set gensch_o_pin {" printf "set gensch_o_pin {"
for(i in opins) { for(i in opins) {
printf "%s ", i printf "%s ", i
} }
printf "}\n" printf "}\n"
printf "set gensch_io_pin {" printf "set gensch_io_pin {"
for(i in iopins) { for(i in iopins) {
printf "%s ", i printf "%s ", i
} }
printf "}\n" printf "}\n"

View File

@ -142,7 +142,7 @@ static void free_undo_symbols(int slot)
} }
my_free(_ALLOC_ID_, &sym->poly[c]); my_free(_ALLOC_ID_, &sym->poly[c]);
sym->polygons[c] = 0; sym->polygons[c] = 0;
for(j = 0;j<sym->lines[c]; ++j) { for(j = 0;j<sym->lines[c]; ++j) {
if(sym->line[c][j].prop_ptr != NULL) { if(sym->line[c][j].prop_ptr != NULL) {
my_free(_ALLOC_ID_, &sym->line[c][j].prop_ptr); my_free(_ALLOC_ID_, &sym->line[c][j].prop_ptr);
@ -150,7 +150,7 @@ static void free_undo_symbols(int slot)
} }
my_free(_ALLOC_ID_, &sym->line[c]); my_free(_ALLOC_ID_, &sym->line[c]);
sym->lines[c] = 0; sym->lines[c] = 0;
for(j = 0;j<sym->arcs[c]; ++j) { for(j = 0;j<sym->arcs[c]; ++j) {
if(sym->arc[c][j].prop_ptr != NULL) { if(sym->arc[c][j].prop_ptr != NULL) {
my_free(_ALLOC_ID_, &sym->arc[c][j].prop_ptr); my_free(_ALLOC_ID_, &sym->arc[c][j].prop_ptr);
@ -158,7 +158,7 @@ static void free_undo_symbols(int slot)
} }
my_free(_ALLOC_ID_, &sym->arc[c]); my_free(_ALLOC_ID_, &sym->arc[c]);
sym->arcs[c] = 0; sym->arcs[c] = 0;
for(j = 0;j<sym->rects[c]; ++j) { for(j = 0;j<sym->rects[c]; ++j) {
if(sym->rect[c][j].prop_ptr != NULL) { if(sym->rect[c][j].prop_ptr != NULL) {
my_free(_ALLOC_ID_, &sym->rect[c][j].prop_ptr); my_free(_ALLOC_ID_, &sym->rect[c][j].prop_ptr);
@ -333,7 +333,7 @@ void mem_push_undo(void)
xctx->uslot[slot].pptr[c][i].selected_point = my_malloc(_ALLOC_ID_, points * sizeof(unsigned short)); xctx->uslot[slot].pptr[c][i].selected_point = my_malloc(_ALLOC_ID_, points * sizeof(unsigned short));
memcpy(xctx->uslot[slot].pptr[c][i].x, xctx->poly[c][i].x, points * sizeof(double)); memcpy(xctx->uslot[slot].pptr[c][i].x, xctx->poly[c][i].x, points * sizeof(double));
memcpy(xctx->uslot[slot].pptr[c][i].y, xctx->poly[c][i].y, points * sizeof(double)); memcpy(xctx->uslot[slot].pptr[c][i].y, xctx->poly[c][i].y, points * sizeof(double));
memcpy(xctx->uslot[slot].pptr[c][i].selected_point, xctx->poly[c][i].selected_point, memcpy(xctx->uslot[slot].pptr[c][i].selected_point, xctx->poly[c][i].selected_point,
points * sizeof(unsigned short)); points * sizeof(unsigned short));
my_strdup(_ALLOC_ID_, &xctx->uslot[slot].pptr[c][i].prop_ptr, xctx->poly[c][i].prop_ptr); my_strdup(_ALLOC_ID_, &xctx->uslot[slot].pptr[c][i].prop_ptr, xctx->poly[c][i].prop_ptr);
} }
@ -386,7 +386,7 @@ void mem_push_undo(void)
} }
/* redo: /* redo:
* 0: undo (with push current state for allowing following redo) * 0: undo (with push current state for allowing following redo)
* 4: undo, do not push state for redo * 4: undo, do not push state for redo
* 1: redo * 1: redo
* 2: read top data from undo stack without changing undo stack * 2: read top data from undo stack without changing undo stack
@ -480,7 +480,7 @@ void mem_pop_undo(int redo, int set_modify_status)
xctx->poly[c][i].selected_point = my_malloc(_ALLOC_ID_, points * sizeof(unsigned short)); xctx->poly[c][i].selected_point = my_malloc(_ALLOC_ID_, points * sizeof(unsigned short));
memcpy(xctx->poly[c][i].x, xctx->uslot[slot].pptr[c][i].x, points * sizeof(double)); memcpy(xctx->poly[c][i].x, xctx->uslot[slot].pptr[c][i].x, points * sizeof(double));
memcpy(xctx->poly[c][i].y, xctx->uslot[slot].pptr[c][i].y, points * sizeof(double)); memcpy(xctx->poly[c][i].y, xctx->uslot[slot].pptr[c][i].y, points * sizeof(double));
memcpy(xctx->poly[c][i].selected_point, xctx->uslot[slot].pptr[c][i].selected_point, memcpy(xctx->poly[c][i].selected_point, xctx->uslot[slot].pptr[c][i].selected_point,
points * sizeof(unsigned short)); points * sizeof(unsigned short));
} }
} }

View File

@ -45,7 +45,7 @@ function compact_label(lab)
if( start!=-1 && lab_array[i] != name ) if( start!=-1 && lab_array[i] != name )
print_signal() print_signal()
if( (startbus!=-1) && (lab_name(lab_array[i]) != busname) ) if( (startbus!=-1) && (lab_name(lab_array[i]) != busname) )
print_bus() print_bus()
# 09032004 fix for errors on buses like D[5],D[4],D[2],D[1] # 09032004 fix for errors on buses like D[5],D[4],D[2],D[1]
if( (startbus!=-1) && (lab_name(lab_array[i]) == busname) && (bus_current+1!=last) ) if( (startbus!=-1) && (lab_name(lab_array[i]) == busname) && (bus_current+1!=last) )
@ -58,7 +58,7 @@ function compact_label(lab)
print_bus() print_bus()
} }
else { else {
if(lab_name(lab_array[i]) != busname&& startbus!=-1) if(lab_name(lab_array[i]) != busname&& startbus!=-1)
print_bus() print_bus()
if( (start!=-1) && ( lab_array[i] != name) ) if( (start!=-1) && ( lab_array[i] != name) )
print_signal() print_signal()
@ -97,7 +97,7 @@ function lab_name(lab)
} }
function lab_index(lab) function lab_index(lab)
{ {
sub(/.*\[/,"",lab) sub(/.*\[/,"",lab)
sub(/\].*/,"",lab) sub(/\].*/,"",lab)
@ -107,7 +107,7 @@ function lab_index(lab)
# end user code # end user code
{ {
a[lines++] = $0 a[lines++] = $0
} }
function beginfile(f) function beginfile(f)
@ -123,8 +123,8 @@ function endfile(f)
print a[i] > f print a[i] > f
} }
close(f) close(f)
} }
' $@ ' $@

View File

@ -45,7 +45,7 @@ static void sig_handler(int s){
fprintf(errfp, "xinit(): problems creating emergency save dir\n"); fprintf(errfp, "xinit(): problems creating emergency save dir\n");
tcleval("exit 1"); tcleval("exit 1");
} }
if(rename(xctx->undo_dirname, emergency_dir)) { if(rename(xctx->undo_dirname, emergency_dir)) {
fprintf(errfp, "rename dir %s to %s failed\n", xctx->undo_dirname, emergency_dir); fprintf(errfp, "rename dir %s to %s failed\n", xctx->undo_dirname, emergency_dir);
} }
@ -101,7 +101,7 @@ int main(int argc, char **argv)
setvbuf(stdout, NULL, _IOLBF, 0); /* set to line buffer mode */ setvbuf(stdout, NULL, _IOLBF, 0); /* set to line buffer mode */
if(statbuf.st_mode & S_IFIFO) stdin_is_a_fifo = 1; /* input coming from a command pipe */ if(statbuf.st_mode & S_IFIFO) stdin_is_a_fifo = 1; /* input coming from a command pipe */
} }
if(!stdin_is_a_fifo && getpgrp() != tcgetpgrp(STDOUT_FILENO) && !cli_opt_no_readline) { if(!stdin_is_a_fifo && getpgrp() != tcgetpgrp(STDOUT_FILENO) && !cli_opt_no_readline) {
cli_opt_detach = 1; cli_opt_detach = 1;
} }

View File

@ -6,7 +6,7 @@
# Warning: # Warning:
# can be used on vhdl entities that have std_logic/std_logic_vector # can be used on vhdl entities that have std_logic/std_logic_vector
# pins, any other types not recognized # pins, any other types not recognized
# Also, types and ranges must NOT be referenced in packages or # Also, types and ranges must NOT be referenced in packages or
# as constants/variables, if this is the case use the design_analyzer # as constants/variables, if this is the case use the design_analyzer
# "EDIF save as" facility # "EDIF save as" facility
# #

View File

@ -24,7 +24,7 @@ END { endfile(_filename_) }
#----------------------------------------------------- #-----------------------------------------------------
function beginfile(fname) function beginfile(fname)
{ {
ip=0; op=0; i=0 ip=0; op=0; i=0
delete pin delete pin
@ -34,36 +34,36 @@ function beginfile(fname)
} }
{ {
gsub(/</,"[",$0) gsub(/</,"[",$0)
gsub(/>/,"]",$0) gsub(/>/,"]",$0)
} }
/ inputOutput *$/{ / inputOutput *$/{
op++; op++;
i++ i++
pin[i] = $1 pin[i] = $1
dir[i] = "B" dir[i] = "B"
} }
/ output *$/{ / output *$/{
op++; op++;
i++ i++
pin[i] = $1 pin[i] = $1
dir[i] = "O" dir[i] = "O"
} }
/ input *$/{ / input *$/{
ip++; ip++;
i++ i++
pin[i] = $1 pin[i] = $1
dir[i] = "I" dir[i] = "I"
} }
function endfile(fname) function endfile(fname)
{ {
sub(/\/pin\/text\.txt/,"",fname) sub(/\/pin\/text\.txt/,"",fname)
sub(/.*\//,"",fname) sub(/.*\//,"",fname)
fname = fname ".sch" fname = fname ".sch"
dir["n"] = pin["n"] = i dir["n"] = pin["n"] = i
compact_pinlist(pin,dir) compact_pinlist(pin,dir)
@ -129,24 +129,24 @@ function compact_pinlist(pin, dir ,i,ii,base,curr,curr_n,np)
delete pin_ret delete pin_ret
delete net_ret delete net_ret
delete dir_ret delete dir_ret
np=pin["n"] np=pin["n"]
if(np) { if(np) {
ii=1 ii=1
for(i=1;i<=np;i++) { for(i=1;i<=np;i++) {
base =lab_name( pin[i] ) base =lab_name( pin[i] )
if(i==1) {curr=base; curr_n=i} if(i==1) {curr=base; curr_n=i}
else { else {
if(base != curr) { if(base != curr) {
pin_ret[ii] = compact_label(pin,curr_n,i-1) pin_ret[ii] = compact_label(pin,curr_n,i-1)
dir_ret[ii] = dir[i-1] dir_ret[ii] = dir[i-1]
ii++ ii++
curr=base;curr_n=i curr=base;curr_n=i
} }
} }
} }
pin_ret[ii] = compact_label(pin,curr_n,np) pin_ret[ii] = compact_label(pin,curr_n,np)
dir_ret[ii] = dir[np] dir_ret[ii] = dir[np]
pin_ret["n"] = dir_ret["n"] = ii pin_ret["n"] = dir_ret["n"] = ii
} }
} }
@ -165,10 +165,10 @@ function compact_label(ar,a,b, ret,start,i)
else {ret = ret ar[i-1] ","; start=i } else {ret = ret ar[i-1] ","; start=i }
} }
} }
else if(lab_name(ar[i])!=lab_name(ar[i-1]) || else if(lab_name(ar[i])!=lab_name(ar[i-1]) ||
( lab_index(ar[i]) != lab_index(ar[i-1])-1 && ( lab_index(ar[i]) != lab_index(ar[i-1])-1 &&
lab_index(ar[i]) != lab_index(ar[i-1])+1) ) { lab_index(ar[i]) != lab_index(ar[i-1])+1) ) {
if(start<i-1) if(start<i-1)
ret = ret lab_name(ar[start]) "[" lab_index(ar[start]) ":" lab_index(ar[i-1]) "]," ret = ret lab_name(ar[start]) "[" lab_index(ar[start]) ":" lab_index(ar[i-1]) "],"
else else
ret = ret lab_name(ar[start]) "[" lab_index(ar[start]) "]," ret = ret lab_name(ar[start]) "[" lab_index(ar[start]) "],"
@ -180,7 +180,7 @@ function compact_label(ar,a,b, ret,start,i)
if(start < b) ret = ret (b-start+1) "*" ar[b] if(start < b) ret = ret (b-start+1) "*" ar[b]
else ret = ret ar[b] else ret = ret ar[b]
} }
else if(start<b) else if(start<b)
ret = ret lab_name(ar[start]) "[" lab_index(ar[start]) ":" lab_index(ar[b]) "]" ret = ret lab_name(ar[start]) "[" lab_index(ar[start]) ":" lab_index(ar[b]) "]"
else else
ret = ret lab_name(ar[b]) "[" lab_index(ar[b]) "]" ret = ret lab_name(ar[b]) "[" lab_index(ar[b]) "]"

View File

@ -1,22 +1,22 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
# #
# File: make_sch_from_spice.awk # File: make_sch_from_spice.awk
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers # Copyright (C) 1998-2024 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -39,8 +39,8 @@ BEGIN{
while ( "ls $HOME/.xschem/xschem_library/xschem_sky130/sky130_stdcells/*.sym"|getline sym ) while ( "ls $HOME/.xschem/xschem_library/xschem_sky130/sky130_stdcells/*.sym"|getline sym )
{ {
insert_symbol(sym, "sky130_stdcells") insert_symbol(sym, "sky130_stdcells")
} }
# while ( "ls $HOME/share/xschem/xschem_library/devices/*.sym"|getline sym ) # while ( "ls $HOME/share/xschem/xschem_library/devices/*.sym"|getline sym )
# { # {
@ -55,7 +55,7 @@ BEGIN{
inherited_pin["VPWR"]=1 inherited_pin["VPWR"]=1
inherited_pin["VNB"]=1 inherited_pin["VNB"]=1
inherited_pin["VPB"]=1 inherited_pin["VPB"]=1
skip_symbol_prefix= "sky130_fd_sc_hd__" skip_symbol_prefix= "sky130_fd_sc_hd__"
# sym_type = "subcircuit" # sym_type = "subcircuit"
sym_type = "primitive" # do not use schematics although they will be generated sym_type = "primitive" # do not use schematics although they will be generated
@ -82,19 +82,19 @@ BEGIN{
########################## END JOIN ########################## ########################## END JOIN ##########################
skip=0 skip=0
for(i=0;i<netlist_lines; i++) { for(i=0;i<netlist_lines; i++) {
$0=netlist[i] $0=netlist[i]
process_subckts() process_subckts()
} }
skip=0 skip=0
for(i=0;i<netlist_lines; i++) { for(i=0;i<netlist_lines; i++) {
$0=netlist[i] $0=netlist[i]
process() process()
} }
} }
function translate(cellname) function translate(cellname)
{ {
if (cellname=="nmos") return "enbsim3" if (cellname=="nmos") return "enbsim3"
else if(cellname=="pmos") return "epbsim3" else if(cellname=="pmos") return "epbsim3"
@ -136,7 +136,7 @@ function insert_symbol(sym, lib, n,cellname, name, dir, tmp)
function process_subckts( j, i,name) function process_subckts( j, i,name)
{ {
if(skip==1 && toupper($1) ==".ENDS") { skip=0; return } if(skip==1 && toupper($1) ==".ENDS") { skip=0; return }
if(skip==1) return if(skip==1) return
if(toupper($1) ==".SUBCKT") { if(toupper($1) ==".SUBCKT") {
curr_subckt=$2 curr_subckt=$2
@ -155,7 +155,7 @@ function process_subckts( j, i,name)
pin_ar[curr_subckt,"format"]=pin_ar[curr_subckt,"format"] " @@" $i pin_ar[curr_subckt,"format"]=pin_ar[curr_subckt,"format"] " @@" $i
j++ j++
} else { } else {
if(pin_ar[curr_subckt,"extra"]) if(pin_ar[curr_subckt,"extra"])
pin_ar[curr_subckt,"extra"] = pin_ar[curr_subckt,"extra"] " " $i pin_ar[curr_subckt,"extra"] = pin_ar[curr_subckt,"extra"] " " $i
else else
pin_ar[curr_subckt,"extra"] = $i pin_ar[curr_subckt,"extra"] = $i
@ -167,10 +167,10 @@ function process_subckts( j, i,name)
pin_ar[curr_subckt,"n"]=j-1 pin_ar[curr_subckt,"n"]=j-1
if(skip_symbol_prefix) if(skip_symbol_prefix)
pin_ar[curr_subckt,"template"] = pin_ar[curr_subckt,"template"] " prefix=" skip_symbol_prefix pin_ar[curr_subckt,"template"] = pin_ar[curr_subckt,"template"] " prefix=" skip_symbol_prefix
get_template(template) get_template(template)
if(skip_symbol_prefix) if(skip_symbol_prefix)
pin_ar[curr_subckt,"extra"] = pin_ar[curr_subckt,"extra"] " prefix" pin_ar[curr_subckt,"extra"] = pin_ar[curr_subckt,"extra"] " prefix"
print "\n\n\n process_subckt() : " curr_subckt "--> " print "\n\n\n process_subckt() : " curr_subckt "--> "
for(i=1; i<= pin_ar[curr_subckt,"n"]; i++) printf "%s ", pin_ar[curr_subckt,i]; printf "\n" for(i=1; i<= pin_ar[curr_subckt,"n"]; i++) printf "%s ", pin_ar[curr_subckt,i]; printf "\n"
} }
else if($1 ~ /^\*\.PININFO/) { else if($1 ~ /^\*\.PININFO/) {
@ -179,27 +179,27 @@ function process_subckts( j, i,name)
if($i ~ /:I$/ ) pin_ar[curr_subckt, "dir", name] = "I" if($i ~ /:I$/ ) pin_ar[curr_subckt, "dir", name] = "I"
else if($i ~ /:O$/ ) pin_ar[curr_subckt, "dir", name] = "O" else if($i ~ /:O$/ ) pin_ar[curr_subckt, "dir", name] = "O"
else if($i ~ /:B$/ ) pin_ar[curr_subckt, "dir", name] = "B" else if($i ~ /:B$/ ) pin_ar[curr_subckt, "dir", name] = "B"
else { print "ERROR in .PININFO: ", $i " --> " $0 ; exit} else { print "ERROR in .PININFO: ", $i " --> " $0 ; exit}
} }
} }
else if(toupper($1) ~ /^\*\.(I|O|IO)PIN/) { else if(toupper($1) ~ /^\*\.(I|O|IO)PIN/) {
if($1 ~ /^\*\.ipin/) { pin_ar[curr_subckt, "dir", $2] = "I" } if($1 ~ /^\*\.ipin/) { pin_ar[curr_subckt, "dir", $2] = "I" }
else if($1 ~ /^\*\.opin/) { pin_ar[curr_subckt, "dir", $2] = "O" } else if($1 ~ /^\*\.opin/) { pin_ar[curr_subckt, "dir", $2] = "O" }
else if($1 ~ /^\*\.iopin/) { pin_ar[curr_subckt, "dir", $2] = "B" } else if($1 ~ /^\*\.iopin/) { pin_ar[curr_subckt, "dir", $2] = "B" }
} }
} }
function get_template(t, templ, i) function get_template(t, templ, i)
{ {
templ="" templ=""
if(t) for(i=t;i<=NF;i++) { if(t) for(i=t;i<=NF;i++) {
templ = templ $i " " templ = templ $i " "
} }
pin_ar[curr_subckt,"template"] = pin_ar[curr_subckt,"template"] " " templ pin_ar[curr_subckt,"template"] = pin_ar[curr_subckt,"template"] " " templ
} }
function process( i,name,param) function process( i,name,param)
{ {
print "process(): skip = " skip " --> " $0 print "process(): skip = " skip " --> " $0
@ -223,7 +223,7 @@ function process( i,name,param)
sp=ip=op=n_pin=0 sp=ip=op=n_pin=0
all_signals="" all_signals=""
delete net_ar delete net_ar
subckt_netlist = "" # 20111009 all netlist lines except component instances (X) subckt_netlist = "" # 20111009 all netlist lines except component instances (X)
} }
else if(toupper($1) ~ /^.ENDS/) { else if(toupper($1) ~ /^.ENDS/) {
@ -231,12 +231,12 @@ function process( i,name,param)
compact_pinlist( "" , curr_subckt) compact_pinlist( "" , curr_subckt)
print "----------------------------------------------------------" print "----------------------------------------------------------"
for(i=1;i<= dir_ret["n"] ; i++) { for(i=1;i<= dir_ret["n"] ; i++) {
print dir_ret[i] " " pin_ret[i] print dir_ret[i] " " pin_ret[i]
} }
print "\n\n" print "\n\n"
print_sch(curr_subckt, dir_ret, pin_ret) print_sch(curr_subckt, dir_ret, pin_ret)
print_sym(curr_subckt, pin_ar[curr_subckt,"template"], \ print_sym(curr_subckt, pin_ar[curr_subckt,"template"], \
pin_ar[curr_subckt,"format"], pin_ar[curr_subckt,"name"], \ pin_ar[curr_subckt,"format"], pin_ar[curr_subckt,"name"], \
@ -303,7 +303,7 @@ function process( i,name,param)
#print " dir_ret " i " ------> " dir_ret[i] " " pin_ret[i] " <-- " net_ret[i] #print " dir_ret " i " ------> " dir_ret[i] " " pin_ret[i] " <-- " net_ret[i]
} }
#print "\n\n" #print "\n\n"
param = get_param(param) param = get_param(param)
print_signals( inst, inst_sub, param, pin_ret, dir_ret, net_ret ) print_signals( inst, inst_sub, param, pin_ret, dir_ret, net_ret )
} }
else { # other components, M, R, C, D, .... 20111009 else { # other components, M, R, C, D, .... 20111009
@ -327,7 +327,7 @@ function compact_pinlist(inst,inst_sub , prevgroup, group,i,ii,
delete pin_ret delete pin_ret
delete net_ret delete net_ret
delete dir_ret delete dir_ret
np=pin_ar[inst_sub,"n"] np=pin_ar[inst_sub,"n"]
# print " compact_pinlist: inst=" inst " np= " np " inst_sub=" inst_sub # print " compact_pinlist: inst=" inst " np= " np " inst_sub=" inst_sub
if(np) { if(np) {
@ -340,7 +340,7 @@ function compact_pinlist(inst,inst_sub , prevgroup, group,i,ii,
base =lab_name( pin_ar[inst_sub,i] ) base =lab_name( pin_ar[inst_sub,i] )
if(i==1) {prevgroup=group; curr=base; curr_n=i} if(i==1) {prevgroup=group; curr=base; curr_n=i}
else { else {
if(prevgroup || base != curr) { if(prevgroup || base != curr) {
if(prevgroup) pin_ret[ii] = pin_ar[inst_sub,i-1] if(prevgroup) pin_ret[ii] = pin_ar[inst_sub,i-1]
else pin_ret[ii] = compact_label(inst_sub,pin_ar,curr_n,i-1) else pin_ret[ii] = compact_label(inst_sub,pin_ar,curr_n,i-1)
@ -407,7 +407,7 @@ function compact_label_str(str, a, b, ar, ret,start,i)
} }
else if( lab_index(ar[start])!=lab_index(ar[i]) && # range count != element count else if( lab_index(ar[start])!=lab_index(ar[i]) && # range count != element count
abs(start-i)!=abs(lab_index(ar[start])-lab_index(ar[i]))) { abs(start-i)!=abs(lab_index(ar[start])-lab_index(ar[i]))) {
if(start<i-1 && lab_index(ar[start]) == lab_index(ar[i-1]) ) if(start<i-1 && lab_index(ar[start]) == lab_index(ar[i-1]) )
ret = ret (i-start) "*" ar[i-1] ","; ret = ret (i-start) "*" ar[i-1] ",";
else if(start<i-1) else if(start<i-1)
@ -463,14 +463,14 @@ function compact_label(name, ar,a,b, ret,start,i)
else if(lab_name(ar[name,i])!=lab_name(ar[name,i-1])) { else if(lab_name(ar[name,i])!=lab_name(ar[name,i-1])) {
if(start<i-1 && lab_index(ar[name,start]) == lab_index(ar[name,i-1]) ) if(start<i-1 && lab_index(ar[name,start]) == lab_index(ar[name,i-1]) )
ret = ret (i-start) "*" ar[name,i-1] ","; ret = ret (i-start) "*" ar[name,i-1] ",";
else if(start<i-1) else if(start<i-1)
ret = ret lab_name(ar[name,start]) "[" lab_index(ar[name,start]) ":" lab_index(ar[name,i-1]) "]," ret = ret lab_name(ar[name,start]) "[" lab_index(ar[name,start]) ":" lab_index(ar[name,i-1]) "],"
else else
ret = ret lab_name(ar[name,start]) "[" lab_index(ar[name,start]) "]," ret = ret lab_name(ar[name,start]) "[" lab_index(ar[name,start]) "],"
start=i start=i
} }
else if(lab_index(ar[name,i]) != lab_index(ar[name,i-1])-1 && else if(lab_index(ar[name,i]) != lab_index(ar[name,i-1])-1 &&
lab_index(ar[name,i]) != lab_index(ar[name,i-1])+1 ) { lab_index(ar[name,i]) != lab_index(ar[name,i-1])+1 ) {
if(start<i-1 && lab_index(ar[name,start]) == lab_index(ar[name,i-1]) ) if(start<i-1 && lab_index(ar[name,start]) == lab_index(ar[name,i-1]) )
ret = ret (i-start) "*" ar[name,i-1] ","; ret = ret (i-start) "*" ar[name,i-1] ",";
else if(start<i-1) else if(start<i-1)
@ -495,9 +495,9 @@ function compact_label(name, ar,a,b, ret,start,i)
if(start < b) ret = ret (b-start+1) "*" ar[name,b] if(start < b) ret = ret (b-start+1) "*" ar[name,b]
else ret = ret ar[name,b] else ret = ret ar[name,b]
} }
else if(start<b && lab_index(ar[name,start]) == lab_index(ar[name,b])) else if(start<b && lab_index(ar[name,start]) == lab_index(ar[name,b]))
ret = ret (b-start+1) "*" ar[name,b] ret = ret (b-start+1) "*" ar[name,b]
else if(start<b) else if(start<b)
ret = ret lab_name(ar[name,start]) "[" lab_index(ar[name,start]) ":" lab_index(ar[name,b]) "]" ret = ret lab_name(ar[name,start]) "[" lab_index(ar[name,start]) ":" lab_index(ar[name,b]) "]"
else else
ret = ret lab_name(ar[name,b]) "[" lab_index(ar[name,b]) "]" ret = ret lab_name(ar[name,b]) "[" lab_index(ar[name,b]) "]"
@ -537,11 +537,11 @@ function print_sch(schname, dir, pin,
else if(dir[i]=="O" || dir[i]=="B") op++ else if(dir[i]=="O" || dir[i]=="B") op++
else {print "ERROR: print_sch(): undefined dir[i], i=",i, "schname=", schname, "pin[i]=", pin[i]; exit} else {print "ERROR: print_sch(): undefined dir[i], i=",i, "schname=", schname, "pin[i]=", pin[i]; exit}
} }
y=0 y=0
x=-40 x=-40
sch_x_offset=230 sch_x_offset=230
for(i=1;i<=n_pin;i++) for(i=1;i<=n_pin;i++)
{ {
pin_dir=dir[i] pin_dir=dir[i]
@ -580,12 +580,12 @@ function print_signals( inst_name, component_name, param, pin,dir,net,
n_pin=pin["n"] n_pin=pin["n"]
n_net=net["n"] n_net=net["n"]
n_dir=dir["n"] n_dir=dir["n"]
print " print_signals() : component_name = ", component_name print " print_signals() : component_name = ", component_name
if(n_dir != n_pin) { print " n_dir vs n_pin mismatch: inst / comp = " inst_name " / " component_name ; exit } if(n_dir != n_pin) { print " n_dir vs n_pin mismatch: inst / comp = " inst_name " / " component_name ; exit }
if(n_net != n_pin) { print " n_net vs n_pin mismatch: inst / comp = " inst_name " / " component_name ; exit } if(n_net != n_pin) { print " n_net vs n_pin mismatch: inst / comp = " inst_name " / " component_name ; exit }
ip=op=0 ip=op=0
for(i=1; i<=n_net; i++) { for(i=1; i<=n_net; i++) {
if(dir[i] ~ /[OB]/) { if(dir[i] ~ /[OB]/) {
op++ op++
@ -604,7 +604,7 @@ function print_signals( inst_name, component_name, param, pin,dir,net,
{ {
yoffset=prev_size=0 yoffset=prev_size=0
xoffset+=920 xoffset+=920
} }
yoffset += ((prev_size+n)/2+1)*space yoffset += ((prev_size+n)/2+1)*space
inum =onum=0 inum =onum=0
@ -614,44 +614,44 @@ function print_signals( inst_name, component_name, param, pin,dir,net,
idx=(component_name SUBSEP pin[i]) idx=(component_name SUBSEP pin[i])
if( idx in pin_x) if( idx in pin_x)
{ {
#print "print_signals() : " idx " found in library" #print "print_signals() : " idx " found in library"
xpin=xoffset+pin_x[idx] xpin=xoffset+pin_x[idx]
ypin=yoffset+pin_y[idx] ypin=yoffset+pin_y[idx]
} }
else else
{ {
#print "print_signals() : " idx " NOT found in library" #print "print_signals() : " idx " NOT found in library"
if(curr_dir=="O" || curr_dir=="B") { if(curr_dir=="O" || curr_dir=="B") {
xpin=-x+xoffset xpin=-x+xoffset
ypin=y+onum*space+yoffset ypin=y+onum*space+yoffset
onum++ onum++
} }
else { else {
xpin=x+xoffset xpin=x+xoffset
ypin=y+inum*space+yoffset ypin=y+inum*space+yoffset
inum++ inum++
} }
} }
if(curr_dir=="I") if(curr_dir=="I")
{ {
all_signals = all_signals "C {" devices_prefix "lab_pin.sym} " xpin " " ypin " 0 0 " \ all_signals = all_signals "C {" devices_prefix "lab_pin.sym} " xpin " " ypin " 0 0 " \
" {name=p" p_pin++ " lab=" net[i] " " " {name=p" p_pin++ " lab=" net[i] " "
all_signals = all_signals "}\n" all_signals = all_signals "}\n"
} }
if(curr_dir=="O") if(curr_dir=="O")
{ {
all_signals = all_signals "C {" devices_prefix "lab_pin.sym} " xpin " " ypin " 0 1 " \ all_signals = all_signals "C {" devices_prefix "lab_pin.sym} " xpin " " ypin " 0 1 " \
" {name=p" p_pin++ " lab=" net[i] " " " {name=p" p_pin++ " lab=" net[i] " "
all_signals = all_signals "}\n" all_signals = all_signals "}\n"
} }
if(curr_dir=="B") if(curr_dir=="B")
{ {
all_signals = all_signals "C {" devices_prefix "lab_pin.sym} " xpin " " ypin " 0 1 " \ all_signals = all_signals "C {" devices_prefix "lab_pin.sym} " xpin " " ypin " 0 1 " \
" {name=p" p_pin++ " lab=" net[i] " " " {name=p" p_pin++ " lab=" net[i] " "
all_signals = all_signals "}\n" all_signals = all_signals "}\n"
} }
} }
@ -667,7 +667,7 @@ function print_signals( inst_name, component_name, param, pin,dir,net,
prev_size=n prev_size=n
if( idx in pin_x) prev_size+=8 if( idx in pin_x) prev_size+=8
} }
@ -676,7 +676,7 @@ function print_signals( inst_name, component_name, param, pin,dir,net,
function print_sym(sym, template, format, subckt_name, sym_type, extra, dir, pin, function print_sym(sym, template, format, subckt_name, sym_type, extra, dir, pin,
size,space,width,lwidth,textdist,labsize,titlesize, size,space,width,lwidth,textdist,labsize,titlesize,
i,name,text_voffset,lab_voffset,ip,op,n_pin ,m,x,y,n, i,name,text_voffset,lab_voffset,ip,op,n_pin ,m,x,y,n,
iii,ooo) iii,ooo)
{ {
size=2.5 size=2.5
space=20 space=20
@ -706,9 +706,9 @@ function print_sym(sym, template, format, subckt_name, sym_type, extra, dir, pin
iii = format_translate(template, extra) iii = format_translate(template, extra)
if(iii) iii = " " iii if(iii) iii = " " iii
# since awk strings use backslash escapes and sub also uses backslash escapes (example for \& substitution) # since awk strings use backslash escapes and sub also uses backslash escapes (example for \& substitution)
# there are 2 levels of escape substitutions, we need \\\\ to generate one \. # there are 2 levels of escape substitutions, we need \\\\ to generate one \.
# in the xschem file \\\\ is reduced to \\ in the format string and finally format contains one \ # in the xschem file \\\\ is reduced to \\ in the format string and finally format contains one \
if(skip_symbol_prefix) sub(skip_symbol_prefix, "@prefix\\\\\\\\\\\\\\\\", subckt_name) if(skip_symbol_prefix) sub(skip_symbol_prefix, "@prefix\\\\\\\\\\\\\\\\", subckt_name)
print "format=\"@name" format " " subckt_name iii "\"" > sym print "format=\"@name" format " " subckt_name iii "\"" > sym
print "template=\"name=x1" template "\"" > sym print "template=\"name=x1" template "\"" > sym
@ -717,18 +717,18 @@ function print_sym(sym, template, format, subckt_name, sym_type, extra, dir, pin
# titlesize, titlesize, "{}" >sym # titlesize, titlesize, "{}" >sym
print "T {@symname}" ,0, -text_voffset*titlesize,0,0, print "T {@symname}" ,0, -text_voffset*titlesize,0,0,
titlesize, titlesize, "{hcenter=true}" >sym titlesize, titlesize, "{hcenter=true}" >sym
n_pin=pin["n"] n_pin=pin["n"]
ip=op=0 ip=op=0
for(i=1; i<=n_pin; i++) { for(i=1; i<=n_pin; i++) {
if(dir[i] ~ /[OB]/) { if(dir[i] ~ /[OB]/) {
op++ op++
} }
else if(dir[i] ~ /I/) ip++ else if(dir[i] ~ /I/) ip++
else {print "ERROR: print_sym(): undefined dir[] i=" i " inst=" inst " sub=" component_name ; exit} else {print "ERROR: print_sym(): undefined dir[] i=" i " inst=" inst " sub=" component_name ; exit}
} }
n=ip;if(op>n) n=op n=ip;if(op>n) n=op
@ -776,7 +776,7 @@ function print_sym(sym, template, format, subckt_name, sym_type, extra, dir, pin
} }
close(sym) close(sym)
} }
#------------------------------ #------------------------------
@ -787,12 +787,12 @@ function escape_brackets(s , ss)
return ss return ss
} }
function abs(a) function abs(a)
{ {
return a>0 ? a: -a return a>0 ? a: -a
} }
function format_translate(s, extra, n_extra, extra_arr, extra_hash, c,quote,str,n,i,ss,sss) function format_translate(s, extra, n_extra, extra_arr, extra_hash, c,quote,str,n,i,ss,sss)
{ {
# 20140321 # 20140321
@ -810,19 +810,19 @@ function format_translate(s, extra, n_extra, extra_arr, extra_hash, c
str="" str=""
n_extra = split(extra, extra_arr) n_extra = split(extra, extra_arr)
for(i = 1; i <= n_extra; i++) extra_hash[ extra_arr[i] ] = 1 for(i = 1; i <= n_extra; i++) extra_hash[ extra_arr[i] ] = 1
n=split(s,ss) n=split(s,ss)
for(i=1;i<=n;i++) { for(i=1;i<=n;i++) {
gsub(SUBSEP," ", ss[i]) gsub(SUBSEP," ", ss[i])
print "subckt params: " ss[i] print "subckt params: " ss[i]
if(ss[i] ~ /[^=]+=[^=]+/) { if(ss[i] ~ /[^=]+=[^=]+/) {
split(ss[i],sss,"=") split(ss[i],sss,"=")
if(!(sss[1] in extra_hash)) ss[i] = sss[1] "=@" sss[1] if(!(sss[1] in extra_hash)) ss[i] = sss[1] "=@" sss[1]
else ss[i] = "" else ss[i] = ""
} }
str = str ss[i] str = str ss[i]
if(i<n && ss[i] ) str=str " " if(i<n && ss[i] ) str=str " "
} }
delete extra_hash delete extra_hash
return str return str

View File

@ -133,7 +133,7 @@ BEGIN{
} }
(package_body>0 || package_decl) { next } (package_body>0 || package_decl) { next }
@ -188,7 +188,7 @@ BEGIN{
gsub(/[ \t]+/,"",index_high) gsub(/[ \t]+/,"",index_high)
} }
else else
{ {
index_high=index_low=0 index_high=index_low=0
} }
@ -200,7 +200,7 @@ BEGIN{
# A_READ(21) => ADD_READ2_N(21), # A_READ(21) => ADD_READ2_N(21),
# where A_READ is a component pin declared as: # where A_READ is a component pin declared as:
# A_READ : IN std_logic_vector(21 TO 22); # A_READ : IN std_logic_vector(21 TO 22);
# #
# then in the schematic the assignment will look like: # then in the schematic the assignment will look like:
# #
# | # |
@ -223,17 +223,17 @@ BEGIN{
if(is_bus) pin_label=pin_label "[" index_high ":" index_low "]" if(is_bus) pin_label=pin_label "[" index_high ":" index_low "]"
if($0 ~ /:=/) if($0 ~ /:=/)
{ {
value=$0 value=$0
sub(/^.*:= */,"", value) #15122003 added spaces after := sub(/^.*:= */,"", value) #15122003 added spaces after :=
sub(/;/,"", value) sub(/;/,"", value)
gsub(/"/,"\\\\\"", value) gsub(/"/,"\\\\\"", value)
value= "\"" value "\"" value= "\"" value "\""
} }
type=$3 type=$3
if(type=="in") if(type=="in")
{ {
type="ipin" type="ipin"
type_pin[n_pin]=sig_type type_pin[n_pin]=sig_type
@ -284,8 +284,8 @@ BEGIN{
if(sig_type ~ /[ \t]+/) sig_type="\"" sig_type "\"" if(sig_type ~ /[ \t]+/) sig_type="\"" sig_type "\""
pin_label=$1 pin_label=$1
if($0 ~ /:=/) if($0 ~ /:=/)
{ {
value=$0 value=$0
sub(/^.*:= */,"", value) #15122003 spaces after := added sub(/^.*:= */,"", value) #15122003 spaces after := added
sub(/;/,"", value) sub(/;/,"", value)
@ -306,11 +306,11 @@ BEGIN{
# end component # end component
( $1=="end" && $2 ~ "component" && !package_decl){ ( $1=="end" && $2 ~ "component" && !package_decl){
end_component=1 end_component=1
if(!(toupper(name) in cell)) if(!(toupper(name) in cell))
{ {
#print ">>>>> end component: " name #print ">>>>> end component: " name
print "G {}" > schname print "G {}" > schname
print_sch(schname,type_pin, dir_pin, value_pin, class_pin, num_pin, opin, ipin,spin, print_sch(schname,type_pin, dir_pin, value_pin, class_pin, num_pin, opin, ipin,spin,
n_pin, ip, op, sp) n_pin, ip, op, sp)
close(schname) close(schname)
@ -448,8 +448,8 @@ inline_function==1{
#print "port assignment: " component_hi[component_name,formal_basename], component_low[component_name,formal_basename] #print "port assignment: " component_hi[component_name,formal_basename], component_low[component_name,formal_basename]
# #
# This piece of code deals with single bit assignments on # This piece of code deals with single bit assignments on
# vector ports, so we group the single bits in a unique node label, # vector ports, so we group the single bits in a unique node label,
# preserving the right order # preserving the right order
# #
if(doing_slice && prev_formal_basename!=formal_basename) if(doing_slice && prev_formal_basename!=formal_basename)
{ {
@ -457,16 +457,16 @@ inline_function==1{
} }
if(formal_index ~ /^[0-9]+$/ && component_pins[component_name,formal_basename]>1) if(formal_index ~ /^[0-9]+$/ && component_pins[component_name,formal_basename]>1)
{ {
#print "port assignment: slice port assign: " pin_label, "formal_index=" formal_index #print "port assignment: slice port assign: " pin_label, "formal_index=" formal_index
prev_formal_basename=formal_basename prev_formal_basename=formal_basename
doing_slice=1 doing_slice=1
slice_pin_array[formal_index]=pin_label slice_pin_array[formal_index]=pin_label
next next
} }
else if(formal_index ~ /[0-9]+:[0-9]+/ && component_pins[component_name,formal_basename]>1) else if(formal_index ~ /[0-9]+:[0-9]+/ && component_pins[component_name,formal_basename]>1)
{ {
#print "port assignment: slice bus port assign" #print "port assignment: slice bus port assign"
split(formal_index, formal_index_array,":") split(formal_index, formal_index_array,":")
formal_index_array[1]= formal_index_array[1]+0 formal_index_array[1]= formal_index_array[1]+0
formal_index_array[0]= formal_index_array[0]+0 formal_index_array[0]= formal_index_array[0]+0
@ -496,8 +496,8 @@ inline_function==1{
# #
# This piece of code deals with single bit assignments on # This piece of code deals with single bit assignments on
# vector ports, so we group the single bits in a unique node label, # vector ports, so we group the single bits in a unique node label,
# preserving the right order # preserving the right order
# #
function print_slice( c_h,c_l, slice, slice_pin ) function print_slice( c_h,c_l, slice, slice_pin )
{ {
@ -586,9 +586,9 @@ function add_inst_pin(pin_label)
{ {
if($2=="architecture") tmp=$3 # 20071213 handle "end arhitecture name" vs "end name" if($2=="architecture") tmp=$3 # 20071213 handle "end arhitecture name" vs "end name"
else tmp=$2 else tmp=$2
} }
if(tmp==arch_label) if(tmp==arch_label)
{ {
start_code=0 start_code=0
next next
@ -605,12 +605,12 @@ function add_inst_pin(pin_label)
if(doing_slice) if(doing_slice)
{ {
#print " slice port assign 3" #print " slice port assign 3"
print_slice() print_slice()
} }
start_inst=0 start_inst=0
print_signals(inst_name, component_name, i_name_pin, i_type_pin, i_dir_pin, i_value_pin,i_class_pin, i_num_pin, print_signals(inst_name, component_name, i_name_pin, i_type_pin, i_dir_pin, i_value_pin,i_class_pin, i_num_pin,
i_opin, i_ipin,i_n_pin, i_ip, i_op) i_opin, i_ipin,i_n_pin, i_ip, i_op)
} }
@ -679,17 +679,17 @@ function add_inst_pin(pin_label)
} }
pin_label=$1 #toupper pin_label=$1 #toupper
if(is_bus) pin_label=pin_label "[" index_high ":" index_low "]" if(is_bus) pin_label=pin_label "[" index_high ":" index_low "]"
if($0 ~ /:=/) if($0 ~ /:=/)
{ {
value=$0 value=$0
sub(/^.*:= */,"", value) #15122003 spaces after := added sub(/^.*:= */,"", value) #15122003 spaces after := added
sub(/;/,"", value) sub(/;/,"", value)
gsub(/"/,"\\\\\"", value) gsub(/"/,"\\\\\"", value)
value= "\"" value "\"" value= "\"" value "\""
} }
type=$3 type=$3
if(type=="in") if(type=="in")
{ {
type="ipin" type="ipin"
e_type_pin[e_n_pin]=sig_type e_type_pin[e_n_pin]=sig_type
@ -737,8 +737,8 @@ function add_inst_pin(pin_label)
sub(/[ \t]*(:=|;).*$/,"",sig_type) sub(/[ \t]*(:=|;).*$/,"",sig_type)
if(sig_type ~ /[ \t]+/) sig_type="\"" sig_type "\"" if(sig_type ~ /[ \t]+/) sig_type="\"" sig_type "\""
pin_label=$1 pin_label=$1
if($0 ~ /:=/) if($0 ~ /:=/)
{ {
value=$0 value=$0
sub(/^.*:= */,"", value) # 15122003 spaces after := added sub(/^.*:= */,"", value) # 15122003 spaces after := added
sub(/;/,"", value) sub(/;/,"", value)
@ -759,7 +759,7 @@ function add_inst_pin(pin_label)
# end entity # end entity
( $1=="end" && $2 ~ name) || ( $1=="end" && $2=="entity" && $3 ~ name) { # 20071213 handle "end entity name" ( $1=="end" && $2 ~ name) || ( $1=="end" && $2=="entity" && $3 ~ name) { # 20071213 handle "end entity name"
print "end entity: " $0 print "end entity: " $0
end_entity=1 end_entity=1
} }
@ -769,26 +769,26 @@ function add_inst_pin(pin_label)
/^[ \t]*signal[ \t]/,/;/ { /^[ \t]*signal[ \t]/,/;/ {
if(start_arch==1) if(start_arch==1)
{ {
if($1=="signal" || $1=="constant" ) if($1=="signal" || $1=="constant" )
{ {
list="" list=""
class=$1 class=$1
} }
list= list " " $0 " " list= list " " $0 " "
if($0 ~ /;/) if($0 ~ /;/)
{ {
signals = list signals = list
sub(class,"",signals) sub(class,"",signals)
sub(/:.*$/,"",signals) sub(/:.*$/,"",signals)
gsub(/[ \t,]+/, " ", signals) gsub(/[ \t,]+/, " ", signals)
sig_type=list sig_type=list
sub(/[ \t]*:=.*$/,"", sig_type) sub(/[ \t]*:=.*$/,"", sig_type)
sub(/^.*:[ \t]*/,"", sig_type) sub(/^.*:[ \t]*/,"", sig_type)
sub(/[ \t]*;.*$/,"", sig_type) sub(/[ \t]*;.*$/,"", sig_type)
if(list ~ /:=/) if(list ~ /:=/)
{ {
value=list value=list
@ -798,11 +798,11 @@ function add_inst_pin(pin_label)
value= "\"" value "\"" value= "\"" value "\""
} }
n_sig=split(signals,pin_label_array) n_sig=split(signals,pin_label_array)
for(i=1;i<=n_sig;i++) for(i=1;i<=n_sig;i++)
{ {
pin_label=pin_label_array[i] #toupper pin_label=pin_label_array[i] #toupper
#print "encountered signal\n" #print "encountered signal\n"
s_type=sig_type s_type=sig_type
sub(/_vector.*/,"",s_type) sub(/_vector.*/,"",s_type)
@ -821,9 +821,9 @@ function add_inst_pin(pin_label)
gsub(/[ \t]+/,"",index_low) #23122003 remove spaces in indexes gsub(/[ \t]+/,"",index_low) #23122003 remove spaces in indexes
gsub(/[ \t]+/,"",index_high) gsub(/[ \t]+/,"",index_high)
} }
if(is_bus) pin_label=pin_label "[" index_high ":" index_low "]" if(is_bus) pin_label=pin_label "[" index_high ":" index_low "]"
type="signal" type="signal"
e_type_pin[e_n_pin]=s_type e_type_pin[e_n_pin]=s_type
e_class_pin[e_n_pin]=class e_class_pin[e_n_pin]=class
@ -834,23 +834,23 @@ function add_inst_pin(pin_label)
entity_full_name[basename(pin_label)]=pin_label entity_full_name[basename(pin_label)]=pin_label
entity_pin_type[basename(pin_label)]=s_type entity_pin_type[basename(pin_label)]=s_type
} }
} }
} }
} }
END{ END{
for( i in entity_pin_type ) { print i " - " entity_pin_type[i] } for( i in entity_pin_type ) { print i " - " entity_pin_type[i] }
print "G {" code_lines "}" >entname print "G {" code_lines "}" >entname
if(attribute !~/^[ \t]*$/) print "C {devices/attributes} 0 -200 0 0 {" attribute " }" >entname if(attribute !~/^[ \t]*$/) print "C {devices/attributes} 0 -200 0 0 {" attribute " }" >entname
if(port_attribute !~/^[ \t]*$/) print "C {devices/port_attributes} 0 -400 0 0 {" port_attribute " }" >entname if(port_attribute !~/^[ \t]*$/) print "C {devices/port_attributes} 0 -400 0 0 {" port_attribute " }" >entname
if(use !~/^[ \t]*$/) print "C {devices/use} 400 -400 0 0 {" use " }" >entname if(use !~/^[ \t]*$/) print "C {devices/use} 400 -400 0 0 {" use " }" >entname
@ -864,9 +864,9 @@ END{
function vhdl_to_cad(s) function vhdl_to_cad(s)
{ {
sub(/[ \t]*\([ \t]*/,"[",s) sub(/[ \t]*\([ \t]*/,"[",s)
sub(/[ \t]+(to|downto)[ \t]+/,":",s) sub(/[ \t]+(to|downto)[ \t]+/,":",s)
sub(/[ \t]*\)[ \t]*/,"]",s) sub(/[ \t]*\)[ \t]*/,"]",s)
gsub(/[ \t]/,"",s) gsub(/[ \t]/,"",s)
if(s in entity_full_name) s=entity_full_name[s] if(s in entity_full_name) s=entity_full_name[s]
@ -903,7 +903,7 @@ function print_sch(schname,type_pin, dir_pin, value_pin, class_pin, num_pin, opi
y=0 y=0
x=-40 x=-40
sch_x_offset=230 sch_x_offset=230
for(i=0;i<n_pin;i++) for(i=0;i<n_pin;i++)
{ {
dir=dir_pin[i] dir=dir_pin[i]
@ -963,7 +963,7 @@ function print_sch(schname,type_pin, dir_pin, value_pin, class_pin, num_pin, opi
} }
} }
function print_signals(inst_name, component_name, name_pin, type_pin, dir_pin, function print_signals(inst_name, component_name, name_pin, type_pin, dir_pin,
value_pin,class_pin, num_pin, i_opin, i_ipin, n_pin, ip, op, # 20090407 ioin and opin renamed to i_ipin and i_opin value_pin,class_pin, num_pin, i_opin, i_ipin, n_pin, ip, op, # 20090407 ioin and opin renamed to i_ipin and i_opin
n,m,y,x,i,value, num,sig_type,dir) #local vars to avoid clash with component arrays n,m,y,x,i,value, num,sig_type,dir) #local vars to avoid clash with component arrays
{ {
@ -977,11 +977,11 @@ function print_signals(inst_name, component_name, name_pin, type_pin, dir_pin,
{ {
yoffset=prev_size=0 yoffset=prev_size=0
xoffset+=920 xoffset+=920
} }
yoffset += ((prev_size+n)/2+1)*space yoffset += ((prev_size+n)/2+1)*space
for(i=0;i<n_pin;i++) for(i=0;i<n_pin;i++)
{ {
dir=dir_pin[i] dir=dir_pin[i]
@ -1018,7 +1018,7 @@ function print_signals(inst_name, component_name, name_pin, type_pin, dir_pin,
# ypin=y+num*space+yoffset # ypin=y+num*space+yoffset
# /20090407 # /20090407
} }
if(dir=="generic") if(dir=="generic")
{ {
pin_lower=basename(tolower(i_ipin[num])) pin_lower=basename(tolower(i_ipin[num]))
@ -1028,15 +1028,15 @@ function print_signals(inst_name, component_name, name_pin, type_pin, dir_pin,
sig_type = entity_pin_type[pin_lower] sig_type = entity_pin_type[pin_lower]
} }
all_signals = all_signals "C {devices/lab_pin} " xpin " " ypin " 0 0" \ all_signals = all_signals "C {devices/lab_pin} " xpin " " ypin " 0 0" \
" {name=g" g_pin++ " type=" sig_type " lab=" i_ipin[num] " " " {name=g" g_pin++ " type=" sig_type " lab=" i_ipin[num] " "
# if(value !="") all_signals = all_signals "value=" value "}\n" # if(value !="") all_signals = all_signals "value=" value "}\n"
# else all_signals = all_signals "}\n" # else all_signals = all_signals "}\n"
# bug fix: since generics assigned to instances are not declared elsewhere # bug fix: since generics assigned to instances are not declared elsewhere
# use the generic name also for the value property # use the generic name also for the value property
all_signals = all_signals "value=" i_ipin[num] "}\n" # <<< 21042002 all_signals = all_signals "value=" i_ipin[num] "}\n" # <<< 21042002
} }
if(dir=="ipin") if(dir=="ipin")
{ {
pin_lower=basename(tolower(i_ipin[num])) pin_lower=basename(tolower(i_ipin[num]))
@ -1046,11 +1046,11 @@ function print_signals(inst_name, component_name, name_pin, type_pin, dir_pin,
sig_type = entity_pin_type[pin_lower] sig_type = entity_pin_type[pin_lower]
} }
all_signals = all_signals "C {devices/lab_pin} " xpin " " ypin " 0 0 " \ all_signals = all_signals "C {devices/lab_pin} " xpin " " ypin " 0 0 " \
" {name=p" p_pin++ " sig_type=" sig_type " lab=" i_ipin[num] " " " {name=p" p_pin++ " sig_type=" sig_type " lab=" i_ipin[num] " "
if(value !="") all_signals = all_signals "value=" value "}\n" if(value !="") all_signals = all_signals "value=" value "}\n"
else all_signals = all_signals "}\n" else all_signals = all_signals "}\n"
} }
if(dir=="opin") if(dir=="opin")
{ {
pin_lower=basename(tolower(i_opin[num])) pin_lower=basename(tolower(i_opin[num]))
@ -1060,11 +1060,11 @@ function print_signals(inst_name, component_name, name_pin, type_pin, dir_pin,
sig_type = entity_pin_type[pin_lower] sig_type = entity_pin_type[pin_lower]
} }
all_signals = all_signals "C {devices/lab_pin} " xpin " " ypin " 0 1 " \ all_signals = all_signals "C {devices/lab_pin} " xpin " " ypin " 0 1 " \
" {name=p" p_pin++ " sig_type=" sig_type " lab=" i_opin[num] " " " {name=p" p_pin++ " sig_type=" sig_type " lab=" i_opin[num] " "
if(value !="") all_signals = all_signals "value=" value "}\n" if(value !="") all_signals = all_signals "value=" value "}\n"
else all_signals = all_signals "}\n" else all_signals = all_signals "}\n"
} }
if(dir=="iopin") if(dir=="iopin")
{ {
pin_lower=basename(tolower(i_opin[num])) pin_lower=basename(tolower(i_opin[num]))
@ -1074,9 +1074,9 @@ function print_signals(inst_name, component_name, name_pin, type_pin, dir_pin,
sig_type = entity_pin_type[pin_lower] sig_type = entity_pin_type[pin_lower]
} }
all_signals = all_signals "C {devices/lab_pin} " xpin " " ypin " 0 1 " \ all_signals = all_signals "C {devices/lab_pin} " xpin " " ypin " 0 1 " \
" {name=p" p_pin++ " sig_type=" sig_type " lab=" i_opin[num] " " " {name=p" p_pin++ " sig_type=" sig_type " lab=" i_opin[num] " "
if(value !="") all_signals = all_signals "value=" value "}\n" if(value !="") all_signals = all_signals "value=" value "}\n"
else all_signals = all_signals "}\n" else all_signals = all_signals "}\n"
} }
} }
@ -1091,7 +1091,7 @@ function print_signals(inst_name, component_name, name_pin, type_pin, dir_pin,
prev_size=n prev_size=n
if( idx in cell_pin_x) prev_size+=8 if( idx in cell_pin_x) prev_size+=8
} }
function sign(x) function sign(x)
{ {

View File

@ -1,22 +1,22 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
# #
# File: make_sym.awk # File: make_sym.awk
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers # Copyright (C) 1998-2024 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -38,10 +38,10 @@ FNR == 1 {
_filename_ = FILENAME _filename_ = FILENAME
beginfile(FILENAME) beginfile(FILENAME)
} }
END { endfile(_filename_) } END { endfile(_filename_) }
function beginfile(f) function beginfile(f)
{ {
sym=name=f sym=name=f
@ -57,8 +57,8 @@ function beginfile(f)
if(symline ~ /\} *$/) start=0 if(symline ~ /\} *$/) start=0
} }
close(sym) close(sym)
size=2.5 size=2.5
space=20 space=20
lwidth=20 lwidth=20
@ -73,11 +73,11 @@ function beginfile(f)
printf "%s", "K {type=subcircuit\nformat=\"@name @pinlist @symname\"\n" >sym printf "%s", "K {type=subcircuit\nformat=\"@name @pinlist @symname\"\n" >sym
printf "%s\n", "template=\"name=x1\"" >sym printf "%s\n", "template=\"name=x1\"" >sym
printf "%s", "}\n" >sym printf "%s", "}\n" >sym
} }
else print template >sym else print template >sym
print "T {@symname}" ,-length(name_ext)/2*titlesize*30, -text_voffset*titlesize,0,0, print "T {@symname}" ,-length(name_ext)/2*titlesize*30, -text_voffset*titlesize,0,0,
titlesize, titlesize, "{}" >sym titlesize, titlesize, "{}" >sym
} }
@ -165,7 +165,7 @@ function process_line()
pin_label="" pin_label=""
value="" value=""
generic_type="" generic_type=""
if($0 ~ /^.*lab=/) if($0 ~ /^.*lab=/)
{ {
pin_label=$0 pin_label=$0
@ -180,14 +180,14 @@ function process_line()
sub(/[}].*$/,"",verilog_type) sub(/[}].*$/,"",verilog_type)
sub(/ $/,"",verilog_type) sub(/ $/,"",verilog_type)
} }
if($0 ~ /^.*sig_type=/) if($0 ~ /^.*sig_type=/)
{ {
sig_type=$0 sig_type=$0
sub(/^.*sig_type=/,"",sig_type) sub(/^.*sig_type=/,"",sig_type)
sub(/[ }].*$/,"",sig_type) sub(/[ }].*$/,"",sig_type)
} }
if($0 ~ /^.*generic_type=/) if($0 ~ /^.*generic_type=/)
{ {
generic_type=$0 generic_type=$0
@ -200,7 +200,7 @@ function process_line()
if($0 ~ /^.*value=/) if($0 ~ /^.*value=/)
{ {
value=$0 value=$0
if(value ~ /value="/) if(value ~ /value="/)
{ {
sub(/^.*value="/,"",value) sub(/^.*value="/,"",value)
value= "\"" substr(value,1, match(value, /[^\\]"/) ) "\"" value= "\"" substr(value,1, match(value, /[^\\]"/) ) "\""
@ -250,7 +250,7 @@ function endfile(f) {
for(ii=0;ii<n_pin;ii++) for(ii=0;ii<n_pin;ii++)
{ {
i = index_pin[ii] # 20140519 i = index_pin[ii] # 20140519
dir=dir_pin[i] dir=dir_pin[i]
value=value_pin[i] value=value_pin[i]
@ -361,4 +361,4 @@ function comp(a,b)
return a<b return a<b
} }

View File

@ -1,22 +1,22 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
# #
# File: make_sym_from_spice.awk # File: make_sym_from_spice.awk
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers # Copyright (C) 1998-2024 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -56,12 +56,12 @@ BEGIN{
########################## END JOIN ########################## ########################## END JOIN ##########################
skip=0 skip=0
for(i=0;i<netlist_lines; i++) { for(i=0;i<netlist_lines; i++) {
$0=netlist[i] $0=netlist[i]
process_subckts() process_subckts()
} }
skip=0 skip=0
for(i=0;i<netlist_lines; i++) { for(i=0;i<netlist_lines; i++) {
$0=netlist[i] $0=netlist[i]
process() process()
} }
@ -70,7 +70,7 @@ BEGIN{
function process_subckts( j, i,name) function process_subckts( j, i,name)
{ {
if(skip==1 && toupper($1) ==".ENDS") { skip=0; return } if(skip==1 && toupper($1) ==".ENDS") { skip=0; return }
if(skip==1) return if(skip==1) return
if(toupper($1) ==".SUBCKT") { if(toupper($1) ==".SUBCKT") {
curr_subckt=$2 curr_subckt=$2
@ -88,7 +88,7 @@ function process_subckts( j, i,name)
pin_ar[curr_subckt,"format"]=pin_ar[curr_subckt,"format"] " @@" $i pin_ar[curr_subckt,"format"]=pin_ar[curr_subckt,"format"] " @@" $i
j++ j++
} else { } else {
if(pin_ar[curr_subckt,"extra"]) if(pin_ar[curr_subckt,"extra"])
pin_ar[curr_subckt,"extra"] = pin_ar[curr_subckt,"extra"] " " $i pin_ar[curr_subckt,"extra"] = pin_ar[curr_subckt,"extra"] " " $i
else else
pin_ar[curr_subckt,"extra"] = $i pin_ar[curr_subckt,"extra"] = $i
@ -100,7 +100,7 @@ function process_subckts( j, i,name)
pin_ar[curr_subckt,"n"]=j-1 pin_ar[curr_subckt,"n"]=j-1
if(skip_symbol_prefix) if(skip_symbol_prefix)
pin_ar[curr_subckt,"template"] = pin_ar[curr_subckt,"template"] " prefix=" skip_symbol_prefix pin_ar[curr_subckt,"template"] = pin_ar[curr_subckt,"template"] " prefix=" skip_symbol_prefix
get_template(template) get_template(template)
if(skip_symbol_prefix) if(skip_symbol_prefix)
pin_ar[curr_subckt,"extra"] = pin_ar[curr_subckt,"extra"] " prefix" pin_ar[curr_subckt,"extra"] = pin_ar[curr_subckt,"extra"] " prefix"
} }
@ -110,27 +110,27 @@ function process_subckts( j, i,name)
if($i ~ /:I$/ ) pin_ar[curr_subckt, "dir", name] = "I" if($i ~ /:I$/ ) pin_ar[curr_subckt, "dir", name] = "I"
else if($i ~ /:O$/ ) pin_ar[curr_subckt, "dir", name] = "O" else if($i ~ /:O$/ ) pin_ar[curr_subckt, "dir", name] = "O"
else if($i ~ /:B$/ ) pin_ar[curr_subckt, "dir", name] = "B" else if($i ~ /:B$/ ) pin_ar[curr_subckt, "dir", name] = "B"
else { print "ERROR in .PININFO: ", $i " --> " $0 ; exit} else { print "ERROR in .PININFO: ", $i " --> " $0 ; exit}
} }
} }
else if(toupper($1) ~ /^\*\.(I|O|IO)PIN/) { else if(toupper($1) ~ /^\*\.(I|O|IO)PIN/) {
if($1 ~ /^\*\.ipin/) { pin_ar[curr_subckt, "dir", $2] = "I" } if($1 ~ /^\*\.ipin/) { pin_ar[curr_subckt, "dir", $2] = "I" }
else if($1 ~ /^\*\.opin/) { pin_ar[curr_subckt, "dir", $2] = "O" } else if($1 ~ /^\*\.opin/) { pin_ar[curr_subckt, "dir", $2] = "O" }
else if($1 ~ /^\*\.iopin/) { pin_ar[curr_subckt, "dir", $2] = "B" } else if($1 ~ /^\*\.iopin/) { pin_ar[curr_subckt, "dir", $2] = "B" }
} }
} }
function get_template(t, templ, i) function get_template(t, templ, i)
{ {
templ="" templ=""
if(t) for(i=t;i<=NF;i++) { if(t) for(i=t;i<=NF;i++) {
templ = templ $i " " templ = templ $i " "
} }
pin_ar[curr_subckt,"template"] = pin_ar[curr_subckt,"template"] " " templ pin_ar[curr_subckt,"template"] = pin_ar[curr_subckt,"template"] " " templ
} }
function process( i,name,param) function process( i,name,param)
{ {
if(skip==1 && toupper($1) ==".ENDS") { skip=0; return } if(skip==1 && toupper($1) ==".ENDS") { skip=0; return }
@ -153,14 +153,14 @@ function process( i,name,param)
sp=ip=op=n_pin=0 sp=ip=op=n_pin=0
all_signals="" all_signals=""
delete net_ar delete net_ar
subckt_netlist = "" # 20111009 all netlist lines except component instances (X) subckt_netlist = "" # 20111009 all netlist lines except component instances (X)
} }
else if(toupper($1) ~ /^.ENDS/) { else if(toupper($1) ~ /^.ENDS/) {
compact_pinlist( "" , curr_subckt) compact_pinlist( "" , curr_subckt)
print_sym(curr_subckt, pin_ar[curr_subckt,"template"], \ print_sym(curr_subckt, pin_ar[curr_subckt,"template"], \
pin_ar[curr_subckt,"format"], pin_ar[curr_subckt,"name"], \ pin_ar[curr_subckt,"format"], pin_ar[curr_subckt,"name"], \
sym_type, pin_ar[curr_subckt,"extra"], dir_ret, pin_ret) sym_type, pin_ar[curr_subckt,"extra"], dir_ret, pin_ret)
@ -181,7 +181,7 @@ function compact_pinlist(inst,inst_sub , prevgroup, group,i,ii,
delete pin_ret delete pin_ret
delete net_ret delete net_ret
delete dir_ret delete dir_ret
np=pin_ar[inst_sub,"n"] np=pin_ar[inst_sub,"n"]
# print " compact_pinlist: inst=" inst " np= " np " inst_sub=" inst_sub # print " compact_pinlist: inst=" inst " np= " np " inst_sub=" inst_sub
if(np) { if(np) {
@ -194,7 +194,7 @@ function compact_pinlist(inst,inst_sub , prevgroup, group,i,ii,
base =lab_name( pin_ar[inst_sub,i] ) base =lab_name( pin_ar[inst_sub,i] )
if(i==1) {prevgroup=group; curr=base; curr_n=i} if(i==1) {prevgroup=group; curr=base; curr_n=i}
else { else {
if(prevgroup || base != curr) { if(prevgroup || base != curr) {
if(prevgroup) pin_ret[ii] = pin_ar[inst_sub,i-1] if(prevgroup) pin_ret[ii] = pin_ar[inst_sub,i-1]
else pin_ret[ii] = compact_label(inst_sub,pin_ar,curr_n,i-1) else pin_ret[ii] = compact_label(inst_sub,pin_ar,curr_n,i-1)
@ -261,7 +261,7 @@ function compact_label_str(str, a, b, ar, ret,start,i)
} }
else if( lab_index(ar[start])!=lab_index(ar[i]) && # range count != element count else if( lab_index(ar[start])!=lab_index(ar[i]) && # range count != element count
abs(start-i)!=abs(lab_index(ar[start])-lab_index(ar[i]))) { abs(start-i)!=abs(lab_index(ar[start])-lab_index(ar[i]))) {
if(start<i-1 && lab_index(ar[start]) == lab_index(ar[i-1]) ) if(start<i-1 && lab_index(ar[start]) == lab_index(ar[i-1]) )
ret = ret (i-start) "*" ar[i-1] ","; ret = ret (i-start) "*" ar[i-1] ",";
else if(start<i-1) else if(start<i-1)
@ -317,14 +317,14 @@ function compact_label(name, ar,a,b, ret,start,i)
else if(lab_name(ar[name,i])!=lab_name(ar[name,i-1])) { else if(lab_name(ar[name,i])!=lab_name(ar[name,i-1])) {
if(start<i-1 && lab_index(ar[name,start]) == lab_index(ar[name,i-1]) ) if(start<i-1 && lab_index(ar[name,start]) == lab_index(ar[name,i-1]) )
ret = ret (i-start) "*" ar[name,i-1] ","; ret = ret (i-start) "*" ar[name,i-1] ",";
else if(start<i-1) else if(start<i-1)
ret = ret lab_name(ar[name,start]) "[" lab_index(ar[name,start]) ":" lab_index(ar[name,i-1]) "]," ret = ret lab_name(ar[name,start]) "[" lab_index(ar[name,start]) ":" lab_index(ar[name,i-1]) "],"
else else
ret = ret lab_name(ar[name,start]) "[" lab_index(ar[name,start]) "]," ret = ret lab_name(ar[name,start]) "[" lab_index(ar[name,start]) "],"
start=i start=i
} }
else if(lab_index(ar[name,i]) != lab_index(ar[name,i-1])-1 && else if(lab_index(ar[name,i]) != lab_index(ar[name,i-1])-1 &&
lab_index(ar[name,i]) != lab_index(ar[name,i-1])+1 ) { lab_index(ar[name,i]) != lab_index(ar[name,i-1])+1 ) {
if(start<i-1 && lab_index(ar[name,start]) == lab_index(ar[name,i-1]) ) if(start<i-1 && lab_index(ar[name,start]) == lab_index(ar[name,i-1]) )
ret = ret (i-start) "*" ar[name,i-1] ","; ret = ret (i-start) "*" ar[name,i-1] ",";
else if(start<i-1) else if(start<i-1)
@ -349,9 +349,9 @@ function compact_label(name, ar,a,b, ret,start,i)
if(start < b) ret = ret (b-start+1) "*" ar[name,b] if(start < b) ret = ret (b-start+1) "*" ar[name,b]
else ret = ret ar[name,b] else ret = ret ar[name,b]
} }
else if(start<b && lab_index(ar[name,start]) == lab_index(ar[name,b])) else if(start<b && lab_index(ar[name,start]) == lab_index(ar[name,b]))
ret = ret (b-start+1) "*" ar[name,b] ret = ret (b-start+1) "*" ar[name,b]
else if(start<b) else if(start<b)
ret = ret lab_name(ar[name,start]) "[" lab_index(ar[name,start]) ":" lab_index(ar[name,b]) "]" ret = ret lab_name(ar[name,start]) "[" lab_index(ar[name,start]) ":" lab_index(ar[name,b]) "]"
else else
ret = ret lab_name(ar[name,b]) "[" lab_index(ar[name,b]) "]" ret = ret lab_name(ar[name,b]) "[" lab_index(ar[name,b]) "]"
@ -377,7 +377,7 @@ function lab_index(lab)
function print_sym(sym, template, format, subckt_name, sym_type, extra, dir, pin, function print_sym(sym, template, format, subckt_name, sym_type, extra, dir, pin,
size,space,width,lwidth,textdist,labsize,titlesize, size,space,width,lwidth,textdist,labsize,titlesize,
i,name,text_voffset,lab_voffset,ip,op,n_pin ,m,x,y,n, i,name,text_voffset,lab_voffset,ip,op,n_pin ,m,x,y,n,
iii,ooo) iii,ooo)
{ {
size=2.5 size=2.5
space=20 space=20
@ -407,9 +407,9 @@ function print_sym(sym, template, format, subckt_name, sym_type, extra, dir, pin
iii = format_translate(template, extra) iii = format_translate(template, extra)
if(iii) iii = " " iii if(iii) iii = " " iii
# since awk strings use backslash escapes and sub also uses backslash escapes (example for \& substitution) # since awk strings use backslash escapes and sub also uses backslash escapes (example for \& substitution)
# there are 2 levels of escape substitutions, we need \\\\ to generate one \. # there are 2 levels of escape substitutions, we need \\\\ to generate one \.
# in the xschem file \\\\ is reduced to \\ in the format string and finally format contains one \ # in the xschem file \\\\ is reduced to \\ in the format string and finally format contains one \
if(skip_symbol_prefix) sub(skip_symbol_prefix, "@prefix\\\\\\\\\\\\\\\\", subckt_name) if(skip_symbol_prefix) sub(skip_symbol_prefix, "@prefix\\\\\\\\\\\\\\\\", subckt_name)
print "format=\"@name" format " " subckt_name iii "\"" > sym print "format=\"@name" format " " subckt_name iii "\"" > sym
print "template=\"name=x1" template "\"" > sym print "template=\"name=x1" template "\"" > sym
@ -418,16 +418,16 @@ function print_sym(sym, template, format, subckt_name, sym_type, extra, dir, pin
# titlesize, titlesize, "{}" >sym # titlesize, titlesize, "{}" >sym
print "T {@symname}" ,0, -text_voffset*titlesize,0,0, print "T {@symname}" ,0, -text_voffset*titlesize,0,0,
titlesize, titlesize, "{hcenter=true}" >sym titlesize, titlesize, "{hcenter=true}" >sym
n_pin=pin["n"] n_pin=pin["n"]
ip=op=0 ip=op=0
for(i=1; i<=n_pin; i++) { for(i=1; i<=n_pin; i++) {
if(dir[i] ~ /[OB]/) { if(dir[i] ~ /[OB]/) {
op++ op++
} }
else if(dir[i] ~ /I/) ip++ else if(dir[i] ~ /I/) ip++
else {print "ERROR: print_sym(): undefined dir[] i=" i " inst=" inst " sub=" component_name ; exit} else {print "ERROR: print_sym(): undefined dir[] i=" i " inst=" inst " sub=" component_name ; exit}
} }
n=ip;if(op>n) n=op n=ip;if(op>n) n=op
if(n==0) n=1 if(n==0) n=1
@ -474,7 +474,7 @@ function print_sym(sym, template, format, subckt_name, sym_type, extra, dir, pin
} }
close(sym) close(sym)
} }
#------------------------------ #------------------------------
@ -485,12 +485,12 @@ function escape_brackets(s , ss)
return ss return ss
} }
function abs(a) function abs(a)
{ {
return a>0 ? a: -a return a>0 ? a: -a
} }
function format_translate(s, extra, n_extra, extra_arr, extra_hash, c,quote,str,n,i,ss,sss) function format_translate(s, extra, n_extra, extra_arr, extra_hash, c,quote,str,n,i,ss,sss)
{ {
# 20140321 # 20140321
@ -508,18 +508,18 @@ function format_translate(s, extra, n_extra, extra_arr, extra_hash, c
str="" str=""
n_extra = split(extra, extra_arr) n_extra = split(extra, extra_arr)
for(i = 1; i <= n_extra; i++) extra_hash[ extra_arr[i] ] = 1 for(i = 1; i <= n_extra; i++) extra_hash[ extra_arr[i] ] = 1
n=split(s,ss) n=split(s,ss)
for(i=1;i<=n;i++) { for(i=1;i<=n;i++) {
gsub(SUBSEP," ", ss[i]) gsub(SUBSEP," ", ss[i])
if(ss[i] ~ /[^=]+=[^=]+/) { if(ss[i] ~ /[^=]+=[^=]+/) {
split(ss[i],sss,"=") split(ss[i],sss,"=")
if(!(sss[1] in extra_hash)) ss[i] = sss[1] "=@" sss[1] if(!(sss[1] in extra_hash)) ss[i] = sss[1] "=@" sss[1]
else ss[i] = "" else ss[i] = ""
} }
str = str ss[i] str = str ss[i]
if(i<n && ss[i] ) str=str " " if(i<n && ss[i] ) str=str " "
} }
delete extra_hash delete extra_hash
return str return str

View File

@ -2,7 +2,7 @@
gawk ' gawk '
BEGIN{ BEGIN{
# ar["a", 1] = "A[3]" # ar["a", 1] = "A[3]"
# ar["a", 2] = "A[3]" # ar["a", 2] = "A[3]"
# ar["a", 3] = "A[3]" # ar["a", 3] = "A[3]"
@ -49,13 +49,13 @@ BEGIN{
########################## END JOIN ########################## ########################## END JOIN ##########################
skip=0 skip=0
for(i=0;i<netlist_lines; i++) { for(i=0;i<netlist_lines; i++) {
$0=netlist[i] $0=netlist[i]
process_subckts() process_subckts()
} }
skip=0 skip=0
for(i=0;i<netlist_lines; i++) { for(i=0;i<netlist_lines; i++) {
$0=netlist[i] $0=netlist[i]
process() process()
} }
@ -66,7 +66,7 @@ BEGIN{
function process_subckts( i,name) function process_subckts( i,name)
{ {
if(skip==1 && toupper($1) ==".ENDS") { skip=0; return } if(skip==1 && toupper($1) ==".ENDS") { skip=0; return }
if(skip==1) return if(skip==1) return
if(toupper($1) ==".SUBCKT") { if(toupper($1) ==".SUBCKT") {
curr_subckt=$2 curr_subckt=$2
@ -79,8 +79,8 @@ function process_subckts( i,name)
pin_ar[curr_subckt,i-2]=$i pin_ar[curr_subckt,i-2]=$i
} }
pin_ar[curr_subckt,"n"]=i-3 pin_ar[curr_subckt,"n"]=i-3
pin_ar[curr_subckt,"template"] = get_template(template) pin_ar[curr_subckt,"template"] = get_template(template)
print "\n\n\n process_subckt() : " curr_subckt "--> " print "\n\n\n process_subckt() : " curr_subckt "--> "
for(i=1; i<= pin_ar[curr_subckt,"n"]; i++) printf "%s ", pin_ar[curr_subckt,i]; printf "\n" for(i=1; i<= pin_ar[curr_subckt,"n"]; i++) printf "%s ", pin_ar[curr_subckt,i]; printf "\n"
} }
else if(toupper($1) ~ /^\*\.PININFO/) { else if(toupper($1) ~ /^\*\.PININFO/) {
@ -89,27 +89,27 @@ function process_subckts( i,name)
if($i ~ /:I$/ ) pin_ar[curr_subckt, "dir", name] = "I" if($i ~ /:I$/ ) pin_ar[curr_subckt, "dir", name] = "I"
else if($i ~ /:O$/ ) pin_ar[curr_subckt, "dir", name] = "O" else if($i ~ /:O$/ ) pin_ar[curr_subckt, "dir", name] = "O"
else if($i ~ /:B$/ ) pin_ar[curr_subckt, "dir", name] = "B" else if($i ~ /:B$/ ) pin_ar[curr_subckt, "dir", name] = "B"
else { print "ERROR" ; exit} else { print "ERROR" ; exit}
} }
} }
else if(toupper($1) ~ /^\*\.(I|O|IO)PIN/) { else if(toupper($1) ~ /^\*\.(I|O|IO)PIN/) {
if($1 ~ /^\*\.ipin/) { pin_ar[curr_subckt, "dir", $2] = "I" } if($1 ~ /^\*\.ipin/) { pin_ar[curr_subckt, "dir", $2] = "I" }
else if($1 ~ /^\*\.opin/) { pin_ar[curr_subckt, "dir", $2] = "O" } else if($1 ~ /^\*\.opin/) { pin_ar[curr_subckt, "dir", $2] = "O" }
else if($1 ~ /^\*\.iopin/) { pin_ar[curr_subckt, "dir", $2] = "B" } else if($1 ~ /^\*\.iopin/) { pin_ar[curr_subckt, "dir", $2] = "B" }
} }
} }
function get_template(t, templ, i) function get_template(t, templ, i)
{ {
templ="" templ=""
if(t) for(i=t;i<=NF;i++) { if(t) for(i=t;i<=NF;i++) {
templ = templ $i " " templ = templ $i " "
} }
return templ return templ
} }
function process( i,name,param) function process( i,name,param)
{ {
print "process(): skip = " skip " --> " $0 print "process(): skip = " skip " --> " $0
@ -128,12 +128,12 @@ function process( i,name,param)
compact_pinlist( "" , curr_subckt) compact_pinlist( "" , curr_subckt)
print "----------------------------------------------------------" print "----------------------------------------------------------"
for(i=1;i<= dir_ret["n"] ; i++) { for(i=1;i<= dir_ret["n"] ; i++) {
print dir_ret[i] " " pin_ret[i] print dir_ret[i] " " pin_ret[i]
} }
print "\n\n" print "\n\n"
print_sch(curr_subckt, dir_ret, pin_ret) print_sch(curr_subckt, dir_ret, pin_ret)
print "----------------------------------------------------------" print "----------------------------------------------------------"
@ -178,7 +178,7 @@ function process( i,name,param)
print " dir_ret " i " ------> " dir_ret[i] " " pin_ret[i] " <-- " net_ret[i] print " dir_ret " i " ------> " dir_ret[i] " " pin_ret[i] " <-- " net_ret[i]
} }
print "\n\n" print "\n\n"
param = get_param(param) param = get_param(param)
print_signals( inst, inst_sub, param, pin_ret, dir_ret, net_ret ) print_signals( inst, inst_sub, param, pin_ret, dir_ret, net_ret )
} }
} }
@ -197,7 +197,7 @@ function compact_pinlist(inst,inst_sub ,i,ii,base,curr,curr_n,n
delete pin_ret delete pin_ret
delete net_ret delete net_ret
delete dir_ret delete dir_ret
np=pin_ar[inst_sub,"n"] np=pin_ar[inst_sub,"n"]
print " compact_pinlist: np= " np print " compact_pinlist: np= " np
if(np) { if(np) {
@ -205,7 +205,7 @@ function compact_pinlist(inst,inst_sub ,i,ii,base,curr,curr_n,n
for(i=1;i<=np;i++) { for(i=1;i<=np;i++) {
base =lab_name( pin_ar[inst_sub,i] ) base =lab_name( pin_ar[inst_sub,i] )
if(i==1) {curr=base; curr_n=i} if(i==1) {curr=base; curr_n=i}
else { else {
if(base != curr) { if(base != curr) {
pin_ret[ii] = compact_label(inst_sub,pin_ar,curr_n,i-1) pin_ret[ii] = compact_label(inst_sub,pin_ar,curr_n,i-1)
if(inst) net_ret[ii] = compact_label(inst,net_ar,curr_n,i-1) if(inst) net_ret[ii] = compact_label(inst,net_ar,curr_n,i-1)
@ -252,7 +252,7 @@ function compact_label(name, ar,a,b, ret,start,i)
lab_index(ar[name,i]) != lab_index(ar[name,start]) ) ) { lab_index(ar[name,i]) != lab_index(ar[name,start]) ) ) {
if(start<i-1 && lab_index(ar[name,start]) == lab_index(ar[name,i-1]) ) if(start<i-1 && lab_index(ar[name,start]) == lab_index(ar[name,i-1]) )
ret = ret (i-start) "*" ar[name,i-1] ","; ret = ret (i-start) "*" ar[name,i-1] ",";
else if(start<i-1) else if(start<i-1)
ret = ret lab_name(ar[name,start]) "[" lab_index(ar[name,start]) ":" lab_index(ar[name,i-1]) "]," ret = ret lab_name(ar[name,start]) "[" lab_index(ar[name,start]) ":" lab_index(ar[name,i-1]) "],"
else else
ret = ret lab_name(ar[name,start]) "[" lab_index(ar[name,start]) "]," ret = ret lab_name(ar[name,start]) "[" lab_index(ar[name,start]) "],"
@ -264,9 +264,9 @@ function compact_label(name, ar,a,b, ret,start,i)
if(start < b) ret = ret (b-start+1) "*" ar[name,b] if(start < b) ret = ret (b-start+1) "*" ar[name,b]
else ret = ret ar[name,b] else ret = ret ar[name,b]
} }
else if(start<b && lab_index(ar[name,start]) == lab_index(ar[name,b])) else if(start<b && lab_index(ar[name,start]) == lab_index(ar[name,b]))
ret = ret (b-start+1) "*" ar[name,b] ret = ret (b-start+1) "*" ar[name,b]
else if(start<b) else if(start<b)
ret = ret lab_name(ar[name,start]) "[" lab_index(ar[name,start]) ":" lab_index(ar[name,b]) "]" ret = ret lab_name(ar[name,start]) "[" lab_index(ar[name,start]) ":" lab_index(ar[name,b]) "]"
else else
ret = ret lab_name(ar[name,b]) "[" lab_index(ar[name,b]) "]" ret = ret lab_name(ar[name,b]) "[" lab_index(ar[name,b]) "]"
@ -303,7 +303,7 @@ function print_sch(schname, dir, pin,
else if(dir[i]=="O" || dir[i]=="B") op++ else if(dir[i]=="O" || dir[i]=="B") op++
else {print "ERROR: print_sch(): undefined dir[]"; exit} else {print "ERROR: print_sch(): undefined dir[]"; exit}
} }
for(i=1;i<=n_pin;i++) for(i=1;i<=n_pin;i++)
{ {
pin_dir=dir[i] pin_dir=dir[i]
@ -336,45 +336,45 @@ function print_signals( inst_name, component_name, param, pin,dir,net,
n_pin=pin["n"] n_pin=pin["n"]
n_net=net["n"] n_net=net["n"]
n_dir=dir["n"] n_dir=dir["n"]
print " print_signals() : component_name = ", component_name print " print_signals() : component_name = ", component_name
if(n_dir != n_pin) { print " n_dir vs n_pin mismatch: inst / comp = " inst_name " / " component_name ; exit } if(n_dir != n_pin) { print " n_dir vs n_pin mismatch: inst / comp = " inst_name " / " component_name ; exit }
if(n_net != n_pin) { print " n_net vs n_pin mismatch: inst / comp = " inst_name " / " component_name ; exit } if(n_net != n_pin) { print " n_net vs n_pin mismatch: inst / comp = " inst_name " / " component_name ; exit }
all_signals=all_signals inst_name " : " component_name "\nPORT MAP(\n" all_signals=all_signals inst_name " : " component_name "\nPORT MAP(\n"
for(i=1;i<=n_net;i++) for(i=1;i<=n_net;i++)
{ {
curr_dir=dir[i] curr_dir=dir[i]
all_signals = all_signals " " pin[i] " => " net[i] all_signals = all_signals " " pin[i] " => " net[i]
if(i<n_net) all_signals = all_signals ",\n" if(i<n_net) all_signals = all_signals ",\n"
else all_signals = all_signals "\n" else all_signals = all_signals "\n"
} }
all_signals=all_signals ");\n\n" all_signals=all_signals ");\n\n"
} }
#------------------------------ #------------------------------
function abs(a) function abs(a)
{ {
return a>0 ? a: -a return a>0 ? a: -a
} }
function format_translate(s, str,n,i,ss,sss) function format_translate(s, str,n,i,ss,sss)
{ {
str="" str=""
n=split(s,ss) n=split(s,ss)
for(i=1;i<=n;i++) { for(i=1;i<=n;i++) {
if(ss[i] ~ /.+=.+/) { if(ss[i] ~ /.+=.+/) {
split(ss[i],sss,"=") split(ss[i],sss,"=")
ss[i] = sss[i] "=@" sss[1] ss[i] = sss[i] "=@" sss[1]
} }
str = str ss[i] str = str ss[i]
if(i<n) str=str " " if(i<n) str=str " "
} }
return str return str
} }

View File

@ -107,7 +107,7 @@ proc mouse_buttons { b m } {
} }
} }
# the global variable 'has_x' is provided by xschem. It is defined to '1' # the global variable 'has_x' is provided by xschem. It is defined to '1'
# if graphics has been initialized. # if graphics has been initialized.
if { [ info exists has_x ] } { if { [ info exists has_x ] } {

View File

@ -238,7 +238,7 @@ void draw_selection(GC g, int interruptable)
{ {
case xTEXT: case xTEXT:
if(xctx->rotatelocal) { if(xctx->rotatelocal) {
ROTATION(xctx->move_rot, xctx->move_flip, xctx->text[n].x0, xctx->text[n].y0, ROTATION(xctx->move_rot, xctx->move_flip, xctx->text[n].x0, xctx->text[n].y0,
xctx->text[n].x0, xctx->text[n].y0, xctx->rx1,xctx->ry1); xctx->text[n].x0, xctx->text[n].y0, xctx->rx1,xctx->ry1);
} else { } else {
ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y1, ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y1,
@ -545,7 +545,7 @@ void update_attached_floaters(const char *from_name, int inst, int sel)
new_attach = str_replace(attach, from_name, to_name, 1, 1); new_attach = str_replace(attach, from_name, to_name, 1, 1);
my_strdup(_ALLOC_ID_, &xctx->inst[inst].prop_ptr, my_strdup(_ALLOC_ID_, &xctx->inst[inst].prop_ptr,
subst_token(xctx->inst[inst].prop_ptr, "attach", new_attach) ); subst_token(xctx->inst[inst].prop_ptr, "attach", new_attach) );
for(c = 0; c < cadlayers; c++) { for(c = 0; c < cadlayers; c++) {
for(i = 0; i < xctx->rects[c]; i++) { for(i = 0; i < xctx->rects[c]; i++) {
if(!sel || xctx->rect[c][i].sel == SELECTED) { if(!sel || xctx->rect[c][i].sel == SELECTED) {
@ -564,40 +564,40 @@ void update_attached_floaters(const char *from_name, int inst, int sel)
} }
} }
for(i = 0; i < xctx->lines[c]; i++) { for(i = 0; i < xctx->lines[c]; i++) {
if((!sel || xctx->line[c][i].sel == SELECTED) && if((!sel || xctx->line[c][i].sel == SELECTED) &&
!strcmp(from_name, get_tok_value(xctx->line[c][i].prop_ptr, "name", 0))) { !strcmp(from_name, get_tok_value(xctx->line[c][i].prop_ptr, "name", 0))) {
my_strdup(_ALLOC_ID_, &xctx->line[c][i].prop_ptr, my_strdup(_ALLOC_ID_, &xctx->line[c][i].prop_ptr,
subst_token(xctx->line[c][i].prop_ptr, "name", to_name) ); subst_token(xctx->line[c][i].prop_ptr, "name", to_name) );
} }
} }
for(i = 0; i < xctx->polygons[c]; i++) { for(i = 0; i < xctx->polygons[c]; i++) {
if((!sel || xctx->poly[c][i].sel == SELECTED) && if((!sel || xctx->poly[c][i].sel == SELECTED) &&
!strcmp(from_name, get_tok_value(xctx->poly[c][i].prop_ptr, "name", 0))) { !strcmp(from_name, get_tok_value(xctx->poly[c][i].prop_ptr, "name", 0))) {
my_strdup(_ALLOC_ID_, &xctx->poly[c][i].prop_ptr, my_strdup(_ALLOC_ID_, &xctx->poly[c][i].prop_ptr,
subst_token(xctx->poly[c][i].prop_ptr, "name", to_name) ); subst_token(xctx->poly[c][i].prop_ptr, "name", to_name) );
} }
} }
for(i = 0; i < xctx->arcs[c]; i++) { for(i = 0; i < xctx->arcs[c]; i++) {
if((!sel || xctx->arc[c][i].sel == SELECTED) && if((!sel || xctx->arc[c][i].sel == SELECTED) &&
!strcmp(from_name, get_tok_value(xctx->arc[c][i].prop_ptr, "name", 0))) { !strcmp(from_name, get_tok_value(xctx->arc[c][i].prop_ptr, "name", 0))) {
my_strdup(_ALLOC_ID_, &xctx->arc[c][i].prop_ptr, my_strdup(_ALLOC_ID_, &xctx->arc[c][i].prop_ptr,
subst_token(xctx->arc[c][i].prop_ptr, "name", to_name) ); subst_token(xctx->arc[c][i].prop_ptr, "name", to_name) );
} }
} }
} }
for(i = 0; i < xctx->wires; i++) { for(i = 0; i < xctx->wires; i++) {
if((!sel || xctx->wire[i].sel == SELECTED) && if((!sel || xctx->wire[i].sel == SELECTED) &&
!strcmp(from_name, get_tok_value(xctx->wire[i].prop_ptr, "name", 0))) { !strcmp(from_name, get_tok_value(xctx->wire[i].prop_ptr, "name", 0))) {
my_strdup(_ALLOC_ID_, &xctx->wire[i].prop_ptr, my_strdup(_ALLOC_ID_, &xctx->wire[i].prop_ptr,
subst_token(xctx->wire[i].prop_ptr, "name", to_name) ); subst_token(xctx->wire[i].prop_ptr, "name", to_name) );
} }
} }
for(i = 0; i < xctx->texts; i++) { for(i = 0; i < xctx->texts; i++) {
if((!sel || xctx->text[i].sel == SELECTED) && if((!sel || xctx->text[i].sel == SELECTED) &&
!strcmp(from_name, get_tok_value(xctx->text[i].prop_ptr, "name", 0))) { !strcmp(from_name, get_tok_value(xctx->text[i].prop_ptr, "name", 0))) {
my_strdup(_ALLOC_ID_, &xctx->text[i].prop_ptr, my_strdup(_ALLOC_ID_, &xctx->text[i].prop_ptr,
subst_token(xctx->text[i].prop_ptr, "name", to_name) ); subst_token(xctx->text[i].prop_ptr, "name", to_name) );
set_text_flags(&xctx->text[i]); set_text_flags(&xctx->text[i]);
} }
@ -612,11 +612,11 @@ void copy_objects(int what)
int newpropcnt; int newpropcnt;
double tmpx, tmpy; double tmpx, tmpy;
char *estr = NULL; char *estr = NULL;
#if HAS_CAIRO==1 #if HAS_CAIRO==1
int customfont; int customfont;
#endif #endif
if(what & START) if(what & START)
{ {
xctx->rotatelocal=0; xctx->rotatelocal=0;
@ -684,7 +684,7 @@ void copy_objects(int what)
if(xctx->drag_elements && xctx->deltax==0 && xctx->deltay == 0) { if(xctx->drag_elements && xctx->deltax==0 && xctx->deltay == 0) {
xctx->ui_state &= ~STARTCOPY; xctx->ui_state &= ~STARTCOPY;
return; return;
} }
if( !xctx->kissing ) { if( !xctx->kissing ) {
dbg(1, "copy_objects(): push undo state\n"); dbg(1, "copy_objects(): push undo state\n");
@ -736,11 +736,11 @@ void copy_objects(int what)
xctx->sel_array[i].n=xctx->wires; xctx->sel_array[i].n=xctx->wires;
storeobject(-1, xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2,WIRE,0,xctx->wire[n].sel,xctx->wire[n].prop_ptr); storeobject(-1, xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2,WIRE,0,xctx->wire[n].sel,xctx->wire[n].prop_ptr);
xctx->wire[n].sel=0; xctx->wire[n].sel=0;
l = xctx->wires -1; l = xctx->wires -1;
} }
} }
for(k=0;k<cadlayers; ++k) for(k=0;k<cadlayers; ++k)
{ {
for(i=0;i<xctx->lastsel; ++i) for(i=0;i<xctx->lastsel; ++i)
@ -783,10 +783,10 @@ void copy_objects(int what)
storeobject(-1, xctx->rx1, xctx->ry1, xctx->rx2, xctx->ry2, LINE, c, storeobject(-1, xctx->rx1, xctx->ry1, xctx->rx2, xctx->ry2, LINE, c,
xctx->line[c][n].sel, xctx->line[c][n].prop_ptr); xctx->line[c][n].sel, xctx->line[c][n].prop_ptr);
xctx->line[c][n].sel=0; xctx->line[c][n].sel=0;
l = xctx->lines[c] - 1; l = xctx->lines[c] - 1;
break; break;
case POLYGON: case POLYGON:
if(c!=k) break; if(c!=k) break;
{ {
@ -840,13 +840,13 @@ void copy_objects(int what)
if(angle<0.) angle+=360.; if(angle<0.) angle+=360.;
xctx->arc[c][n].sel=0; xctx->arc[c][n].sel=0;
xctx->sel_array[i].n=xctx->arcs[c]; xctx->sel_array[i].n=xctx->arcs[c];
store_arc(-1, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay, store_arc(-1, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay,
xctx->arc[c][n].r, angle, xctx->arc[c][n].b, c, SELECTED, xctx->arc[c][n].prop_ptr); xctx->arc[c][n].r, angle, xctx->arc[c][n].b, c, SELECTED, xctx->arc[c][n].prop_ptr);
l = xctx->arcs[c] - 1; l = xctx->arcs[c] - 1;
break; break;
case xRECT: case xRECT:
if(c!=k) break; if(c!=k) break;
if(xctx->rotatelocal) { if(xctx->rotatelocal) {
@ -869,7 +869,7 @@ void copy_objects(int what)
l = xctx->rects[c] - 1; l = xctx->rects[c] - 1;
flip_rotate_ellipse(&xctx->rect[c][l], xctx->move_rot, xctx->move_flip); flip_rotate_ellipse(&xctx->rect[c][l], xctx->move_rot, xctx->move_flip);
break; break;
case xTEXT: case xTEXT:
if(k!=TEXTLAYER) break; if(k!=TEXTLAYER) break;
check_text_storage(); check_text_storage();
@ -902,15 +902,15 @@ void copy_objects(int what)
set_text_flags(&xctx->text[xctx->texts]); set_text_flags(&xctx->text[xctx->texts]);
xctx->text[xctx->texts].xscale=xctx->text[n].xscale; xctx->text[xctx->texts].xscale=xctx->text[n].xscale;
xctx->text[xctx->texts].yscale=xctx->text[n].yscale; xctx->text[xctx->texts].yscale=xctx->text[n].yscale;
l = xctx->texts; l = xctx->texts;
#if HAS_CAIRO==1 /* bbox after copy */ #if HAS_CAIRO==1 /* bbox after copy */
customfont = set_text_custom_font(&xctx->text[l]); customfont = set_text_custom_font(&xctx->text[l]);
#endif #endif
estr = my_expand(get_text_floater(l), tclgetintvar("tabstop")); estr = my_expand(get_text_floater(l), tclgetintvar("tabstop"));
text_bbox(estr, xctx->text[l].xscale, text_bbox(estr, xctx->text[l].xscale,
xctx->text[l].yscale, xctx->text[l].rot,xctx->text[l].flip, xctx->text[l].yscale, xctx->text[l].rot,xctx->text[l].flip,
xctx->text[l].hcenter, xctx->text[l].vcenter, xctx->text[l].hcenter, xctx->text[l].vcenter,
xctx->text[l].x0, xctx->text[l].y0, xctx->text[l].x0, xctx->text[l].y0,
&xctx->rx1,&xctx->ry1, &xctx->rx2,&xctx->ry2, &tmpi, &dtmp); &xctx->rx1,&xctx->ry1, &xctx->rx2,&xctx->ry2, &tmpi, &dtmp);
@ -920,7 +920,7 @@ void copy_objects(int what)
cairo_restore(xctx->cairo_ctx); cairo_restore(xctx->cairo_ctx);
} }
#endif #endif
xctx->sel_array[i].n=xctx->texts; xctx->sel_array[i].n=xctx->texts;
xctx->texts++; xctx->texts++;
dbg(2, "copy_objects(): done copy string\n"); dbg(2, "copy_objects(): done copy string\n");
@ -929,10 +929,10 @@ void copy_objects(int what)
break; break;
} /* end switch(xctx->sel_array[i].type) */ } /* end switch(xctx->sel_array[i].type) */
} /* end for(i=0;i<xctx->lastsel; ++i) */ } /* end for(i=0;i<xctx->lastsel; ++i) */
} /* end for(k=0;k<cadlayers; ++k) */ } /* end for(k=0;k<cadlayers; ++k) */
for(i = 0; i < xctx->lastsel; ++i) { for(i = 0; i < xctx->lastsel; ++i) {
n = xctx->sel_array[i].n; n = xctx->sel_array[i].n;
if(xctx->sel_array[i].type == ELEMENT) { if(xctx->sel_array[i].type == ELEMENT) {
@ -963,7 +963,7 @@ void copy_objects(int what)
xctx->inst[xctx->instances].y0 = xctx->ry1+xctx->deltay; xctx->inst[xctx->instances].y0 = xctx->ry1+xctx->deltay;
set_first_sel(ELEMENT, xctx->instances, 0); set_first_sel(ELEMENT, xctx->instances, 0);
xctx->inst[xctx->instances].sel = SELECTED; xctx->inst[xctx->instances].sel = SELECTED;
xctx->inst[xctx->instances].rot = (xctx->inst[xctx->instances].rot + ( (xctx->move_flip && xctx->inst[xctx->instances].rot = (xctx->inst[xctx->instances].rot + ( (xctx->move_flip &&
(xctx->inst[xctx->instances].rot & 1) ) ? xctx->move_rot+2 : xctx->move_rot) ) & 0x3; (xctx->inst[xctx->instances].rot & 1) ) ? xctx->move_rot+2 : xctx->move_rot) ) & 0x3;
xctx->inst[xctx->instances].flip = (xctx->move_flip? !xctx->inst[n].flip:xctx->inst[n].flip); xctx->inst[xctx->instances].flip = (xctx->move_flip? !xctx->inst[n].flip:xctx->inst[n].flip);
my_strdup2(_ALLOC_ID_, &xctx->inst[xctx->instances].instname, xctx->inst[n].instname); my_strdup2(_ALLOC_ID_, &xctx->inst[xctx->instances].instname, xctx->inst[n].instname);
@ -1094,7 +1094,7 @@ static void place_moved_wire(int n, int orthogonal_wiring)
* | * |
* (V)| * (V)|
* (H) selected | * (H) selected |
* o----------------------------------- * o-----------------------------------
* rx1,ry1(new) * rx1,ry1(new)
*/ */
else if(wire[n].sel == SELECTED1 && (xctx->manhattan_lines & 2)) /* V - H */ else if(wire[n].sel == SELECTED1 && (xctx->manhattan_lines & 2)) /* V - H */
@ -1160,7 +1160,7 @@ void move_objects(int what, int merge, double dx, double dy)
#endif #endif
xLine ** const line = xctx->line; xLine ** const line = xctx->line;
xWire * const wire = xctx->wire; xWire * const wire = xctx->wire;
dbg(1, "move_objects: what=%d, dx=%g, dy=%g\n", what, dx, dy); dbg(1, "move_objects: what=%d, dx=%g, dy=%g\n", what, dx, dy);
if(what & START) if(what & START)
{ {
@ -1189,7 +1189,7 @@ void move_objects(int what, int merge, double dx, double dy)
pop_undo(0, 0); pop_undo(0, 0);
if(xctx->connect_by_kissing == 2) xctx->connect_by_kissing = 0; if(xctx->connect_by_kissing == 2) xctx->connect_by_kissing = 0;
} }
xctx->move_rot=xctx->move_flip=0; xctx->move_rot=xctx->move_flip=0;
xctx->deltax=xctx->deltay=0.; xctx->deltax=xctx->deltay=0.;
xctx->ui_state &= ~STARTMOVE; xctx->ui_state &= ~STARTMOVE;
@ -1286,10 +1286,10 @@ void move_objects(int what, int merge, double dx, double dy)
} }
place_moved_wire(n, orthogonal_wiring); place_moved_wire(n, orthogonal_wiring);
} }
break; break;
case LINE: case LINE:
if(c!=k) break; if(c!=k) break;
if(xctx->rotatelocal) { if(xctx->rotatelocal) {
@ -1303,7 +1303,7 @@ void move_objects(int what, int merge, double dx, double dy)
ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y1, ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y1,
line[c][n].x2, line[c][n].y2, xctx->rx2,xctx->ry2); line[c][n].x2, line[c][n].y2, xctx->rx2,xctx->ry2);
} }
if( line[c][n].sel & (SELECTED|SELECTED1) ) if( line[c][n].sel & (SELECTED|SELECTED1) )
{ {
xctx->rx1+=xctx->deltax; xctx->rx1+=xctx->deltax;
@ -1327,7 +1327,7 @@ void move_objects(int what, int merge, double dx, double dy)
line[c][n].x2=xctx->rx2; line[c][n].x2=xctx->rx2;
line[c][n].y2=xctx->ry2; line[c][n].y2=xctx->ry2;
break; break;
case POLYGON: case POLYGON:
if(c!=k) break; if(c!=k) break;
{ {
@ -1342,7 +1342,7 @@ void move_objects(int what, int merge, double dx, double dy)
if(j==0 || p->y[j] < by1) by1 = p->y[j]; if(j==0 || p->y[j] < by1) by1 = p->y[j];
if(j==0 || p->x[j] > bx2) bx2 = p->x[j]; if(j==0 || p->x[j] > bx2) bx2 = p->x[j];
if(j==0 || p->y[j] > by2) by2 = p->y[j]; if(j==0 || p->y[j] > by2) by2 = p->y[j];
if( p->sel==SELECTED || p->selected_point[j]) { if( p->sel==SELECTED || p->selected_point[j]) {
if(xctx->rotatelocal) { if(xctx->rotatelocal) {
ROTATION(xctx->move_rot, xctx->move_flip, savex0, savey0, p->x[j], p->y[j], ROTATION(xctx->move_rot, xctx->move_flip, savex0, savey0, p->x[j], p->y[j],
@ -1351,7 +1351,7 @@ void move_objects(int what, int merge, double dx, double dy)
ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y1, p->x[j], p->y[j], ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y1, p->x[j], p->y[j],
xctx->rx1,xctx->ry1); xctx->rx1,xctx->ry1);
} }
p->x[j] = xctx->rx1+xctx->deltax; p->x[j] = xctx->rx1+xctx->deltax;
p->y[j] = xctx->ry1+xctx->deltay; p->y[j] = xctx->ry1+xctx->deltay;
} }
@ -1364,7 +1364,7 @@ void move_objects(int what, int merge, double dx, double dy)
} }
} }
break; break;
case ARC: case ARC:
if(c!=k) break; if(c!=k) break;
if(xctx->rotatelocal) { if(xctx->rotatelocal) {
@ -1408,7 +1408,7 @@ void move_objects(int what, int merge, double dx, double dy)
} }
break; break;
case xRECT: case xRECT:
if(c!=k) break; if(c!=k) break;
/* bbox before move */ /* bbox before move */
@ -1423,7 +1423,7 @@ void move_objects(int what, int merge, double dx, double dy)
ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y1, ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y1,
xctx->rect[c][n].x2, xctx->rect[c][n].y2, xctx->rx2,xctx->ry2); xctx->rect[c][n].x2, xctx->rect[c][n].y2, xctx->rx2,xctx->ry2);
} }
flip_rotate_ellipse(&xctx->rect[c][n], xctx->move_rot, xctx->move_flip); flip_rotate_ellipse(&xctx->rect[c][n], xctx->move_rot, xctx->move_flip);
if( xctx->rect[c][n].sel == SELECTED) { if( xctx->rect[c][n].sel == SELECTED) {
@ -1464,11 +1464,11 @@ void move_objects(int what, int merge, double dx, double dy)
{ {
xctx->rx2+=xctx->deltax; xctx->rx2+=xctx->deltax;
} }
tx1 = xctx->rx1; tx1 = xctx->rx1;
ty1 = xctx->ry1; ty1 = xctx->ry1;
RECTORDER(xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2); RECTORDER(xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2);
if( xctx->rx2 == tx1) { if( xctx->rx2 == tx1) {
if(xctx->rect[c][n].sel==SELECTED1) xctx->rect[c][n].sel = SELECTED2; if(xctx->rect[c][n].sel==SELECTED1) xctx->rect[c][n].sel = SELECTED2;
else if(xctx->rect[c][n].sel==SELECTED2) xctx->rect[c][n].sel = SELECTED1; else if(xctx->rect[c][n].sel==SELECTED2) xctx->rect[c][n].sel = SELECTED1;
@ -1481,15 +1481,15 @@ void move_objects(int what, int merge, double dx, double dy)
else if(xctx->rect[c][n].sel==SELECTED2) xctx->rect[c][n].sel = SELECTED4; else if(xctx->rect[c][n].sel==SELECTED2) xctx->rect[c][n].sel = SELECTED4;
else if(xctx->rect[c][n].sel==SELECTED4) xctx->rect[c][n].sel = SELECTED2; else if(xctx->rect[c][n].sel==SELECTED4) xctx->rect[c][n].sel = SELECTED2;
} }
xctx->rect[c][n].x1 = xctx->rx1; xctx->rect[c][n].x1 = xctx->rx1;
xctx->rect[c][n].y1 = xctx->ry1; xctx->rect[c][n].y1 = xctx->ry1;
xctx->rect[c][n].x2 = xctx->rx2; xctx->rect[c][n].x2 = xctx->rx2;
xctx->rect[c][n].y2 = xctx->ry2; xctx->rect[c][n].y2 = xctx->ry2;
/* bbox after move */ /* bbox after move */
break; break;
case xTEXT: case xTEXT:
if(k!=TEXTLAYER) break; if(k!=TEXTLAYER) break;
#if HAS_CAIRO==1 /* bbox before move */ #if HAS_CAIRO==1 /* bbox before move */
@ -1518,7 +1518,7 @@ void move_objects(int what, int merge, double dx, double dy)
xctx->text[n].rot=(xctx->text[n].rot + xctx->text[n].rot=(xctx->text[n].rot +
( (xctx->move_flip && (xctx->text[n].rot & 1) ) ? xctx->move_rot+2 : xctx->move_rot) ) & 0x3; ( (xctx->move_flip && (xctx->text[n].rot & 1) ) ? xctx->move_rot+2 : xctx->move_rot) ) & 0x3;
xctx->text[n].flip=xctx->move_flip^xctx->text[n].flip; xctx->text[n].flip=xctx->move_flip^xctx->text[n].flip;
#if HAS_CAIRO==1 /* bbox after move */ #if HAS_CAIRO==1 /* bbox after move */
customfont = set_text_custom_font(&xctx->text[n]); customfont = set_text_custom_font(&xctx->text[n]);
#endif #endif
@ -1533,15 +1533,15 @@ void move_objects(int what, int merge, double dx, double dy)
cairo_restore(xctx->cairo_ctx); cairo_restore(xctx->cairo_ctx);
} }
#endif #endif
break; break;
default: default:
break; break;
} /* end switch(xctx->sel_array[i].type) */ } /* end switch(xctx->sel_array[i].type) */
} /* end for(i=0;i<xctx->lastsel; ++i) */ } /* end for(i=0;i<xctx->lastsel; ++i) */
} /*end for(k=0;k<cadlayers; ++k) */ } /*end for(k=0;k<cadlayers; ++k) */
for(i = 0; i < xctx->lastsel; ++i) { for(i = 0; i < xctx->lastsel; ++i) {
n = xctx->sel_array[i].n; n = xctx->sel_array[i].n;
if(xctx->sel_array[i].type == ELEMENT) { if(xctx->sel_array[i].type == ELEMENT) {
@ -1562,7 +1562,7 @@ void move_objects(int what, int merge, double dx, double dy)
symbol_bbox(n, symbol_bbox(n,
&xctx->inst[n].x1, &xctx->inst[n].y1, &xctx->inst[n].x1, &xctx->inst[n].y1,
&xctx->inst[n].x2, &xctx->inst[n].y2); &xctx->inst[n].x2, &xctx->inst[n].y2);
} }
} }
if(!firsti || !firstw) { if(!firsti || !firstw) {
xctx->prep_net_structs=0; xctx->prep_net_structs=0;
@ -1572,11 +1572,11 @@ void move_objects(int what, int merge, double dx, double dy)
check_collapsing_objects(); check_collapsing_objects();
unselect_partial_sel_wires(); unselect_partial_sel_wires();
if(tclgetboolvar("autotrim_wires")) trim_wires(); if(tclgetboolvar("autotrim_wires")) trim_wires();
if(xctx->hilight_nets) { if(xctx->hilight_nets) {
propagate_hilights(1, 1, XINSERT_NOREPLACE); propagate_hilights(1, 1, XINSERT_NOREPLACE);
} }
xctx->ui_state &= ~STARTMOVE; xctx->ui_state &= ~STARTMOVE;
if(xctx->ui_state & STARTMERGE) xctx->ui_state |= SELECTION; /* leave selection state so objects can be deleted */ if(xctx->ui_state & STARTMERGE) xctx->ui_state |= SELECTION; /* leave selection state so objects can be deleted */
xctx->ui_state &= ~STARTMERGE; xctx->ui_state &= ~STARTMERGE;

View File

@ -163,7 +163,7 @@ void del_object_table(void)
static void objectdelete(int type, int n, int c, int x, int y) static void objectdelete(int type, int n, int c, int x, int y)
{ {
Objectentry *saveptr, **prevptr, *ptr; Objectentry *saveptr, **prevptr, *ptr;
prevptr = &xctx->object_spatial_table[x][y]; prevptr = &xctx->object_spatial_table[x][y];
ptr = *prevptr; ptr = *prevptr;
while(ptr) { while(ptr) {
@ -176,8 +176,8 @@ static void objectdelete(int type, int n, int c, int x, int y)
prevptr = &ptr->next; prevptr = &ptr->next;
ptr = *prevptr; ptr = *prevptr;
} }
} }
static void objectinsert(int type, int n, int c, int x, int y) static void objectinsert(int type, int n, int c, int x, int y)
{ {
Objectentry *ptr, *newptr; Objectentry *ptr, *newptr;
@ -301,7 +301,7 @@ void hash_objects(void) /* 20171203 insert object bbox in spatial hash table */
hash_object(XINSERT, xTEXT, n, 0); hash_object(XINSERT, xTEXT, n, 0);
} }
for(c=0;c<cadlayers; ++c) for(c=0;c<cadlayers; ++c)
{ {
for(n=0; n<xctx->rects[c]; n++) { for(n=0; n<xctx->rects[c]; n++) {
hash_object(XINSERT, xRECT, n, c); hash_object(XINSERT, xRECT, n, c);
} }
@ -563,10 +563,10 @@ void hash_wires(void)
} }
/* return 0 if library path of s matches any lib name in tcl variable $xschem_libs */ /* return 0 if library path of s matches any lib name in tcl variable $xschem_libs */
/* what: /* what:
* 1: netlist exclude pattern * 1: netlist exclude pattern
* 2: hierarchical print exclude pattern * 2: hierarchical print exclude pattern
* 4: hierarchical cell listing exclude pattern * 4: hierarchical cell listing exclude pattern
*/ */
int check_lib(int what, const char *s) int check_lib(int what, const char *s)
{ {
@ -630,7 +630,7 @@ void netlist_options(int i)
/* fprintf(errfp, "netlist_options(): prop_ptr=%s\n", xctx->inst[i].prop_ptr); */ /* fprintf(errfp, "netlist_options(): prop_ptr=%s\n", xctx->inst[i].prop_ptr); */
if(!strboolcmp(str, "true")) tclsetintvar("top_is_subckt", 1); if(!strboolcmp(str, "true")) tclsetintvar("top_is_subckt", 1);
else tclsetintvar("top_is_subckt", 0); else tclsetintvar("top_is_subckt", 0);
} }
str = get_tok_value(xctx->inst[i].prop_ptr, "spiceprefix", 0); str = get_tok_value(xctx->inst[i].prop_ptr, "spiceprefix", 0);
if(str[0]) { if(str[0]) {
@ -701,7 +701,7 @@ static void print_wires(void)
* 4: add ground entry (it is also a global). for Spectre * 4: add ground entry (it is also a global). for Spectre
* 2: delete list only, no print * 2: delete list only, no print
* 3: look if node is a global * 3: look if node is a global
* return value: * return value:
* 1: global * 1: global
* 2: ground (and global) * 2: ground (and global)
*/ */
@ -903,7 +903,7 @@ static int signal_short( const char *tag, const char *n1, const char *n2)
/* if pin or label has missing lab=... attribute get and set from attached nets */ /* if pin or label has missing lab=... attribute get and set from attached nets */
static void set_lab_or_pin_inst_attr(int i, int j, const char *node) static void set_lab_or_pin_inst_attr(int i, int j, const char *node)
{ {
int port = 0; int port = 0;
char *dir=NULL; char *dir=NULL;
@ -968,7 +968,7 @@ static void set_inst_node(int i, int j, const char *node)
set_lab_or_pin_inst_attr(i, j, node); set_lab_or_pin_inst_attr(i, j, node);
if(node[0] == '#') { /* update multilicity of unnamed node */ if(node[0] == '#') { /* update multilicity of unnamed node */
int pin_mult; int pin_mult;
expandlabel(get_tok_value(rect[j].prop_ptr, "name", 0), &pin_mult); expandlabel(get_tok_value(rect[j].prop_ptr, "name", 0), &pin_mult);
get_unnamed_node(2, pin_mult * inst_mult, atoi((inst[i].node[j]) + 4)); get_unnamed_node(2, pin_mult * inst_mult, atoi((inst[i].node[j]) + 4));
} }
@ -992,7 +992,7 @@ static int name_attached_inst_to_net(int k, int sqx, int sqy)
if(!inst[n].node) continue; if(!inst[n].node) continue;
if(touch(wire[k].x1, wire[k].y1, wire[k].x2, wire[k].y2, x0, y0)) { if(touch(wire[k].x1, wire[k].y1, wire[k].x2, wire[k].y2, x0, y0)) {
if(!inst[n].node[p]) { if(!inst[n].node[p]) {
dbg(1, "name_attached_inst_to_net(): inst %s, pin %d <-- %s\n", dbg(1, "name_attached_inst_to_net(): inst %s, pin %d <-- %s\n",
inst[n].instname, p, wire[k].node ? wire[k].node : "<NULL>"); inst[n].instname, p, wire[k].node ? wire[k].node : "<NULL>");
set_inst_node(n, p, wire[k].node); set_inst_node(n, p, wire[k].node);
err |= instcheck(n, p); err |= instcheck(n, p);
@ -1011,7 +1011,7 @@ static int wirecheck(int k) /* recursive routine */
double x1, y1, x2, y2; double x1, y1, x2, y2;
Wireentry *wptr; Wireentry *wptr;
xWire * const wire = xctx->wire; xWire * const wire = xctx->wire;
dbg(1, "wirecheck: %d\n", k); dbg(1, "wirecheck: %d\n", k);
x1 = wire[k].x1; y1 = wire[k].y1; x1 = wire[k].x1; y1 = wire[k].y1;
x2 = wire[k].x2; y2 = wire[k].y2; x2 = wire[k].x2; y2 = wire[k].y2;
@ -1038,8 +1038,8 @@ static int wirecheck(int k) /* recursive routine */
if(n == k) { /* itself */ if(n == k) { /* itself */
err |= name_attached_inst_to_net(k, tmpi, tmpj); err |= name_attached_inst_to_net(k, tmpi, tmpj);
continue; continue;
} }
touches = touches =
touch(wire[k].x1, wire[k].y1, wire[k].x2, wire[k].y2, wire[n].x1, wire[n].y1) || touch(wire[k].x1, wire[k].y1, wire[k].x2, wire[k].y2, wire[n].x1, wire[n].y1) ||
touch(wire[k].x1, wire[k].y1, wire[k].x2, wire[k].y2, wire[n].x2, wire[n].y2) || touch(wire[k].x1, wire[k].y1, wire[k].x2, wire[k].y2, wire[n].x2, wire[n].y2) ||
touch(wire[n].x1, wire[n].y1, wire[n].x2, wire[n].y2, wire[k].x1, wire[k].y1) || touch(wire[n].x1, wire[n].y1, wire[n].x2, wire[n].y2, wire[k].x1, wire[k].y1) ||
@ -1122,7 +1122,7 @@ int shorted_instance(int i, int lvs_ignore)
if((inst[i].flags & SPECTRE_SHORT) || (sym[inst[i].ptr].flags & SPECTRE_SHORT) ) shorted = 1; if((inst[i].flags & SPECTRE_SHORT) || (sym[inst[i].ptr].flags & SPECTRE_SHORT) ) shorted = 1;
} else if(xctx->netlist_type == CAD_VHDL_NETLIST) { } else if(xctx->netlist_type == CAD_VHDL_NETLIST) {
if((inst[i].flags & VHDL_SHORT) || (sym[inst[i].ptr].flags & VHDL_SHORT) ) shorted = 1; if((inst[i].flags & VHDL_SHORT) || (sym[inst[i].ptr].flags & VHDL_SHORT) ) shorted = 1;
} else if(xctx->netlist_type == CAD_TEDAX_NETLIST) } else if(xctx->netlist_type == CAD_TEDAX_NETLIST)
if((inst[i].flags & TEDAX_SHORT) || (sym[inst[i].ptr].flags & TEDAX_SHORT) ) shorted = 1; if((inst[i].flags & TEDAX_SHORT) || (sym[inst[i].ptr].flags & TEDAX_SHORT) ) shorted = 1;
return shorted; return shorted;
@ -1159,8 +1159,8 @@ int skip_instance(int i, int skip_short, int lvs_ignore)
} }
/* what: /* what:
* Determine if given "ninst" instance has pass-through pins * Determine if given "ninst" instance has pass-through pins
* 0: initialize * 0: initialize
* 1: query * 1: query
* 2: cleanup * 2: cleanup
@ -1203,8 +1203,8 @@ static int find_pass_through_symbols(int what, int ninst)
return -1; return -1;
} }
/* /*
* Given an instance pin (inst n, pin p) propagate electrical information through * Given an instance pin (inst n, pin p) propagate electrical information through
* other pins with identical "name" attribute (pass-through symbols) * other pins with identical "name" attribute (pass-through symbols)
*/ */
static int instcheck(int n, int p) static int instcheck(int n, int p)
@ -1222,30 +1222,30 @@ static int instcheck(int n, int p)
if(!inst[n].node) return 0; if(!inst[n].node) return 0;
if( xctx->netlist_type == CAD_VERILOG_NETLIST && if( xctx->netlist_type == CAD_VERILOG_NETLIST &&
((inst[n].flags & VERILOG_IGNORE) || ((inst[n].flags & VERILOG_IGNORE) ||
(k >= 0 && (sym[k].flags & VERILOG_IGNORE))) ) return 0; (k >= 0 && (sym[k].flags & VERILOG_IGNORE))) ) return 0;
if( xctx->netlist_type == CAD_SPECTRE_NETLIST && if( xctx->netlist_type == CAD_SPECTRE_NETLIST &&
((inst[n].flags & SPECTRE_IGNORE) || ((inst[n].flags & SPECTRE_IGNORE) ||
(k >= 0 && (sym[k].flags & SPECTRE_IGNORE))) ) return 0; (k >= 0 && (sym[k].flags & SPECTRE_IGNORE))) ) return 0;
if( xctx->netlist_type == CAD_SPICE_NETLIST && if( xctx->netlist_type == CAD_SPICE_NETLIST &&
((inst[n].flags & SPICE_IGNORE) || ((inst[n].flags & SPICE_IGNORE) ||
(k >= 0 && (sym[k].flags & SPICE_IGNORE))) ) return 0; (k >= 0 && (sym[k].flags & SPICE_IGNORE))) ) return 0;
if( xctx->netlist_type == CAD_VHDL_NETLIST && if( xctx->netlist_type == CAD_VHDL_NETLIST &&
((inst[n].flags & VHDL_IGNORE) || ((inst[n].flags & VHDL_IGNORE) ||
(k >= 0 &&(sym[k].flags & VHDL_IGNORE))) ) return 0; (k >= 0 &&(sym[k].flags & VHDL_IGNORE))) ) return 0;
if( xctx->netlist_type == CAD_TEDAX_NETLIST && if( xctx->netlist_type == CAD_TEDAX_NETLIST &&
((inst[n].flags & TEDAX_IGNORE) || ((inst[n].flags & TEDAX_IGNORE) ||
(k >= 0 && (sym[k].flags & TEDAX_IGNORE))) ) return 0; (k >= 0 && (sym[k].flags & TEDAX_IGNORE))) ) return 0;
if( netlist_lvs_ignore && if( netlist_lvs_ignore &&
((inst[n].flags & LVS_IGNORE_OPEN) || ((inst[n].flags & LVS_IGNORE_OPEN) ||
(k >= 0 && (sym[k].flags & LVS_IGNORE_OPEN))) ) return 0; (k >= 0 && (sym[k].flags & LVS_IGNORE_OPEN))) ) return 0;
/* process bus taps : type = bus_tap /* process bus taps : type = bus_tap
* node 1 connects to bus (DATA[15:0]) , node 0 is the tap ([2:0]) */ * node 1 connects to bus (DATA[15:0]) , node 0 is the tap ([2:0]) */
if(rects > 1 && bus_tap && p == 1) { if(rects > 1 && bus_tap && p == 1) {
char *node_base_name = NULL; char *node_base_name = NULL;
@ -1362,7 +1362,7 @@ static int name_nodes_of_pins_labels_and_propagate()
) { ) {
char str[2048]; char str[2048];
if( type && /* list of devices that do not have a name= in template attribute */ if( type && /* list of devices that do not have a name= in template attribute */
strcmp(type, "package") && strcmp(type, "package") &&
strcmp(type, "port_attributes") && strcmp(type, "port_attributes") &&
strcmp(type, "architecture") && strcmp(type, "architecture") &&
strcmp(type, "arch_declarations") && strcmp(type, "arch_declarations") &&
@ -1434,11 +1434,11 @@ static int name_nodes_of_pins_labels_and_propagate()
record_global_node(1,NULL, inst[i].node[0]); record_global_node(1,NULL, inst[i].node[0]);
} }
} }
/* do not count multiple labels/pins with same name */ /* do not count multiple labels/pins with same name */
bus_node_hash_lookup(inst[i].node[0], /* insert node in hash table */ bus_node_hash_lookup(inst[i].node[0], /* insert node in hash table */
dir, XINSERT, port, sig_type, verilog_type, value, class); dir, XINSERT, port, sig_type, verilog_type, value, class);
get_inst_pin_coord(i, 0, &x0, &y0); get_inst_pin_coord(i, 0, &x0, &y0);
get_square(x0, y0, &sqx, &sqy); get_square(x0, y0, &sqx, &sqy);
/* name nets that touch ioin opin alias instances */ /* name nets that touch ioin opin alias instances */
@ -1506,13 +1506,13 @@ static int set_unnamed_inst(int i, int j)
} }
static int name_unlabeled_instances() static int name_unlabeled_instances()
{ {
int err = 0; int err = 0;
int i, j; int i, j;
xInstance * const inst = xctx->inst; xInstance * const inst = xctx->inst;
int const instances = xctx->instances; int const instances = xctx->instances;
int rects; int rects;
dbg(2, "name_unlabeled_instances(): naming nets that dont touch labels\n"); dbg(2, "name_unlabeled_instances(): naming nets that dont touch labels\n");
for (i = 0; i < instances; ++i) for (i = 0; i < instances; ++i)
{ {
@ -1529,7 +1529,7 @@ static int name_unlabeled_instances()
} }
} }
return err; return err;
} }
static int reset_node_data_and_rehash() static int reset_node_data_and_rehash()
{ {
@ -1564,7 +1564,7 @@ void show_unconnected_pins(void)
{ {
int i; int i;
for(i = 0; i < xctx->instances; ++i) for(i = 0; i < xctx->instances; ++i)
{ {
select_element(i, SELECTED, 1, 0); select_element(i, SELECTED, 1, 0);
} }
rebuild_selected_array(); rebuild_selected_array();
@ -1586,7 +1586,7 @@ int prepare_netlist_structs(int for_netl)
for_netlist = for_netl; for_netlist = for_netl;
if(for_netlist>0 && xctx->prep_net_structs) return 0; if(for_netlist>0 && xctx->prep_net_structs) return 0;
else if(!for_netlist && xctx->prep_hi_structs) return 0; else if(!for_netlist && xctx->prep_hi_structs) return 0;
dbg(1, "prepare_netlist_structs(): extraction: %s\n", xctx->sch[xctx->currsch]); dbg(1, "prepare_netlist_structs(): extraction: %s\n", xctx->sch[xctx->currsch]);
reset_caches(); /* update cached flags: necessary if some tcleval() is used for cached attrs */ reset_caches(); /* update cached flags: necessary if some tcleval() is used for cached attrs */
@ -1726,7 +1726,7 @@ int sym_vs_sch_pins(int all)
{ {
if( xctx->sym[i].type && !strcmp(xctx->sym[i].type,"subcircuit")) { if( xctx->sym[i].type && !strcmp(xctx->sym[i].type,"subcircuit")) {
int rects = xctx->sym[i].rects[PINLAYER]; int rects = xctx->sym[i].rects[PINLAYER];
/* Determine if symbol has pass-through pins (pins with identical name) /* Determine if symbol has pass-through pins (pins with identical name)
* if any is found do not check with schematic */ * if any is found do not check with schematic */
Int_hashtable pin_table = {NULL, 0}; Int_hashtable pin_table = {NULL, 0};
int p; int p;
@ -1752,7 +1752,7 @@ int sym_vs_sch_pins(int all)
switch(tag[0]) { switch(tag[0]) {
case 'v': case 'v':
load_ascii_string(&tmp, fd); load_ascii_string(&tmp, fd);
my_snprintf(f_version, S(f_version), "%s", my_snprintf(f_version, S(f_version), "%s",
get_tok_value(tmp, "file_version", 0)); get_tok_value(tmp, "file_version", 0));
break; break;
@ -1842,7 +1842,7 @@ int sym_vs_sch_pins(int all)
* arguments. This can not be done in this context (the current schematic we are looking * arguments. This can not be done in this context (the current schematic we are looking
* into is not loaded), so skip test */ * into is not loaded), so skip test */
if( strchr(name, '@')) { if( strchr(name, '@')) {
dbg(1, "sym_vs_sch_pins(): symbol reference %s skipped (need to translate() tokens)\n", dbg(1, "sym_vs_sch_pins(): symbol reference %s skipped (need to translate() tokens)\n",
name); name);
break; break;
} }
@ -1860,7 +1860,7 @@ int sym_vs_sch_pins(int all)
pin_cnt++; pin_cnt++;
pin_match = 0; pin_match = 0;
for(j=0; j < rects; ++j) { for(j=0; j < rects; ++j) {
my_strdup(_ALLOC_ID_, &pin_name, my_strdup(_ALLOC_ID_, &pin_name,
expandlabel(get_tok_value(xctx->sym[i].rect[PINLAYER][j].prop_ptr, "name", 0), &mult)); expandlabel(get_tok_value(xctx->sym[i].rect[PINLAYER][j].prop_ptr, "name", 0), &mult));
my_strdup(_ALLOC_ID_, &pin_dir, get_tok_value(xctx->sym[i].rect[PINLAYER][j].prop_ptr, "dir", 0)); my_strdup(_ALLOC_ID_, &pin_dir, get_tok_value(xctx->sym[i].rect[PINLAYER][j].prop_ptr, "dir", 0));

View File

@ -1,21 +1,21 @@
# #
# File: ngspice_backannotate.tcl # File: ngspice_backannotate.tcl
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers # Copyright (C) 1998-2024 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -28,7 +28,7 @@ proc ngspice::read_raw_dataset {arr fp} {
set variables 0 set variables 0
while {[gets $fp line] >= 0} { while {[gets $fp line] >= 0} {
if {$line eq "Binary:"} break if {$line eq "Binary:"} break
if {[regexp {^No\. Variables:} $line]} { if {[regexp {^No\. Variables:} $line]} {
set n_vars [lindex $line end] set n_vars [lindex $line end]
} }
@ -75,7 +75,7 @@ proc ngspice::read_raw {{f {}}} {
} }
set fp [open $rawfile r] set fp [open $rawfile r]
fconfigure $fp -translation binary fconfigure $fp -translation binary
set ngspice::op_point_read 0 set ngspice::op_point_read 0
## not needed: done in ngspice::read_ngspice_raw ## not needed: done in ngspice::read_ngspice_raw
# array unset ngspice::ngspice_data # array unset ngspice::ngspice_data
while 1 { while 1 {
@ -87,7 +87,7 @@ proc ngspice::read_raw {{f {}}} {
} else break; } else break;
} }
close $fp close $fp
puts {Raw file read ...} puts {Raw file read ...}
if { !$ngspice::op_point_read } { if { !$ngspice::op_point_read } {
puts "no operating point found!" puts "no operating point found!"
} }

View File

@ -198,7 +198,7 @@ int traverse_node_hash()
Node_hashentry *entry; Node_hashentry *entry;
char str[2048]; /* 20161122 overflow safe */ char str[2048]; /* 20161122 overflow safe */
int incr_hi; int incr_hi;
incr_hi = tclgetboolvar("incr_hilight"); incr_hi = tclgetboolvar("incr_hilight");
for(i=0;i<HASHSIZE; ++i) for(i=0;i<HASHSIZE; ++i)
{ {
@ -261,7 +261,7 @@ void print_vhdl_signals(FILE *fd)
int i, found; int i, found;
int mult,j; int mult,j;
char *class=NULL; char *class=NULL;
found=0; found=0;
for(i=0;i<HASHSIZE; ++i) { for(i=0;i<HASHSIZE; ++i) {
ptr = xctx->node_table[i]; ptr = xctx->node_table[i];
@ -324,7 +324,7 @@ void print_verilog_signals(FILE *fd)
Node_hashentry *ptr; Node_hashentry *ptr;
int i, found; int i, found;
int mult,j; int mult,j;
dbg(2, " print_verilog_signals(): entering routine\n"); dbg(2, " print_verilog_signals(): entering routine\n");
found=0; found=0;
for(i=0;i<HASHSIZE; ++i) { for(i=0;i<HASHSIZE; ++i) {
@ -401,7 +401,7 @@ void list_nets(char **result)
ptr = xctx->node_table[i]; ptr = xctx->node_table[i];
while(ptr) { while(ptr) {
if(!ptr->d.port) { if(!ptr->d.port) {
my_mstrcat(_ALLOC_ID_, result, my_mstrcat(_ALLOC_ID_, result,
"{", ptr->token, " ", "net", "}\n", NULL); "{", ptr->token, " ", "net", "}\n", NULL);
} }
ptr = ptr->next; ptr = ptr->next;

View File

@ -1,22 +1,22 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
# #
# File: order_labels.awk # File: order_labels.awk
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers # Copyright (C) 1998-2024 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -28,10 +28,10 @@ BEGIN{
NF=2 { NF=2 {
i++ i++
pin[i]=$1 pin[i]=$1
# 20111116 # 20111116
dir[$1] = $2 dir[$1] = $2
} }
END{ END{
pin["n"]=i pin["n"]=i
hsort(pin, pin["n"]) hsort(pin, pin["n"])
@ -50,14 +50,14 @@ function compact_pinlist(pin ,i,ii,base,curr,curr_n,np)
{ {
delete pin_ret delete pin_ret
delete dir_ret delete dir_ret
np=pin["n"] np=pin["n"]
if(np) { if(np) {
ii=1 ii=1
for(i=1;i<=np;i++) { for(i=1;i<=np;i++) {
base =lab_name( pin[i] ) base =lab_name( pin[i] )
if(i==1) {curr=base; curr_n=i} if(i==1) {curr=base; curr_n=i}
else { else {
if(base != curr) { if(base != curr) {
pin_ret[ii] = compact_label(pin,curr_n,i-1) pin_ret[ii] = compact_label(pin,curr_n,i-1)
dir_ret[ii] = dir[pin[i-1]] # 20111116 dir_ret[ii] = dir[pin[i-1]] # 20111116
@ -69,7 +69,7 @@ function compact_pinlist(pin ,i,ii,base,curr,curr_n,np)
pin_ret[ii] = compact_label(pin,curr_n,np) pin_ret[ii] = compact_label(pin,curr_n,np)
dir_ret[ii] = dir[pin[np]] # 20111116 dir_ret[ii] = dir[pin[np]] # 20111116
pin_ret["n"] = ii pin_ret["n"] = ii
} }
} }
@ -87,10 +87,10 @@ function compact_label(ar,a,b, ret,start,i)
else {ret = ret ar[i-1] ","; start=i } else {ret = ret ar[i-1] ","; start=i }
} }
} }
else if(lab_name(ar[i])!=lab_name(ar[i-1]) || else if(lab_name(ar[i])!=lab_name(ar[i-1]) ||
( lab_index(ar[i]) != lab_index(ar[i-1])-1 && ( lab_index(ar[i]) != lab_index(ar[i-1])-1 &&
lab_index(ar[i]) != lab_index(ar[i-1])+1) ) { lab_index(ar[i]) != lab_index(ar[i-1])+1) ) {
if(start<i-1) if(start<i-1)
ret = ret lab_name(ar[start]) "[" lab_index(ar[start]) ":" lab_index(ar[i-1]) "]," ret = ret lab_name(ar[start]) "[" lab_index(ar[start]) ":" lab_index(ar[i-1]) "],"
else else
ret = ret lab_name(ar[start]) "[" lab_index(ar[start]) "]," ret = ret lab_name(ar[start]) "[" lab_index(ar[start]) "],"
@ -102,7 +102,7 @@ function compact_label(ar,a,b, ret,start,i)
if(start < b) ret = ret (b-start+1) "*" ar[b] if(start < b) ret = ret (b-start+1) "*" ar[b]
else ret = ret ar[b] else ret = ret ar[b]
} }
else if(start<b) else if(start<b)
ret = ret lab_name(ar[start]) "[" lab_index(ar[start]) ":" lab_index(ar[b]) "]" ret = ret lab_name(ar[start]) "[" lab_index(ar[start]) ":" lab_index(ar[b]) "]"
else else
ret = ret lab_name(ar[b]) "[" lab_index(ar[b]) "]" ret = ret lab_name(ar[b]) "[" lab_index(ar[b]) "]"
@ -162,7 +162,7 @@ function hsort(array,n, rarray,l,j,ir,i,rra)
} }
array[i]=rarray array[i]=rarray
} }
} }
function comp(a,b) function comp(a,b)
{ {

View File

@ -4,7 +4,7 @@ awk '
{ $0 = tolower($0)} { $0 = tolower($0)}
/port map\(/{ /port map\(/{
while($0 !~/; *$/) { while($0 !~/; *$/) {
a=$0 a=$0
getline getline
@ -12,7 +12,7 @@ awk '
} }
gsub(/ */," ",$0) gsub(/ */," ",$0)
gsub(/ *;/,";",$0) gsub(/ *;/,";",$0)
# print ">>>>" $0 "<<<<" # print ">>>>" $0 "<<<<"
} }
@ -36,9 +36,9 @@ awk '
} }
(port_list==1){ (port_list==1){
if($0 ~ /\) *;/) if($0 ~ /\) *;/)
{ {
sub(/\) *;/,"",$0) sub(/\) *;/,"",$0)
end_port_list=1 end_port_list=1
} }
gsub(/;/, ";\n ",$0 ) gsub(/;/, ";\n ",$0 )

View File

@ -1,7 +1,7 @@
/* File: parselabel.l /* File: parselabel.l
* *
* This file is part of XSCHEM, * This file is part of XSCHEM,
* a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit * a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
* simulation. * simulation.
* Copyright (C) 1998-2023 Stefan Frederik Schippers * Copyright (C) 1998-2023 Stefan Frederik Schippers
* *
@ -36,7 +36,7 @@
static int parselabel_debug = 0; static int parselabel_debug = 0;
#include "xschem.h" #include "xschem.h"
/* /*
extern int xctx; extern int xctx;
extern int has_x; extern int has_x;
extern FILE *errfp; extern FILE *errfp;
@ -77,8 +77,8 @@ static void str_char_replace(char s[], char chr, char repl_chr)
if(s[i]==chr) if(s[i]==chr)
{ {
s[i]=repl_chr; s[i]=repl_chr;
} }
i++; i++;
} }
} }
@ -121,14 +121,14 @@ const char *expandlabel(const char *s, int *m)
l = strlen(s)+400; l = strlen(s)+400;
cmd = my_malloc(_ALLOC_ID_, l); cmd = my_malloc(_ALLOC_ID_, l);
fprintf(errfp, "syntax error in %s\n", s); fprintf(errfp, "syntax error in %s\n", s);
my_snprintf(cmd, l, my_snprintf(cmd, l,
"tk_messageBox -icon error -type ok -parent [xschem get topwindow] " "tk_messageBox -icon error -type ok -parent [xschem get topwindow] "
"-message {Syntax error in identifier expansion: %s\nschematic:\n%s}", s, xctx->sch[xctx->currsch]); "-message {Syntax error in identifier expansion: %s\nschematic:\n%s}", s, xctx->sch[xctx->currsch]);
if(has_x) tcleval(cmd); if(has_x) tcleval(cmd);
my_free(_ALLOC_ID_, &cmd); my_free(_ALLOC_ID_, &cmd);
} }
if(parselabel_debug >= 3) if(parselabel_debug >= 3)
fprintf(errfp, "expandlabel(): returning %s from %s mult=%d\n",dest_string.str, s, dest_string.m); fprintf(errfp, "expandlabel(): returning %s from %s mult=%d\n",dest_string.str, s, dest_string.m);
if(dest_string.str) { if(dest_string.str) {
*m = dest_string.m; *m = dest_string.m;

View File

@ -315,7 +315,7 @@ static void merge_inst(int k,FILE *fd)
/* merge selection if selection_load=1, otherwise ask for filename /* merge selection if selection_load=1, otherwise ask for filename
* selection_load: * selection_load:
* 0: ask filename to merge * 0: ask filename to merge
* if ext=="" else use ext as name * if ext=="" else use ext as name
* 1: merge selection * 1: merge selection
* 2: merge clipboard * 2: merge clipboard
* if bit 3 is set do not start a move_objects(RUBBER,0,0,0) * if bit 3 is set do not start a move_objects(RUBBER,0,0,0)

View File

@ -9,10 +9,10 @@
# #
# place pin symbols (like ipin.sym, opin.sym, iopin.sym, # place pin symbols (like ipin.sym, opin.sym, iopin.sym,
# or devices/ipin.sym depending on your search path setting) in current schematic. # or devices/ipin.sym depending on your search path setting) in current schematic.
# Pins are placed at growing y coordinates (going down in xschem coordinate system) # Pins are placed at growing y coordinates (going down in xschem coordinate system)
# parameters: # parameters:
# filename: name for the file holding the list of pins. # filename: name for the file holding the list of pins.
# 2 columns are assumed: pin name and pin number # 2 columns are assumed: pin name and pin number
# symname: name of the pin to place (ipin.sym, opin.sym, devices/ipin.sym, ...). # symname: name of the pin to place (ipin.sym, opin.sym, devices/ipin.sym, ...).
# x, y: coordinate for first pin # x, y: coordinate for first pin
# spacing: vertical spacing between one pin and the following. # spacing: vertical spacing between one pin and the following.

View File

@ -7,10 +7,10 @@
# LDPRECH 6 # LDPRECH 6
# #
# place pin objects (squares on layer 5) and labels in the current symbol window. # place pin objects (squares on layer 5) and labels in the current symbol window.
# pins are placed at growing y coordinates (going down in xschem coordinate system) # pins are placed at growing y coordinates (going down in xschem coordinate system)
# parameters: # parameters:
# filename: name for the file holding the list of pins. # filename: name for the file holding the list of pins.
# 2 columns are assumed: pin name and pin number # 2 columns are assumed: pin name and pin number
# dir: pin direction (in, out or inout) # dir: pin direction (in, out or inout)
# x, y: coordinate for first pin # x, y: coordinate for first pin
# spacing: vertical spacing between one pin and the following. # spacing: vertical spacing between one pin and the following.

View File

@ -99,7 +99,7 @@ static int ps_embedded_image(xRect* r, double x1, double y1, double x2, double y
/* screen position */ /* screen position */
sx1=X_TO_SCREEN(x1); sx1=X_TO_SCREEN(x1);
sy1=Y_TO_SCREEN(y1); sy1=Y_TO_SCREEN(y1);
sx2=X_TO_SCREEN(x2); sx2=X_TO_SCREEN(x2);
sy2=Y_TO_SCREEN(y2); sy2=Y_TO_SCREEN(y2);
if(RECT_OUTSIDE(sx1, sy1, sx2, sy2, if(RECT_OUTSIDE(sx1, sy1, sx2, sy2,
@ -125,7 +125,7 @@ static int ps_embedded_image(xRect* r, double x1, double y1, double x2, double y
if(filter) { if(filter) {
jpg = 2; /* svg */ jpg = 2; /* svg */
} }
} }
else jpg = -1; /* some invalid data */ else jpg = -1; /* some invalid data */
} else { } else {
jpg = -1; jpg = -1;
@ -194,16 +194,16 @@ static int ps_embedded_image(xRect* r, double x1, double y1, double x2, double y
fprintf(fd, "{ << /ImageType 1\n"); fprintf(fd, "{ << /ImageType 1\n");
fprintf(fd, " /Width %g\n", (double)size_x); fprintf(fd, " /Width %g\n", (double)size_x);
fprintf(fd, " /Height %g\n", (double)size_y); fprintf(fd, " /Height %g\n", (double)size_y);
if(!flip) if(!flip)
{ {
if(rot==1) fprintf(fd, " /ImageMatrix [%g 0 0 %g 0 %g]\n", if(rot==1) fprintf(fd, " /ImageMatrix [%g 0 0 %g 0 %g]\n",
(double)size_y, (double)size_x, (double)size_y); (double)size_y, (double)size_x, (double)size_y);
else if(rot==2) fprintf(fd, " /ImageMatrix [%g 0 0 %g %g %g]\n", else if(rot==2) fprintf(fd, " /ImageMatrix [%g 0 0 %g %g %g]\n",
(double)size_x, (double)size_y, (double)size_x, (double)size_y); (double)size_x, (double)size_y, (double)size_x, (double)size_y);
else if(rot==3) fprintf(fd, " /ImageMatrix [%g 0 0 %g %g 0]\n", else if(rot==3) fprintf(fd, " /ImageMatrix [%g 0 0 %g %g 0]\n",
(double)size_y, (double)size_x, (double)size_x); (double)size_y, (double)size_x, (double)size_x);
else fprintf(fd, " /ImageMatrix [%g 0 0 %g 0 0]\n", (double)size_x, (double)size_y); else fprintf(fd, " /ImageMatrix [%g 0 0 %g 0 0]\n", (double)size_x, (double)size_y);
} }
else else
{ {
@ -214,7 +214,7 @@ static int ps_embedded_image(xRect* r, double x1, double y1, double x2, double y
else if(rot==3) fprintf(fd, " /ImageMatrix [%g 0 0 %g 0 0]\n", else if(rot==3) fprintf(fd, " /ImageMatrix [%g 0 0 %g 0 0]\n",
-(double)size_y, (double)size_x); -(double)size_y, (double)size_x);
else fprintf(fd, " /ImageMatrix [%g 0 0 %g %g 0]\n", else fprintf(fd, " /ImageMatrix [%g 0 0 %g %g 0]\n",
-(double)size_x, (double)size_y, (double)size_x); -(double)size_x, (double)size_y, (double)size_x);
} }
fprintf(fd, " /DataSource Data\n"); fprintf(fd, " /DataSource Data\n");
fprintf(fd, " /BitsPerComponent 8\n"); fprintf(fd, " /BitsPerComponent 8\n");
@ -240,7 +240,7 @@ static int ps_embedded_image(xRect* r, double x1, double y1, double x2, double y
fprintf(fd, "%s", ascii85EncodedJpeg); fprintf(fd, "%s", ascii85EncodedJpeg);
#endif #endif
fprintf(fd, "~>\n"); fprintf(fd, "~>\n");
fprintf(fd, "grestore\n"); fprintf(fd, "grestore\n");
my_free(_ALLOC_ID_, &ascii85EncodedJpeg); my_free(_ALLOC_ID_, &ascii85EncodedJpeg);
free(jpgData); free(jpgData);
@ -262,7 +262,7 @@ static int ps_embedded_graph(int i, double rx1, double ry1, double rx2, double r
int d_c; int d_c;
unsigned char* jpgData = NULL; unsigned char* jpgData = NULL;
size_t fileSize = 0; size_t fileSize = 0;
/* /*
* FILE* fp; * FILE* fp;
* static char str[PATH_MAX]; * static char str[PATH_MAX];
*/ */
@ -340,7 +340,7 @@ static int ps_embedded_graph(int i, double rx1, double ry1, double rx2, double r
cairo_set_source_surface(ct, xctx->cairo_save_sfc, 0, 0); cairo_set_source_surface(ct, xctx->cairo_save_sfc, 0, 0);
cairo_set_operator(ct, CAIRO_OPERATOR_SOURCE); cairo_set_operator(ct, CAIRO_OPERATOR_SOURCE);
cairo_paint(ct); cairo_paint(ct);
setup_graph_data(i, 0, &xctx->graph_struct); setup_graph_data(i, 0, &xctx->graph_struct);
draw_graph(i, 8 + (xctx->graph_flags & (4 | 2 | 128 | 256)), &xctx->graph_struct, (void *)ct); draw_graph(i, 8 + (xctx->graph_flags & (4 | 2 | 128 | 256)), &xctx->graph_struct, (void *)ct);
#endif #endif
cairo_image_surface_write_to_jpeg_mem(png_sfc, &jpgData, &fileSize, quality); cairo_image_surface_write_to_jpeg_mem(png_sfc, &jpgData, &fileSize, quality);
@ -384,7 +384,7 @@ static int ps_embedded_graph(int i, double rx1, double ry1, double rx2, double r
for (j = 0; j < oLength; ++j) for (j = 0; j < oLength; ++j)
{ {
fputc(ascii85EncodedJpeg[j],fd); fputc(ascii85EncodedJpeg[j],fd);
if(j > 0 && (j % 64) == 0) if(j > 0 && (j % 64) == 0)
{ {
fputc('\n',fd); fputc('\n',fd);
/* if (ascii85Encode[i+1]=='%') idx=63; imageMagic does this for some reason?! /* if (ascii85Encode[i+1]=='%') idx=63; imageMagic does this for some reason?!
@ -395,11 +395,11 @@ static int ps_embedded_graph(int i, double rx1, double ry1, double rx2, double r
fprintf(fd, "%s", ascii85EncodedJpeg); fprintf(fd, "%s", ascii85EncodedJpeg);
#endif #endif
fprintf(fd, "~>\n"); fprintf(fd, "~>\n");
fprintf(fd, "grestore\n"); fprintf(fd, "grestore\n");
my_free(_ALLOC_ID_, &ascii85EncodedJpeg); my_free(_ALLOC_ID_, &ascii85EncodedJpeg);
#endif #endif
return 1; return 1;
} }
@ -447,7 +447,7 @@ static void ps_xdrawpoint(int layer, double x1, double y1)
* 1 : stippled fill * 1 : stippled fill
* 2 : solid fill * 2 : solid fill
* *
* fill_type[i]: * fill_type[i]:
* 0 : no fill * 0 : no fill
* 1 : patterned (stippled) fill * 1 : patterned (stippled) fill
* 2 : solid fill * 2 : solid fill
@ -597,9 +597,9 @@ static void ps_filledrect(int gc, double rectx1,double recty1,double rectx2,doub
if(bus > 0.0) { if(bus > 0.0) {
fprintf(fd, "0 setlinejoin 2 setlinecap\n"); fprintf(fd, "0 setlinejoin 2 setlinecap\n");
} }
if(dash) { if(dash) {
fprintf(fd, "[%g %g] 0 setdash\n", psdash, psdash); fprintf(fd, "[%g %g] 0 setdash\n", psdash, psdash);
} }
if(width >= 0.0) set_lw(1.2 * width); if(width >= 0.0) set_lw(1.2 * width);
if(e_a != -1) { if(e_a != -1) {
@ -619,11 +619,11 @@ static void ps_filledrect(int gc, double rectx1,double recty1,double rectx2,doub
} }
if(dash) { if(dash) {
fprintf(fd, "[] 0 setdash\n"); fprintf(fd, "[] 0 setdash\n");
} }
if(width >= 0.0) set_lw(xctx->lw); if(width >= 0.0) set_lw(xctx->lw);
if(bus > 0.0) { if(bus > 0.0) {
fprintf(fd, "1 setlinejoin 1 setlinecap\n"); fprintf(fd, "1 setlinejoin 1 setlinecap\n");
} }
} }
} }
@ -679,7 +679,7 @@ static void ps_drawline(int gc, double linex1,double liney1,double linex2,double
double x1,y1,x2,y2; double x1,y1,x2,y2;
double psdash; double psdash;
double width; double width;
if(bus == -1.0) width = BUS_WIDTH * xctx->lw; if(bus == -1.0) width = BUS_WIDTH * xctx->lw;
else if(bus > 0.0) width = bus * xctx->mooz; else if(bus > 0.0) width = bus * xctx->mooz;
else width = -1.0; else width = -1.0;
@ -694,7 +694,7 @@ static void ps_drawline(int gc, double linex1,double liney1,double linex2,double
psdash = dash / xctx->zoom; psdash = dash / xctx->zoom;
if(bus > 0.0) { if(bus > 0.0) {
fprintf(fd, "0 setlinejoin 2 setlinecap\n"); fprintf(fd, "0 setlinejoin 2 setlinecap\n");
} }
if(dash) { if(dash) {
fprintf(fd, "[%g %g] 0 setdash\n", psdash, psdash); fprintf(fd, "[%g %g] 0 setdash\n", psdash, psdash);
} }
@ -712,8 +712,8 @@ static void ps_drawline(int gc, double linex1,double liney1,double linex2,double
static void ps_draw_string_line(int layer, char *s, double x, double y, double size, static void ps_draw_string_line(int layer, char *s, double x, double y, double size,
short rot, short flip, int lineno, double fontheight, double fontascent, short rot, short flip, int lineno, double fontheight, double fontascent,
double fontdescent, int llength, int no_of_lines, double longest_line) double fontdescent, int llength, int no_of_lines, double longest_line)
{ {
double ix, iy; double ix, iy;
@ -807,7 +807,7 @@ static void ps_draw_string(int layer, const char *str, short rot, short flip, in
estr = my_expand(str, tclgetintvar("tabstop")); estr = my_expand(str, tclgetintvar("tabstop"));
text_bbox(estr, xscale, yscale, rot, flip, hcenter, vcenter, text_bbox(estr, xscale, yscale, rot, flip, hcenter, vcenter,
x,y, &textx1,&texty1,&textx2,&texty2, &no_of_lines, &longest_line); x,y, &textx1,&texty1,&textx2,&texty2, &no_of_lines, &longest_line);
if(!textclip(xctx->areax1,xctx->areay1,xctx->areax2, if(!textclip(xctx->areax1,xctx->areay1,xctx->areax2,
xctx->areay2,textx1,texty1,textx2,texty2)) { xctx->areay2,textx1,texty1,textx2,texty2)) {
my_free(_ALLOC_ID_, &estr); my_free(_ALLOC_ID_, &estr);
@ -840,7 +840,7 @@ static void ps_draw_string(int layer, const char *str, short rot, short flip, in
c=*ss; c=*ss;
if(c=='\n' || c==0) { if(c=='\n' || c==0) {
*ss='\0'; *ss='\0';
ps_draw_string_line(layer, tt, x, y, size, rot, flip, lineno, ps_draw_string_line(layer, tt, x, y, size, rot, flip, lineno,
height, ascent, descent, llength, no_of_lines, longest_line); height, ascent, descent, llength, no_of_lines, longest_line);
++lineno; ++lineno;
if(c==0) break; if(c==0) break;
@ -952,7 +952,7 @@ static void ps_draw_symbol(int c, int n,int layer, int what, short tmp_flip, sho
{ /* a "for(i=0;i<cadlayers; ++i)" loop */ { /* a "for(i=0;i<cadlayers; ++i)" loop */
int j, hide = 0, disabled = 0; int j, hide = 0, disabled = 0;
double x0,y0,x1,y1,x2,y2; double x0,y0,x1,y1,x2,y2;
short flip; short flip;
int textlayer; int textlayer;
xLine *line; xLine *line;
xRect *rect; xRect *rect;
@ -968,7 +968,7 @@ static void ps_draw_symbol(int c, int n,int layer, int what, short tmp_flip, sho
type = xctx->sym[xctx->inst[n].ptr].type; type = xctx->sym[xctx->inst[n].ptr].type;
lvs_ignore=tclgetboolvar("lvs_ignore"); lvs_ignore=tclgetboolvar("lvs_ignore");
if(xctx->inst[n].ptr == -1) return; if(xctx->inst[n].ptr == -1) return;
if(layer == 0) { if(layer == 0) {
xctx->inst[n].flags &= ~IGNORE_INST; /* clear bit */ xctx->inst[n].flags &= ~IGNORE_INST; /* clear bit */
if( type && strcmp(type, "launcher") && strcmp(type, "logo") && if( type && strcmp(type, "launcher") && strcmp(type, "logo") &&
strcmp(type, "probe") && strcmp(type, "probe") &&
@ -1040,12 +1040,12 @@ static void ps_draw_symbol(int c, int n,int layer, int what, short tmp_flip, sho
ps_filledrect(color, xctx->inst[n].xx1, xctx->inst[n].yy1, xctx->inst[n].xx2, xctx->inst[n].yy2, ps_filledrect(color, xctx->inst[n].xx1, xctx->inst[n].yy1, xctx->inst[n].xx2, xctx->inst[n].yy2,
0.0, 2, 0, -1, -1); 0.0, 2, 0, -1, -1);
} }
/* pdfmarks, only if doing hierarchy print and if symbol has a subcircuit */ /* pdfmarks, only if doing hierarchy print and if symbol has a subcircuit */
if(what != 7) { if(what != 7) {
char fname[PATH_MAX]; char fname[PATH_MAX];
if(!strcmp(xctx->sym[xctx->inst[n].ptr].type, "subcircuit")) { if(!strcmp(xctx->sym[xctx->inst[n].ptr].type, "subcircuit")) {
get_sch_from_sym(fname, xctx->inst[n].ptr+ xctx->sym, n, 0); get_sch_from_sym(fname, xctx->inst[n].ptr+ xctx->sym, n, 0);
fprintf(fd, fprintf(fd,
"[ " "[ "
"/Rect [ %g %g %g %g ] " "/Rect [ %g %g %g %g ] "
"/Border [0 0 0] " "/Border [0 0 0] "
@ -1132,7 +1132,7 @@ static void ps_draw_symbol(int c, int n,int layer, int what, short tmp_flip, sho
if(symptr->rects[layer]) { if(symptr->rects[layer]) {
fprintf(fd, "NP\n"); /* newpath */ fprintf(fd, "NP\n"); /* newpath */
set_ps_colors(c); set_ps_colors(c);
} }
for(j=0;j< symptr->rects[layer]; ++j) for(j=0;j< symptr->rects[layer]; ++j)
{ {
@ -1148,7 +1148,7 @@ static void ps_draw_symbol(int c, int n,int layer, int what, short tmp_flip, sho
} else { } else {
int ellipse_a = rect->ellipse_a; int ellipse_a = rect->ellipse_a;
int ellipse_b = rect->ellipse_b; int ellipse_b = rect->ellipse_b;
if(ellipse_a != -1 && ellipse_b != 360) { if(ellipse_a != -1 && ellipse_b != 360) {
if(flip) { if(flip) {
ellipse_a = 180 - ellipse_a - ellipse_b; ellipse_a = 180 - ellipse_a - ellipse_b;
@ -1163,12 +1163,12 @@ static void ps_draw_symbol(int c, int n,int layer, int what, short tmp_flip, sho
} }
ellipse_a %= 360; ellipse_a %= 360;
} }
} }
ps_filledrect(c, x0+x1, y0+y1, x0+x2, y0+y2, rect->bus, dash, rect->fill, ellipse_a, ellipse_b); ps_filledrect(c, x0+x1, y0+y1, x0+x2, y0+y2, rect->bus, dash, rect->fill, ellipse_a, ellipse_b);
} }
} }
} /* if( (!hide && xctx->enable_layer[layer]) || ... */ } /* if( (!hide && xctx->enable_layer[layer]) || ... */
draw_texts: draw_texts:
if(xctx->sym_txt && !(xctx->inst[n].flags & HIDE_SYMBOL_TEXTS) && (layer == cadlayers)) { if(xctx->sym_txt && !(xctx->inst[n].flags & HIDE_SYMBOL_TEXTS) && (layer == cadlayers)) {
const char *txtptr; const char *txtptr;
@ -1178,7 +1178,7 @@ static void ps_draw_symbol(int c, int n,int layer, int what, short tmp_flip, sho
for(j=0;j< (xctx->inst[n].ptr+ xctx->sym)->texts; ++j) for(j=0;j< (xctx->inst[n].ptr+ xctx->sym)->texts; ++j)
{ {
double xscale, yscale; double xscale, yscale;
get_sym_text_size(n, j, &xscale, &yscale); get_sym_text_size(n, j, &xscale, &yscale);
text = symptr->text[j]; text = symptr->text[j];
/* if(xscale*FONTWIDTH* xctx->mooz<1) continue; */ /* if(xscale*FONTWIDTH* xctx->mooz<1) continue; */
@ -1208,7 +1208,7 @@ static void ps_draw_symbol(int c, int n,int layer, int what, short tmp_flip, sho
my_snprintf(ps_font_family, S(ps_font_family), textfont); my_snprintf(ps_font_family, S(ps_font_family), textfont);
my_snprintf(ps_font_name, S(ps_font_name), textfont); my_snprintf(ps_font_name, S(ps_font_name), textfont);
} }
if( symptr->text[j].flags & TEXT_BOLD) { if( symptr->text[j].flags & TEXT_BOLD) {
if( (symptr->text[j].flags & TEXT_ITALIC) || (symptr->text[j].flags & TEXT_OBLIQUE) ) { if( (symptr->text[j].flags & TEXT_ITALIC) || (symptr->text[j].flags & TEXT_OBLIQUE) ) {
my_snprintf(ps_font_family, S(ps_font_family), "%s-BoldOblique", ps_font_name); my_snprintf(ps_font_family, S(ps_font_family), "%s-BoldOblique", ps_font_name);
} else { } else {
@ -1334,7 +1334,7 @@ void create_ps(char **psfile, int what, int fullzoom, int eps)
/* this zoom only done to reset lw */ /* this zoom only done to reset lw */
zoom_full(0, 0, 1 + 2 * tclgetboolvar("zoom_full_center"), 0.97); zoom_full(0, 0, 1 + 2 * tclgetboolvar("zoom_full_center"), 0.97);
/* adjust aspect ratio to paper size */ /* adjust aspect ratio to paper size */
if(landscape) if(landscape)
xctx->xrect[0].height = (short unsigned int) (xctx->xrect[0].width * pagey / pagex); xctx->xrect[0].height = (short unsigned int) (xctx->xrect[0].width * pagey / pagex);
else else
xctx->xrect[0].width = (short unsigned int) (xctx->xrect[0].height * pagey / pagex); xctx->xrect[0].width = (short unsigned int) (xctx->xrect[0].height * pagey / pagex);
@ -1380,7 +1380,7 @@ void create_ps(char **psfile, int what, int fullzoom, int eps)
} }
margin = 0.0; margin = 0.0;
} }
if(what & 1) {/* prolog */ if(what & 1) {/* prolog */
dbg(1, "ps_draw(): bbox: x1=%g y1=%g x2=%g y2=%g\n", boundbox.x1, boundbox.y1, boundbox.x2, boundbox.y2); dbg(1, "ps_draw(): bbox: x1=%g y1=%g x2=%g y2=%g\n", boundbox.x1, boundbox.y1, boundbox.x2, boundbox.y2);
if(!eps) { if(!eps) {
@ -1409,14 +1409,14 @@ void create_ps(char **psfile, int what, int fullzoom, int eps)
fprintf(fd, "%%%%Page 1 1\n"); fprintf(fd, "%%%%Page 1 1\n");
} }
fprintf(fd, "%%%%BeginProlog\n\n"); fprintf(fd, "%%%%BeginProlog\n\n");
for(i = 0; i < sizeof(utf8_enc)/sizeof(char *); ++i) { for(i = 0; i < sizeof(utf8_enc)/sizeof(char *); ++i) {
fprintf(fd, "%s", utf8_enc[i]); fprintf(fd, "%s", utf8_enc[i]);
} }
for(i = 0; i < sizeof(utf8)/sizeof(char *); ++i) { for(i = 0; i < sizeof(utf8)/sizeof(char *); ++i) {
fprintf(fd, "%s", utf8[i]); fprintf(fd, "%s", utf8[i]);
} }
fprintf(fd, "/Times /Times chararr recode\n"); fprintf(fd, "/Times /Times chararr recode\n");
fprintf(fd, "/Times-Bold /Times-Bold chararr recode\n"); fprintf(fd, "/Times-Bold /Times-Bold chararr recode\n");
fprintf(fd, "/Times-Oblique /Times-Oblique chararr recode\n"); fprintf(fd, "/Times-Oblique /Times-Oblique chararr recode\n");
@ -1429,7 +1429,7 @@ void create_ps(char **psfile, int what, int fullzoom, int eps)
fprintf(fd, "/Courier-Bold /Courier-Bold chararr recode\n"); fprintf(fd, "/Courier-Bold /Courier-Bold chararr recode\n");
fprintf(fd, "/Courier-Oblique /Courier-Oblique chararr recode\n"); fprintf(fd, "/Courier-Oblique /Courier-Oblique chararr recode\n");
fprintf(fd, "/Courier-BoldOblique /Courier-BoldOblique chararr recode\n"); fprintf(fd, "/Courier-BoldOblique /Courier-BoldOblique chararr recode\n");
fprintf(fd,"/cm {28.346457 mul} bind def\n"); fprintf(fd,"/cm {28.346457 mul} bind def\n");
fprintf(fd,"/LT {lineto} bind def\n"); fprintf(fd,"/LT {lineto} bind def\n");
fprintf(fd,"/MT {moveto} bind def\n"); fprintf(fd,"/MT {moveto} bind def\n");
@ -1492,7 +1492,7 @@ void create_ps(char **psfile, int what, int fullzoom, int eps)
scale = (pagex - 2 * margin) / dx; scale = (pagex - 2 * margin) / dx;
dbg(1, "scale=%g\n", scale); dbg(1, "scale=%g\n", scale);
} }
fprintf(fd, "%g %g translate\n", fprintf(fd, "%g %g translate\n",
-scale * boundbox.x1 + margin, pagey - (scaley - scale) * dy - margin + scale * boundbox.y1); -scale * boundbox.x1 + margin, pagey - (scaley - scale) * dy - margin + scale * boundbox.y1);
fprintf(fd, "%g %g scale\n", scale, -scale); fprintf(fd, "%g %g scale\n", scale, -scale);
fprintf(fd, "1 setlinejoin 1 setlinecap\n"); fprintf(fd, "1 setlinejoin 1 setlinecap\n");
@ -1511,7 +1511,7 @@ void create_ps(char **psfile, int what, int fullzoom, int eps)
if(xctx->rects[c]) fprintf(fd, "NP\n"); /* newpath */ if(xctx->rects[c]) fprintf(fd, "NP\n"); /* newpath */
for(i=0;i<xctx->rects[c]; ++i) for(i=0;i<xctx->rects[c]; ++i)
{ {
if (c == GRIDLAYER && (xctx->rect[c][i].flags & 1024)) { /* image */ if (c == GRIDLAYER && (xctx->rect[c][i].flags & 1024)) { /* image */
xRect* r = &xctx->rect[c][i]; xRect* r = &xctx->rect[c][i];
/* PNG Code Here */ /* PNG Code Here */
@ -1532,7 +1532,7 @@ void create_ps(char **psfile, int what, int fullzoom, int eps)
if(xctx->arcs[c]) fprintf(fd, "NP\n"); /* newpath */ if(xctx->arcs[c]) fprintf(fd, "NP\n"); /* newpath */
for(i=0;i<xctx->arcs[c]; ++i) for(i=0;i<xctx->arcs[c]; ++i)
{ {
ps_drawarc(c, xctx->arc[c][i].fill, xctx->arc[c][i].x, xctx->arc[c][i].y, ps_drawarc(c, xctx->arc[c][i].fill, xctx->arc[c][i].x, xctx->arc[c][i].y,
xctx->arc[c][i].r, xctx->arc[c][i].a, xctx->arc[c][i].b, xctx->arc[c][i].bus, xctx->arc[c][i].dash); xctx->arc[c][i].r, xctx->arc[c][i].a, xctx->arc[c][i].b, xctx->arc[c][i].bus, xctx->arc[c][i].dash);
} }
for(i=0;i<xctx->polygons[c]; ++i) { for(i=0;i<xctx->polygons[c]; ++i) {
@ -1563,7 +1563,7 @@ void create_ps(char **psfile, int what, int fullzoom, int eps)
ps_drawline(color, xctx->wire[i].x1,xctx->wire[i].y1,xctx->wire[i].x2,xctx->wire[i].y2, ps_drawline(color, xctx->wire[i].x1,xctx->wire[i].y1,xctx->wire[i].x2,xctx->wire[i].y2,
0 ,xctx->wire[i].bus); 0 ,xctx->wire[i].bus);
} }
{ {
double x1, y1, x2, y2; double x1, y1, x2, y2;
Wireentry *wireptr; Wireentry *wireptr;
@ -1596,7 +1596,7 @@ void create_ps(char **psfile, int what, int fullzoom, int eps)
textlayer = xctx->text[i].layer; textlayer = xctx->text[i].layer;
if(!xctx->show_hidden_texts && (xctx->text[i].flags & HIDE_TEXT)) continue; if(!xctx->show_hidden_texts && (xctx->text[i].flags & HIDE_TEXT)) continue;
if(textlayer < 0 || textlayer >= cadlayers) textlayer = TEXTLAYER; if(textlayer < 0 || textlayer >= cadlayers) textlayer = TEXTLAYER;
my_snprintf(ps_font_family, S(ps_font_name), "Helvetica"); my_snprintf(ps_font_family, S(ps_font_name), "Helvetica");
my_snprintf(ps_font_name, S(ps_font_name), "Helvetica"); my_snprintf(ps_font_name, S(ps_font_name), "Helvetica");
textfont = xctx->text[i].font; textfont = xctx->text[i].font;
@ -1604,7 +1604,7 @@ void create_ps(char **psfile, int what, int fullzoom, int eps)
my_snprintf(ps_font_family, S(ps_font_family), textfont); my_snprintf(ps_font_family, S(ps_font_family), textfont);
my_snprintf(ps_font_name, S(ps_font_name), textfont); my_snprintf(ps_font_name, S(ps_font_name), textfont);
} }
if( xctx->text[i].flags & TEXT_BOLD) { if( xctx->text[i].flags & TEXT_BOLD) {
if( (xctx->text[i].flags & TEXT_ITALIC) || (xctx->text[i].flags & TEXT_OBLIQUE) ) { if( (xctx->text[i].flags & TEXT_ITALIC) || (xctx->text[i].flags & TEXT_OBLIQUE) ) {
my_snprintf(ps_font_family, S(ps_font_family), "%s-BoldOblique", ps_font_name); my_snprintf(ps_font_family, S(ps_font_family), "%s-BoldOblique", ps_font_name);
} else { } else {
@ -1615,7 +1615,7 @@ void create_ps(char **psfile, int what, int fullzoom, int eps)
my_snprintf(ps_font_family, S(ps_font_family), "%s-Oblique", ps_font_name); my_snprintf(ps_font_family, S(ps_font_family), "%s-Oblique", ps_font_name);
else if( xctx->text[i].flags & TEXT_OBLIQUE) else if( xctx->text[i].flags & TEXT_OBLIQUE)
my_snprintf(ps_font_family, S(ps_font_family), "%s-Oblique", ps_font_name); my_snprintf(ps_font_family, S(ps_font_family), "%s-Oblique", ps_font_name);
if(text_ps) { if(text_ps) {
ps_draw_string(textlayer, get_text_floater(i), ps_draw_string(textlayer, get_text_floater(i),
xctx->text[i].rot, xctx->text[i].flip, xctx->text[i].hcenter, xctx->text[i].vcenter, xctx->text[i].rot, xctx->text[i].flip, xctx->text[i].hcenter, xctx->text[i].vcenter,

View File

@ -30,7 +30,7 @@ END { endfile(_filename_) }
} }
# T {nDisturbL[31],nDisturbL[29],nDi..... } 125 1686 0 1 0.2 0.2 {} # T {nDisturbL[31],nDisturbL[29],nDi..... } 125 1686 0 1 0.2 0.2 {}
# B 5 147.5 -1672.5 152.5 -1667.5 {name=ARBLEQALF[30],ARBLEQALF[28],...,ARBLEQALF[0] dir=inout } # B 5 147.5 -1672.5 152.5 -1667.5 {name=ARBLEQALF[30],ARBLEQALF[28],...,ARBLEQALF[0] dir=inout }
@ -73,7 +73,7 @@ function translate()
sub(/.*\[/,"",idx) sub(/.*\[/,"",idx)
sub(/\]/,"",idx) sub(/\]/,"",idx)
idx+=0 idx+=0
if(ii>1 && ( (idx+2!=previdx) || (basename !=first_basename) ) ) { if(ii>1 && ( (idx+2!=previdx) || (basename !=first_basename) ) ) {
evenbus=0 evenbus=0
break break
@ -91,7 +91,7 @@ function translate()
{ {
__a[__lines++] = $0 __a[__lines++] = $0
} }
function beginfile(f) function beginfile(f)
@ -110,5 +110,5 @@ function endfile(f, i)
} }
close(f) close(f)
} }
} }

View File

@ -1,21 +1,21 @@
# #
# File: resources.tcl # File: resources.tcl
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers # Copyright (C) 1998-2024 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -41,14 +41,14 @@
## # so we set white background and eliminate alpha channel (unsupported in gif). ## # so we set white background and eliminate alpha channel (unsupported in gif).
## convert -background white -alpha remove -alpha off paste.png -transparent white gif:-|base64 ## convert -background white -alpha remove -alpha off paste.png -transparent white gif:-|base64
## ##
## Following shell function (and call) converts a png base64 encoded to proper ## Following shell function (and call) converts a png base64 encoded to proper
## gif89a base64 encoded format: ## gif89a base64 encoded format:
## to_gif () { ## to_gif () {
## echo "image create photo $1 -data \"" ## echo "image create photo $1 -data \""
## echo -n "$2" | base64 -d |convert -background white -alpha remove -alpha off - -transparent white gif:- |base64 ## echo -n "$2" | base64 -d |convert -background white -alpha remove -alpha off - -transparent white gif:- |base64
## echo '"' ## echo '"'
## } ## }
## ##
## to_gif imgFileOpen "...." ## to_gif imgFileOpen "...."
## ##
@ -69,7 +69,7 @@
# # set light colorscheme, set transparent svg background # # set light colorscheme, set transparent svg background
# # draw image inside the border in green color # # draw image inside the border in green color
# # set line with 40 disable change line width, redraw # # set line with 40 disable change line width, redraw
# # move away the border, full zoom the image # # move away the border, full zoom the image
# # export svg: # # export svg:
# xschem print svg 1.svg 400 400 0 0 100 100 # xschem print svg 1.svg 400 400 0 0 100 100
# # edit svg, change .l4 layer from green to black (#000000) # # edit svg, change .l4 layer from green to black (#000000)
@ -77,7 +77,7 @@
# gm convert -size 16x16 1.svg 1.png # gm convert -size 16x16 1.svg 1.png
# convert -background white -alpha remove -alpha off 1.png -transparent white 1.gif # convert -background white -alpha remove -alpha off 1.png -transparent white 1.gif
# base64 1.gif # base64 1.gif
# # the output is the 16x16 image with transparent background, antialiasing # # the output is the 16x16 image with transparent background, antialiasing
# # and base64 encoded # # and base64 encoded
# # # #
# # # #

View File

@ -84,13 +84,13 @@ int filter_data(const char *din, const size_t ilen,
dbg(1, "p2[0] = %d\n", p2[0]); dbg(1, "p2[0] = %d\n", p2[0]);
dbg(1, "p2[1] = %d\n", p2[1]); dbg(1, "p2[1] = %d\n", p2[1]);
signal(SIGPIPE, SIG_IGN); /* so attempting write/read a broken pipe won't kill program */ signal(SIGPIPE, SIG_IGN); /* so attempting write/read a broken pipe won't kill program */
/* /*
* p2 * p2
* ------------------- p2[0] <--------- p2[1] ------------------- * ------------------- p2[0] <--------- p2[1] -------------------
* | Parent program | | Child filter | * | Parent program | | Child filter |
* ------------------- p1[1] ---------> p1[0] ------------------- * ------------------- p1[1] ---------> p1[0] -------------------
* p1 * p1
*/ */
fflush(NULL); /* flush all stdio streams before process forking */ fflush(NULL); /* flush all stdio streams before process forking */
@ -130,7 +130,7 @@ int filter_data(const char *din, const size_t ilen,
fprintf(stderr, "error: conversion failed\n"); fprintf(stderr, "error: conversion failed\n");
ret = 1; ret = 1;
} }
_exit(ret); /* childs should always use _exit() to avoid _exit(ret); /* childs should always use _exit() to avoid
* flushing open stdio streams and other unwanted side effects */ * flushing open stdio streams and other unwanted side effects */
} }
/* parent */ /* parent */
@ -213,7 +213,7 @@ char *base64_encode(const unsigned char *data, const size_t input_length, size_t
encoded_data = my_malloc(_ALLOC_ID_, alloc_length); encoded_data = my_malloc(_ALLOC_ID_, alloc_length);
if (encoded_data == NULL) return NULL; if (encoded_data == NULL) return NULL;
cnt = 0; cnt = 0;
for (i = 0, j = 0; i < input_length;) { for (i = 0, j = 0; i < input_length;) {
octet_a = i < input_length ? (unsigned char)data[i++] : 0; octet_a = i < input_length ? (unsigned char)data[i++] : 0;
octet_b = i < input_length ? (unsigned char)data[i++] : 0; octet_b = i < input_length ? (unsigned char)data[i++] : 0;
@ -263,7 +263,7 @@ unsigned char *base64_decode(const char *data, const size_t input_length, size_t
unsigned char *decoded_data; unsigned char *decoded_data;
int i, j, sextet[4], triple, cnt, padding; int i, j, sextet[4], triple, cnt, padding;
size_t actual_length; size_t actual_length;
actual_length = input_length; actual_length = input_length;
*output_length = input_length / 4 * 3 + 4; /* add 4 more just in case... */ *output_length = input_length / 4 * 3 + 4; /* add 4 more just in case... */
padding = 0; padding = 0;
@ -309,7 +309,7 @@ unsigned char *ascii85_encode(const unsigned char *data, const size_t input_leng
'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u' 'q', 'r', 's', 't', 'u'
}; };
int padding = (4-(input_length % 4))%4; int padding = (4-(input_length % 4))%4;
static unsigned int pow85[] = {1, 85, 7225, 614125, 52200625}; static unsigned int pow85[] = {1, 85, 7225, 614125, 52200625};
unsigned char *paddedData = my_calloc(_ALLOC_ID_, input_length+padding, 1); unsigned char *paddedData = my_calloc(_ALLOC_ID_, input_length+padding, 1);
@ -399,9 +399,9 @@ static void skip_raw_ascii_points(int npoints, FILE *fd)
dbg(1, "found empty line --> break\n"); dbg(1, "found empty line --> break\n");
break; break;
} }
} }
} }
} }
static int read_raw_ascii_point(int ac, double *tmp, FILE *fd) static int read_raw_ascii_point(int ac, double *tmp, FILE *fd)
{ {
@ -463,8 +463,8 @@ static int read_raw_ascii_point(int ac, double *tmp, FILE *fd)
/* SPICE RAWFILE ROUTINES */ /* SPICE RAWFILE ROUTINES */
/* read the ascii / binary portion of a ngspice raw simulation file /* read the ascii / binary portion of a ngspice raw simulation file
* data layout in memory arranged to maximize cache locality * data layout in memory arranged to maximize cache locality
* when looking up data * when looking up data
*/ */
static void read_raw_data_block(int binary, FILE *fd, Raw *raw, int ac) static void read_raw_data_block(int binary, FILE *fd, Raw *raw, int ac)
{ {
@ -475,7 +475,7 @@ static void read_raw_data_block(int binary, FILE *fd, Raw *raw, int ac)
long filepos; long filepos;
#else #else
__int3264 filepos; __int3264 filepos;
#endif #endif
int npoints; int npoints;
int rawvars = raw->nvars; int rawvars = raw->nvars;
@ -547,17 +547,17 @@ static void read_raw_data_block(int binary, FILE *fd, Raw *raw, int ac)
else /* magnitude */ else /* magnitude */
/* avoid 0 for dB calculations */ /* avoid 0 for dB calculations */
if(tmp[vv] == 0.0 && tmp[vv + 1] == 0.0) raw->values[v][offset + p] = 1e-35f; if(tmp[vv] == 0.0 && tmp[vv + 1] == 0.0) raw->values[v][offset + p] = 1e-35f;
else raw->values[v][offset + p] = else raw->values[v][offset + p] =
(SPICE_DATA)sqrt(tmp[vv] * tmp[vv] + tmp[vv + 1] * tmp[vv + 1]); (SPICE_DATA)sqrt(tmp[vv] * tmp[vv] + tmp[vv + 1] * tmp[vv + 1]);
/* AC analysis: calculate phase */ /* AC analysis: calculate phase */
if(tmp[vv] == 0.0 && tmp[vv + 1] == 0.0) raw->values[v + 1] [offset + p] = 0.0; if(tmp[vv] == 0.0 && tmp[vv + 1] == 0.0) raw->values[v + 1] [offset + p] = 0.0;
else raw->values[v + 1] [offset + p] = else raw->values[v + 1] [offset + p] =
(SPICE_DATA)(atan2(tmp[vv + 1], tmp[vv]) * 180.0 / XSCH_PI); (SPICE_DATA)(atan2(tmp[vv + 1], tmp[vv]) * 180.0 / XSCH_PI);
raw->values[v + 2] [offset + p] = (SPICE_DATA)tmp[vv]; /* real part */ raw->values[v + 2] [offset + p] = (SPICE_DATA)tmp[vv]; /* real part */
raw->values[v + 3] [offset + p] = (SPICE_DATA)tmp[vv + 1]; /* imaginary part */ raw->values[v + 3] [offset + p] = (SPICE_DATA)tmp[vv + 1]; /* imaginary part */
} }
} }
else for(v = 0; v < raw->nvars; v++) { else for(v = 0; v < raw->nvars; v++) {
raw->values[v][offset + p] = (SPICE_DATA)tmp[v]; raw->values[v][offset + p] = (SPICE_DATA)tmp[v];
} }
@ -591,7 +591,7 @@ static void read_raw_data_block(int binary, FILE *fd, Raw *raw, int ac)
* Binary: * Binary:
*/ */
static int read_dataset(FILE *fd, Raw **rawptr, const char *type, int no_warning) static int read_dataset(FILE *fd, Raw **rawptr, const char *type, int no_warning)
{ {
int variables = 0, i, done_points = 0; int variables = 0, i, done_points = 0;
char *line = NULL, *varname = NULL, *lowerline = NULL; char *line = NULL, *varname = NULL, *lowerline = NULL;
int n = 0, done_header = 0, ac = 0; int n = 0, done_header = 0, ac = 0;
@ -599,7 +599,7 @@ static int read_dataset(FILE *fd, Raw **rawptr, const char *type, int no_warning
int dbglev=1; int dbglev=1;
const char *sim_type = NULL; const char *sim_type = NULL;
Raw *raw; Raw *raw;
if(!rawptr) { if(!rawptr) {
dbg(0, "read_dataset(): NULL rawptr given\n"); dbg(0, "read_dataset(): NULL rawptr given\n");
return 0; return 0;
@ -624,7 +624,7 @@ static int read_dataset(FILE *fd, Raw **rawptr, const char *type, int no_warning
my_strdup(_ALLOC_ID_, &raw->sim_type, sim_type); my_strdup(_ALLOC_ID_, &raw->sim_type, sim_type);
done_header = 1; done_header = 1;
dbg(dbglev, "read_dataset(): read binary block, nvars=%d npoints=%d\n", nvars, npoints); dbg(dbglev, "read_dataset(): read binary block, nvars=%d npoints=%d\n", nvars, npoints);
read_raw_data_block(0, fd, raw, ac); read_raw_data_block(0, fd, raw, ac);
raw->datasets++; raw->datasets++;
exit_status = 1; exit_status = 1;
} else { } else {
@ -635,7 +635,7 @@ static int read_dataset(FILE *fd, Raw **rawptr, const char *type, int no_warning
sim_type = NULL; /* ready for next header */ sim_type = NULL; /* ready for next header */
done_points = 0; done_points = 0;
ac = 0; ac = 0;
} }
/* after this line comes the binary blob made of nvars * npoints * sizeof(double) bytes */ /* after this line comes the binary blob made of nvars * npoints * sizeof(double) bytes */
else if(!strcmp(line, "Binary:\n") || !strcmp(line, "Binary:\r\n")) { else if(!strcmp(line, "Binary:\n") || !strcmp(line, "Binary:\r\n")) {
@ -643,10 +643,10 @@ static int read_dataset(FILE *fd, Raw **rawptr, const char *type, int no_warning
my_strdup(_ALLOC_ID_, &raw->sim_type, sim_type); my_strdup(_ALLOC_ID_, &raw->sim_type, sim_type);
done_header = 1; done_header = 1;
dbg(dbglev, "read_dataset(): read binary block, nvars=%d npoints=%d\n", nvars, npoints); dbg(dbglev, "read_dataset(): read binary block, nvars=%d npoints=%d\n", nvars, npoints);
read_raw_data_block(1, fd, raw, ac); read_raw_data_block(1, fd, raw, ac);
raw->datasets++; raw->datasets++;
exit_status = 1; exit_status = 1;
} else { } else {
dbg(dbglev, "read_dataset(): skip binary block, nvars=%d npoints=%d\n", nvars, npoints); dbg(dbglev, "read_dataset(): skip binary block, nvars=%d npoints=%d\n", nvars, npoints);
xfseek(fd, nvars * npoints * sizeof(double), SEEK_CUR); /* skip binary block */ xfseek(fd, nvars * npoints * sizeof(double), SEEK_CUR); /* skip binary block */
} }
@ -678,7 +678,7 @@ static int read_dataset(FILE *fd, Raw **rawptr, const char *type, int no_warning
if(!type) type = "op"; if(!type) type = "op";
if(!strcmp(type, "op")) sim_type = "op"; if(!strcmp(type, "op")) sim_type = "op";
dbg(dbglev, "read_dataset(): op sim_type=%s\n", sim_type ? sim_type : "<NULL>"); dbg(dbglev, "read_dataset(): op sim_type=%s\n", sim_type ? sim_type : "<NULL>");
} }
else if(!strncmp(line, "Plotname:", 9) && strstr(lowerline, "integrated noise")) { else if(!strncmp(line, "Plotname:", 9) && strstr(lowerline, "integrated noise")) {
if(!type) type = "op"; if(!type) type = "op";
else if(!strcmp(type, "noise")) { else if(!strcmp(type, "noise")) {
@ -891,7 +891,7 @@ void free_rawfile(Raw **rawptr, int dr, int no_warning)
if(has_x) { if(has_x) {
tclvareval("set tctx::", xctx->current_win_path, "_waves $simulate_bg", NULL); tclvareval("set tctx::", xctx->current_win_path, "_waves $simulate_bg", NULL);
tclvareval("catch {", xctx->top_path, ".menubar entryconfigure Waves -background $simulate_bg}", NULL); tclvareval("catch {", xctx->top_path, ".menubar entryconfigure Waves -background $simulate_bg}", NULL);
} }
if(dr) draw(); if(dr) draw();
} }
@ -1035,7 +1035,7 @@ int raw_read(const char *f, Raw **rawptr, const char *type, int no_warning, doub
raw->allpoints += raw->npoints[i]; raw->allpoints += raw->npoints[i];
} }
dbg(0, "Raw file data read: %s\n", f); dbg(0, "Raw file data read: %s\n", f);
dbg(0, "points=%d, vars=%d, datasets=%d sim_type=%s\n", dbg(0, "points=%d, vars=%d, datasets=%d sim_type=%s\n",
raw->allpoints, raw->nvars, raw->datasets, raw->sim_type ? raw->sim_type : "<NULL>"); raw->allpoints, raw->nvars, raw->datasets, raw->sim_type ? raw->sim_type : "<NULL>");
if(xctx->graph_flags & 4) { /* if cursor2 is enabled in first graph setup schematic annotation */ if(xctx->graph_flags & 4) { /* if cursor2 is enabled in first graph setup schematic annotation */
@ -1075,11 +1075,11 @@ int raw_read(const char *f, Raw **rawptr, const char *type, int no_warning, doub
} }
int raw_renamevar(const char *old_name, const char *new_name) int raw_renamevar(const char *old_name, const char *new_name)
{ {
int n, ret = 0; int n, ret = 0;
Raw *raw = xctx->raw; Raw *raw = xctx->raw;
Int_hashentry *entry; Int_hashentry *entry;
n = get_raw_index(old_name, &entry); n = get_raw_index(old_name, &entry);
if(n < 0) return ret; if(n < 0) return ret;
dbg(1, "n=%d, %s \n", n, entry->token); dbg(1, "n=%d, %s \n", n, entry->token);
@ -1087,14 +1087,14 @@ int raw_renamevar(const char *old_name, const char *new_name)
my_strdup2(_ALLOC_ID_, &raw->names[n], new_name); my_strdup2(_ALLOC_ID_, &raw->names[n], new_name);
int_hash_lookup(&raw->table, raw->names[n], n, XINSERT); /* update hash table */ int_hash_lookup(&raw->table, raw->names[n], n, XINSERT); /* update hash table */
ret = 1; ret = 1;
return ret; return ret;
} }
int raw_deletevar(const char *name) int raw_deletevar(const char *name)
{ {
int ret = 0; int ret = 0;
int i, n; int i, n;
Raw *raw = xctx->raw; Raw *raw = xctx->raw;
Int_hashentry *entry; Int_hashentry *entry;
n = get_raw_index(name, &entry); n = get_raw_index(name, &entry);
@ -1145,12 +1145,12 @@ int new_rawfile(const char *name, const char *type, const char *sweepvar,
xctx->raw = my_calloc(_ALLOC_ID_, 1, sizeof(Raw)); xctx->raw = my_calloc(_ALLOC_ID_, 1, sizeof(Raw));
raw = xctx->raw; raw = xctx->raw;
raw->level = -1; raw->level = -1;
raw->sweep1 = -1.0; raw->sweep1 = -1.0;
raw->sweep2 = -1.0; raw->sweep2 = -1.0;
raw->annot_p = -1; raw->annot_p = -1;
raw->annot_sweep_idx = -1; raw->annot_sweep_idx = -1;
int_hash_init(&raw->table, HASHSIZE); int_hash_init(&raw->table, HASHSIZE);
my_strdup2(_ALLOC_ID_, &raw->rawfile, name); my_strdup2(_ALLOC_ID_, &raw->rawfile, name);
my_strdup2(_ALLOC_ID_, &raw->schname, xctx->sch[xctx->currsch]); my_strdup2(_ALLOC_ID_, &raw->schname, xctx->sch[xctx->currsch]);
@ -1181,7 +1181,7 @@ int new_rawfile(const char *name, const char *type, const char *sweepvar,
} else { /* file found: switch to it */ } else { /* file found: switch to it */
dbg(1, "new_rawfile() %d read: found: switch to it\n", i); dbg(1, "new_rawfile() %d read: found: switch to it\n", i);
xctx->extra_prev_idx = xctx->extra_idx; xctx->extra_prev_idx = xctx->extra_idx;
xctx->extra_idx = i; xctx->extra_idx = i;
xctx->raw = xctx->extra_raw_arr[xctx->extra_idx]; xctx->raw = xctx->extra_raw_arr[xctx->extra_idx];
ret = 0; ret = 0;
} }
@ -1194,7 +1194,7 @@ int new_rawfile(const char *name, const char *type, const char *sweepvar,
/* what == 0: do nothing and return 0 /* what == 0: do nothing and return 0
* what == 1: read another raw file and switch to it (make it the current one) * what == 1: read another raw file and switch to it (make it the current one)
* if type == table use table_read() to read an ascii table * if type == table use table_read() to read an ascii table
* what == 2: switch raw file. If filename given switch to that one, * what == 2: switch raw file. If filename given switch to that one,
* else if filename is an integer switch to that raw file index, * else if filename is an integer switch to that raw file index,
* else switch to next * else switch to next
* what == 3: remove a raw file. If no filename given remove all * what == 3: remove a raw file. If no filename given remove all
@ -1229,11 +1229,11 @@ int extra_rawfile(int what, const char *file, const char *type, double sweep1, d
dbg(1, "extra_rawfile: table_read: f=%s\n", f); dbg(1, "extra_rawfile: table_read: f=%s\n", f);
for(i = 0; i < xctx->extra_raw_n; i++) { for(i = 0; i < xctx->extra_raw_n; i++) {
if( !strcmp(xctx->extra_raw_arr[i]->rawfile, f)) break; if( !strcmp(xctx->extra_raw_arr[i]->rawfile, f)) break;
} }
if(i >= xctx->extra_raw_n) { /* file not already loaded: read it and switch to it */ if(i >= xctx->extra_raw_n) { /* file not already loaded: read it and switch to it */
int read_ret = 0; int read_ret = 0;
Raw *save; Raw *save;
save = xctx->raw; save = xctx->raw;
xctx->raw = NULL; xctx->raw = NULL;
read_ret = table_read(f); read_ret = table_read(f);
if(read_ret) { if(read_ret) {
@ -1255,7 +1255,7 @@ int extra_rawfile(int what, const char *file, const char *type, double sweep1, d
} else { /* file found: switch to it */ } else { /* file found: switch to it */
dbg(1, "extra_rawfile() %d read: found: switch to it\n", i); dbg(1, "extra_rawfile() %d read: found: switch to it\n", i);
xctx->extra_prev_idx = xctx->extra_idx; xctx->extra_prev_idx = xctx->extra_idx;
xctx->extra_idx = i; xctx->extra_idx = i;
xctx->raw = xctx->extra_raw_arr[xctx->extra_idx]; xctx->raw = xctx->extra_raw_arr[xctx->extra_idx];
} }
/* **************** read ************* */ /* **************** read ************* */
@ -1267,7 +1267,7 @@ int extra_rawfile(int what, const char *file, const char *type, double sweep1, d
else if(!my_strcasecmp(type, "sp")) type = "ac"; else if(!my_strcasecmp(type, "sp")) type = "ac";
} }
for(i = 0; i < xctx->extra_raw_n; i++) { for(i = 0; i < xctx->extra_raw_n; i++) {
if(xctx->extra_raw_arr[i]->sim_type && if(xctx->extra_raw_arr[i]->sim_type &&
!strcmp(xctx->extra_raw_arr[i]->rawfile, f) && !strcmp(xctx->extra_raw_arr[i]->rawfile, f) &&
(!type || !strcmp(xctx->extra_raw_arr[i]->sim_type, type) ) (!type || !strcmp(xctx->extra_raw_arr[i]->sim_type, type) )
) break; ) break;
@ -1328,7 +1328,7 @@ int extra_rawfile(int what, const char *file, const char *type, double sweep1, d
i = atoi(file); i = atoi(file);
if(i >= 0 && i < xctx->extra_raw_n) { /* if file found switch to it ... */ if(i >= 0 && i < xctx->extra_raw_n) { /* if file found switch to it ... */
dbg(1, "extra_rawfile() switch %d: found: switch %d to it\n", xctx->extra_idx, i); dbg(1, "extra_rawfile() switch %d: found: switch %d to it\n", xctx->extra_idx, i);
xctx->extra_prev_idx = xctx->extra_idx; xctx->extra_prev_idx = xctx->extra_idx;
xctx->extra_idx = i; xctx->extra_idx = i;
} else { } else {
if(!no_warning) { if(!no_warning) {
@ -1429,7 +1429,7 @@ int extra_rawfile(int what, const char *file, const char *type, double sweep1, d
dbg(1, "extra_raw_n = %d\n", xctx->extra_raw_n); dbg(1, "extra_raw_n = %d\n", xctx->extra_raw_n);
Tcl_AppendResult(interp, my_itoa(xctx->extra_idx), " current\n", NULL); Tcl_AppendResult(interp, my_itoa(xctx->extra_idx), " current\n", NULL);
for(i = 0; i < xctx->extra_raw_n; i++) { for(i = 0; i < xctx->extra_raw_n; i++) {
Tcl_AppendResult(interp, my_itoa(i), " ", xctx->extra_raw_arr[i]->rawfile, " ", Tcl_AppendResult(interp, my_itoa(i), " ", xctx->extra_raw_arr[i]->rawfile, " ",
xctx->extra_raw_arr[i]->sim_type ? xctx->extra_raw_arr[i]->sim_type : "<NULL>", "\n", NULL); xctx->extra_raw_arr[i]->sim_type ? xctx->extra_raw_arr[i]->sim_type : "<NULL>", "\n", NULL);
} }
} }
@ -1456,7 +1456,7 @@ int update_op()
} }
Tcl_SetVar2(interp, "ngspice::ngspice_data", "n\\ vars", my_itoa( xctx->raw->nvars), TCL_GLOBAL_ONLY); Tcl_SetVar2(interp, "ngspice::ngspice_data", "n\\ vars", my_itoa( xctx->raw->nvars), TCL_GLOBAL_ONLY);
Tcl_SetVar2(interp, "ngspice::ngspice_data", "n\\ points", "1", TCL_GLOBAL_ONLY); Tcl_SetVar2(interp, "ngspice::ngspice_data", "n\\ points", "1", TCL_GLOBAL_ONLY);
} }
return res; return res;
} }
@ -1504,7 +1504,7 @@ int table_read(const char *f)
xctx->raw = my_calloc(_ALLOC_ID_, 1, sizeof(Raw)); xctx->raw = my_calloc(_ALLOC_ID_, 1, sizeof(Raw));
raw = xctx->raw; raw = xctx->raw;
raw->level = -1; raw->level = -1;
raw->annot_p = -1; raw->annot_p = -1;
raw->annot_sweep_idx = -1; raw->annot_sweep_idx = -1;
@ -1688,8 +1688,8 @@ int get_raw_index(const char *node, Int_hashentry **entry_ret)
return -1; return -1;
} }
/* store calculated custom graph data for later retrieval as in running average calculations /* store calculated custom graph data for later retrieval as in running average calculations
* what: * what:
* 0: clear data * 0: clear data
* 1: store value * 1: store value
* 2: retrieve value * 2: retrieve value
@ -1700,7 +1700,7 @@ static double ravg_store(int what , int i, int p, int last, double value)
static double **arr = NULL; static double **arr = NULL;
int j; int j;
/* /*
dbg(0, "ravg_store: what= %d i= %d p= %d last= %d value=%g\n", dbg(0, "ravg_store: what= %d i= %d p= %d last= %d value=%g\n",
what, i, p, last, value); what, i, p, last, value);
*/ */
@ -2022,7 +2022,7 @@ int plot_raw_custom_data(int sweep_idx, int first, int last, const char *expr, c
stack1[i].prev = result; stack1[i].prev = result;
} }
ravg_store(1, i, p, last, result); ravg_store(1, i, p, last, result);
while(stack1[i].prevp <= last && x[p] - x[stack1[i].prevp] > stack2[stackptr2 - 1]) { while(stack1[i].prevp <= last && x[p] - x[stack1[i].prevp] > stack2[stackptr2 - 1]) {
/* dbg(1, "%g --> %g\n", x[stack1[i].prevp], x[p]); */ /* dbg(1, "%g --> %g\n", x[stack1[i].prevp], x[p]); */
stack1[i].prevp++; stack1[i].prevp++;
@ -2071,7 +2071,7 @@ int plot_raw_custom_data(int sweep_idx, int first, int last, const char *expr, c
stack1[i].prev = stack2[stackptr2 - 1]; stack1[i].prev = stack2[stackptr2 - 1];
} else { } else {
if((x[p] != x[first])) { if((x[p] != x[first])) {
avg = stack1[i].prev * (x[p - 1] - x[first]) + avg = stack1[i].prev * (x[p - 1] - x[first]) +
(x[p] - x[p - 1]) * (stack1[i].prevy + stack2[stackptr2 - 1]) * 0.5; (x[p] - x[p - 1]) * (stack1[i].prevy + stack2[stackptr2 - 1]) * 0.5;
avg /= (x[p] - x[first]); avg /= (x[p] - x[first]);
} else { } else {
@ -2086,7 +2086,7 @@ int plot_raw_custom_data(int sweep_idx, int first, int last, const char *expr, c
stack2[stackptr2] = stack2[stackptr2 - 1]; stack2[stackptr2] = stack2[stackptr2 - 1];
stackptr2++; stackptr2++;
break; break;
case INTEG: case INTEG:
if( p == first ) { if( p == first ) {
result = 0; result = 0;
stack1[i].prevy = stack2[stackptr2 - 1]; stack1[i].prevy = stack2[stackptr2 - 1];
@ -2098,13 +2098,13 @@ int plot_raw_custom_data(int sweep_idx, int first, int last, const char *expr, c
} }
stack2[stackptr2 - 1] = result; stack2[stackptr2 - 1] = result;
break; break;
case DERIV: case DERIV:
if( p == first ) { if( p == first ) {
result = 0; result = 0;
stack1[i].prevy = stack2[stackptr2 - 1]; stack1[i].prevy = stack2[stackptr2 - 1];
stack1[i].prev = 0; stack1[i].prev = 0;
} else { } else {
if((x[p] != x[p - 1])) if((x[p] != x[p - 1]))
result = (stack2[stackptr2 - 1] - stack1[i].prevy) / (x[p] - x[p - 1]); result = (stack2[stackptr2 - 1] - stack1[i].prevy) / (x[p] - x[p - 1]);
else else
result = stack1[i].prev; result = stack1[i].prev;
@ -2150,7 +2150,7 @@ int plot_raw_custom_data(int sweep_idx, int first, int last, const char *expr, c
double fa = stack1[i].prevprevy; double fa = stack1[i].prevprevy;
double fb = stack1[i].prevy; double fb = stack1[i].prevy;
double fc = stack2[stackptr2 - 1]; double fc = stack2[stackptr2 - 1];
if(a != 0.0) if(a != 0.0)
result = (fa - b_on_d * fb - (1 - b_on_d) * fc ) / (a - c * b_on_d); result = (fa - b_on_d * fb - (1 - b_on_d) * fc ) / (a - c * b_on_d);
else else
result = stack1[i].prev; result = stack1[i].prev;
@ -2273,8 +2273,8 @@ int plot_raw_custom_data(int sweep_idx, int first, int last, const char *expr, c
stack2[stackptr2 - 1] = 20 * mylog10(stack2[stackptr2 - 1]); stack2[stackptr2 - 1] = 20 * mylog10(stack2[stackptr2 - 1]);
break; break;
case SGN: case SGN:
stack2[stackptr2 - 1] = stack2[stackptr2 - 1] > 0.0 ? 1 : stack2[stackptr2 - 1] = stack2[stackptr2 - 1] > 0.0 ? 1 :
stack2[stackptr2 - 1] < 0.0 ? -1 : 0; stack2[stackptr2 - 1] < 0.0 ? -1 : 0;
break; break;
} /* switch(...) */ } /* switch(...) */
} /* if(stackptr2 > 0) */ } /* if(stackptr2 > 0) */
@ -2289,7 +2289,7 @@ double get_raw_value(int dataset, int idx, int point)
{ {
int i, ofs; int i, ofs;
ofs = 0; ofs = 0;
if(dataset >= xctx->raw->datasets) { if(dataset >= xctx->raw->datasets) {
dbg(0, "get_raw_value(): dataset(%d) >= datasets(%d)\n", dataset, xctx->raw->datasets); dbg(0, "get_raw_value(): dataset(%d) >= datasets(%d)\n", dataset, xctx->raw->datasets);
} }
if(xctx->raw && xctx->raw->values && dataset < xctx->raw->datasets) { if(xctx->raw && xctx->raw->values && dataset < xctx->raw->datasets) {
@ -2841,7 +2841,7 @@ static void load_inst(int k, FILE *fd)
#ifdef __unix__ #ifdef __unix__
if(name[0] == '/') my_strdup2(_ALLOC_ID_, &xctx->inst[i].name, rel_sym_path(name)); if(name[0] == '/') my_strdup2(_ALLOC_ID_, &xctx->inst[i].name, rel_sym_path(name));
else my_strdup2(_ALLOC_ID_, &xctx->inst[i].name, name); else my_strdup2(_ALLOC_ID_, &xctx->inst[i].name, name);
#else #else
if(isupper(name[0]) && name[1] == ':' && name[1] == '/') my_strdup2(_ALLOC_ID_, &xctx->inst[i].name, rel_sym_path(name)); if(isupper(name[0]) && name[1] == ':' && name[1] == '/') my_strdup2(_ALLOC_ID_, &xctx->inst[i].name, rel_sym_path(name));
else my_strdup2(_ALLOC_ID_, &xctx->inst[i].name, name); else my_strdup2(_ALLOC_ID_, &xctx->inst[i].name, name);
#endif #endif
@ -3096,10 +3096,10 @@ static void read_xschem_file(FILE *fd)
if((ptr2 = strstr(xctx->version_string, "xschem")) && (ptr2 - xctx->version_string < 50)) { if((ptr2 = strstr(xctx->version_string, "xschem")) && (ptr2 - xctx->version_string < 50)) {
my_strdup2(_ALLOC_ID_, &ptr, subst_token(xctx->version_string, "xschem", NULL)); my_strdup2(_ALLOC_ID_, &ptr, subst_token(xctx->version_string, "xschem", NULL));
} }
my_strdup2(_ALLOC_ID_, &ptr, subst_token(ptr, "version", NULL)); my_strdup2(_ALLOC_ID_, &ptr, subst_token(ptr, "version", NULL));
my_strdup2(_ALLOC_ID_, &ptr, subst_token(ptr, "file_version", NULL)); my_strdup2(_ALLOC_ID_, &ptr, subst_token(ptr, "file_version", NULL));
ptr2 = ptr; ptr2 = ptr;
while(*ptr2 == ' ' || *ptr2 =='\t') ptr2++; /* strip leading spaces */ while(*ptr2 == ' ' || *ptr2 =='\t') ptr2++; /* strip leading spaces */
if(*ptr2 == '\n') ptr2++; /* strip leading newline */ if(*ptr2 == '\n') ptr2++; /* strip leading newline */
@ -3186,7 +3186,7 @@ static void read_xschem_file(FILE *fd)
str = read_line(fd, 1); str = read_line(fd, 1);
if(!str || !strncmp(str, "]", 1)) break; if(!str || !strncmp(str, "]", 1)) break;
n = fscanf(fd, " "); n = fscanf(fd, " ");
(void)n; /* avoid compiler warnings if n unused. can not remove n since ignoring (void)n; /* avoid compiler warnings if n unused. can not remove n since ignoring
* fscanf return value yields another warning */ * fscanf return value yields another warning */
} }
} }
@ -3312,7 +3312,7 @@ static int pin_compare(const void *a, const void *b)
int result; int result;
xRect *aa = (xRect *)a; xRect *aa = (xRect *)a;
xRect *bb = (xRect *)b; xRect *bb = (xRect *)b;
tmp = get_tok_value(aa->prop_ptr, "sim_pinnumber", 0); tmp = get_tok_value(aa->prop_ptr, "sim_pinnumber", 0);
pinnumber_a = tmp[0] ? atoi(tmp) : -1; pinnumber_a = tmp[0] ? atoi(tmp) : -1;
tmp = get_tok_value(bb->prop_ptr, "sim_pinnumber", 0); tmp = get_tok_value(bb->prop_ptr, "sim_pinnumber", 0);
@ -3358,7 +3358,7 @@ static void sort_symbol_pins(xRect *pin_array, int npins, const char *name)
/* Caller must free returned pointer (if not NULL) /* Caller must free returned pointer (if not NULL)
* number of i/o ports found returned into npins */ * number of i/o ports found returned into npins */
Sch_pin_record *sort_schematic_pins(int *npins) Sch_pin_record *sort_schematic_pins(int *npins)
{ {
int i, do_sort = -1; int i, do_sort = -1;
const char *pinnumber; const char *pinnumber;
Sch_pin_record *pinnumber_list = NULL; Sch_pin_record *pinnumber_list = NULL;
@ -3396,9 +3396,9 @@ Sch_pin_record *sort_schematic_pins(int *npins)
} }
if(do_sort) { if(do_sort) {
qsort(pinnumber_list, *npins, sizeof(Sch_pin_record), schpin_compare); qsort(pinnumber_list, *npins, sizeof(Sch_pin_record), schpin_compare);
} }
return pinnumber_list; return pinnumber_list;
} }
/* ALWAYS call with absolute path in schname!!! */ /* ALWAYS call with absolute path in schname!!! */
/* return value: /* return value:
@ -3455,7 +3455,7 @@ int save_schematic(const char *schname, int fast) /* 20171020 added return value
my_snprintf(msg, S(msg), "get_directory {%s}", schname); my_snprintf(msg, S(msg), "get_directory {%s}", schname);
my_strncpy(xctx->current_dirname, tcleval(msg), S(xctx->current_dirname)); my_strncpy(xctx->current_dirname, tcleval(msg), S(xctx->current_dirname));
/* why clear all these? */ /* why clear all these? */
/* /*
* xctx->prep_hi_structs=0; * xctx->prep_hi_structs=0;
* xctx->prep_net_structs=0; * xctx->prep_net_structs=0;
* xctx->prep_hash_inst=0; * xctx->prep_hash_inst=0;
@ -3502,7 +3502,7 @@ void link_symbols_to_instances(int from)
} }
else xctx->inst[i].flags &= ~PIN_OR_LABEL; /* ordinary symbol */ else xctx->inst[i].flags &= ~PIN_OR_LABEL; /* ordinary symbol */
} }
/* symbol_bbox() might call translate() that might call prepare_netlist_structs() that /* symbol_bbox() might call translate() that might call prepare_netlist_structs() that
* needs .lab field set above, so this must be done last */ * needs .lab field set above, so this must be done last */
for(i = from; i < xctx->instances; ++i) { for(i = from; i < xctx->instances; ++i) {
symbol_bbox(i, &xctx->inst[i].x1, &xctx->inst[i].y1, &xctx->inst[i].x2, &xctx->inst[i].y2); symbol_bbox(i, &xctx->inst[i].x1, &xctx->inst[i].y1, &xctx->inst[i].x2, &xctx->inst[i].y2);
@ -3520,7 +3520,7 @@ int load_schematic(int load_symbols, const char *fname, int reset_undo, int aler
char msg[PATH_MAX+100]; char msg[PATH_MAX+100];
struct stat buf; struct stat buf;
int i, ret = 1; /* success */ int i, ret = 1; /* success */
xctx->prep_hi_structs=0; xctx->prep_hi_structs=0;
xctx->prep_net_structs=0; xctx->prep_net_structs=0;
xctx->prep_hash_inst=0; xctx->prep_hash_inst=0;
@ -3562,10 +3562,10 @@ int load_schematic(int load_symbols, const char *fname, int reset_undo, int aler
my_snprintf(sympath, S(sympath), "%s", xschem_web_dirname); my_snprintf(sympath, S(sympath), "%s", xschem_web_dirname);
/* ffname does not begin with $XSCHEM_TMP_DIR/xschem_web and ffname does not exist */ /* ffname does not begin with $XSCHEM_TMP_DIR/xschem_web and ffname does not exist */
if(strstr(ffname, sympath) != ffname /* && stat(ffname, &buf)*/) { if(strstr(ffname, sympath) != ffname /* && stat(ffname, &buf)*/) {
my_snprintf(msg, S(msg), "get_directory {%s}", ffname); my_snprintf(msg, S(msg), "get_directory {%s}", ffname);
my_strncpy(xctx->current_dirname, tcleval(msg), S(xctx->current_dirname)); my_strncpy(xctx->current_dirname, tcleval(msg), S(xctx->current_dirname));
} }
/* local file name */ /* local file name */
my_strdup2(_ALLOC_ID_, &xctx->sch[xctx->currsch], ffname); my_strdup2(_ALLOC_ID_, &xctx->sch[xctx->currsch], ffname);
/* local relative reference */ /* local relative reference */
@ -3764,7 +3764,7 @@ void push_undo(void)
/* the following 2 statements are a replacement for dup2() which is not c89 /* the following 2 statements are a replacement for dup2() which is not c89
* however these are not atomic, if another thread takes stdin * however these are not atomic, if another thread takes stdin
* in between we are in trouble */ * in between we are in trouble */
#if(HAS_DUP2) #if(HAS_DUP2)
dup2(pd[0], 0); dup2(pd[0], 0);
#else #else
close(0); /* close stdin */ close(0); /* close stdin */
@ -3801,7 +3801,7 @@ void push_undo(void)
} }
/* redo: /* redo:
* 0: undo (with push current state for allowing following redo) * 0: undo (with push current state for allowing following redo)
* 4: undo, do not push state for redo * 4: undo, do not push state for redo
* 1: redo * 1: redo
* 2: read top data from undo stack without changing undo stack * 2: read top data from undo stack without changing undo stack
@ -3921,7 +3921,7 @@ void pop_undo(int redo, int set_modify_status)
* return symbol type in type pointer or "" if no type or no symbol found * return symbol type in type pointer or "" if no type or no symbol found
* if pintable given (!=NULL) hash all symbol pins * if pintable given (!=NULL) hash all symbol pins
* if embed_fd is not NULL read symbol from embedded '[...]' tags using embed_fd file pointer */ * if embed_fd is not NULL read symbol from embedded '[...]' tags using embed_fd file pointer */
void get_sym_type(const char *symname, char **type, void get_sym_type(const char *symname, char **type,
Int_hashtable *pintable, FILE *embed_fd, int *sym_n_pins) Int_hashtable *pintable, FILE *embed_fd, int *sym_n_pins)
{ {
int i, c, n = 0; int i, c, n = 0;
@ -3953,7 +3953,7 @@ void get_sym_type(const char *symname, char **type,
if( !found ) { if( !found ) {
dbg(1, "get_sym_type(): open file %s, pintable %s\n",name, pintable ? "set" : "<NULL>"); dbg(1, "get_sym_type(): open file %s, pintable %s\n",name, pintable ? "set" : "<NULL>");
/* ... if not found open file and look for 'type' into the global attributes. */ /* ... if not found open file and look for 'type' into the global attributes. */
if(embed_fd) fd = embed_fd; if(embed_fd) fd = embed_fd;
else fd=my_fopen(name,fopen_read_mode); else fd=my_fopen(name,fopen_read_mode);
@ -4417,7 +4417,7 @@ int load_sym_def(const char *name, FILE *embed_fd)
read_line(lcc[level].fd, 0); read_line(lcc[level].fd, 0);
continue; continue;
} }
if(fscanf(lcc[level].fd, "%lf %lf %lf %lf ",&tmpline.x1, &tmpline.y1, if(fscanf(lcc[level].fd, "%lf %lf %lf %lf ",&tmpline.x1, &tmpline.y1,
&tmpline.x2, &tmpline.y2) < 4 ) { &tmpline.x2, &tmpline.y2) < 4 ) {
fprintf(errfp,"l_s_d(): WARNING: missing fields for LINE object, ignoring\n"); fprintf(errfp,"l_s_d(): WARNING: missing fields for LINE object, ignoring\n");
@ -4426,21 +4426,21 @@ int load_sym_def(const char *name, FILE *embed_fd)
} }
tmpline.prop_ptr = NULL; tmpline.prop_ptr = NULL;
load_ascii_string(&tmpline.prop_ptr, lcc[level].fd); load_ascii_string(&tmpline.prop_ptr, lcc[level].fd);
if( !strboolcmp(get_tok_value(tmpline.prop_ptr, "symbol_ignore", 0), "true")) { if( !strboolcmp(get_tok_value(tmpline.prop_ptr, "symbol_ignore", 0), "true")) {
my_free(_ALLOC_ID_, &tmpline.prop_ptr); my_free(_ALLOC_ID_, &tmpline.prop_ptr);
continue; continue;
} }
i=lastl[c]; i=lastl[c];
my_realloc(_ALLOC_ID_, &ll[c],(i+1)*sizeof(xLine)); my_realloc(_ALLOC_ID_, &ll[c],(i+1)*sizeof(xLine));
ll[c][i].x1 = tmpline.x1; ll[c][i].x1 = tmpline.x1;
ll[c][i].y1 = tmpline.y1; ll[c][i].y1 = tmpline.y1;
ll[c][i].x2 = tmpline.x2; ll[c][i].x2 = tmpline.x2;
ll[c][i].y2 = tmpline.y2; ll[c][i].y2 = tmpline.y2;
ll[c][i].prop_ptr = tmpline.prop_ptr; ll[c][i].prop_ptr = tmpline.prop_ptr;
if (level>0) { if (level>0) {
rot = lcc[level].rot; flip = lcc[level].flip; rot = lcc[level].rot; flip = lcc[level].flip;
ROTATION(rot, flip, 0.0, 0.0, ll[c][i].x1, ll[c][i].y1, rx1, ry1); ROTATION(rot, flip, 0.0, 0.0, ll[c][i].x1, ll[c][i].y1, rx1, ry1);
@ -4471,7 +4471,7 @@ int load_sym_def(const char *name, FILE *embed_fd)
read_line(lcc[level].fd, 0); read_line(lcc[level].fd, 0);
continue; continue;
} }
tmppoly.x = my_calloc(_ALLOC_ID_, poly_points, sizeof(double)); tmppoly.x = my_calloc(_ALLOC_ID_, poly_points, sizeof(double));
tmppoly.y = my_calloc(_ALLOC_ID_, poly_points, sizeof(double)); tmppoly.y = my_calloc(_ALLOC_ID_, poly_points, sizeof(double));
tmppoly.selected_point = my_calloc(_ALLOC_ID_, poly_points, sizeof(unsigned short)); tmppoly.selected_point = my_calloc(_ALLOC_ID_, poly_points, sizeof(unsigned short));
@ -4486,27 +4486,27 @@ int load_sym_def(const char *name, FILE *embed_fd)
tmppoly.x[k] = lcc[level].x0 + rx1; tmppoly.y[k] = lcc[level].y0 + ry1; tmppoly.x[k] = lcc[level].x0 + rx1; tmppoly.y[k] = lcc[level].y0 + ry1;
} }
} }
tmppoly.prop_ptr=NULL; tmppoly.prop_ptr=NULL;
load_ascii_string( &tmppoly.prop_ptr, lcc[level].fd); load_ascii_string( &tmppoly.prop_ptr, lcc[level].fd);
if( !strboolcmp(get_tok_value(tmppoly.prop_ptr, "symbol_ignore", 0), "true")) { if( !strboolcmp(get_tok_value(tmppoly.prop_ptr, "symbol_ignore", 0), "true")) {
my_free(_ALLOC_ID_, &tmppoly.prop_ptr); my_free(_ALLOC_ID_, &tmppoly.prop_ptr);
my_free(_ALLOC_ID_, &tmppoly.x); my_free(_ALLOC_ID_, &tmppoly.x);
my_free(_ALLOC_ID_, &tmppoly.y); my_free(_ALLOC_ID_, &tmppoly.y);
my_free(_ALLOC_ID_, &tmppoly.selected_point); my_free(_ALLOC_ID_, &tmppoly.selected_point);
continue; continue;
} }
i=lastp[c]; i=lastp[c];
my_realloc(_ALLOC_ID_, &pp[c],(i+1)*sizeof(xPoly)); my_realloc(_ALLOC_ID_, &pp[c],(i+1)*sizeof(xPoly));
pp[c][i].x = tmppoly.x; pp[c][i].x = tmppoly.x;
pp[c][i].y = tmppoly.y; pp[c][i].y = tmppoly.y;
pp[c][i].selected_point = tmppoly.selected_point; pp[c][i].selected_point = tmppoly.selected_point;
pp[c][i].prop_ptr = tmppoly.prop_ptr; pp[c][i].prop_ptr = tmppoly.prop_ptr;
pp[c][i].points = poly_points; pp[c][i].points = poly_points;
fill_ptr = get_tok_value(pp[c][i].prop_ptr,"fill",0); fill_ptr = get_tok_value(pp[c][i].prop_ptr,"fill",0);
if( !strcmp(fill_ptr, "full") ) if( !strcmp(fill_ptr, "full") )
pp[c][i].fill = 2; /* bit 1: solid fill (not stippled) */ pp[c][i].fill = 2; /* bit 1: solid fill (not stippled) */
@ -4514,14 +4514,14 @@ int load_sym_def(const char *name, FILE *embed_fd)
pp[c][i].fill = 1; pp[c][i].fill = 1;
else else
pp[c][i].fill = 0; pp[c][i].fill = 0;
attr = get_tok_value(pp[c][i].prop_ptr,"dash", 0); attr = get_tok_value(pp[c][i].prop_ptr,"dash", 0);
if( strcmp(attr, "") ) { if( strcmp(attr, "") ) {
int d = atoi(attr); int d = atoi(attr);
pp[c][i].dash = (short)(d >= 0 ? d : 0); pp[c][i].dash = (short)(d >= 0 ? d : 0);
} else } else
pp[c][i].dash = 0; pp[c][i].dash = 0;
pp[c][i].sel = 0; pp[c][i].sel = 0;
pp[c][i].bus = get_attr_val(get_tok_value(pp[c][i].prop_ptr,"bus", 0)); pp[c][i].bus = get_attr_val(get_tok_value(pp[c][i].prop_ptr,"bus", 0));
dbg(2, "l_s_d(): loaded polygon: ptr=%lx\n", (unsigned long)pp[c]); dbg(2, "l_s_d(): loaded polygon: ptr=%lx\n", (unsigned long)pp[c]);
@ -4534,7 +4534,7 @@ int load_sym_def(const char *name, FILE *embed_fd)
read_line(lcc[level].fd, 0); read_line(lcc[level].fd, 0);
continue; continue;
} }
if( fscanf(lcc[level].fd, "%lf %lf %lf %lf %lf ",&tmparc.x, &tmparc.y, if( fscanf(lcc[level].fd, "%lf %lf %lf %lf %lf ",&tmparc.x, &tmparc.y,
&tmparc.r, &tmparc.a, &tmparc.b) < 5 ) { &tmparc.r, &tmparc.a, &tmparc.b) < 5 ) {
fprintf(errfp,"l_s_d(): WARNING: missing fields for ARC object, ignoring\n"); fprintf(errfp,"l_s_d(): WARNING: missing fields for ARC object, ignoring\n");
@ -4543,22 +4543,22 @@ int load_sym_def(const char *name, FILE *embed_fd)
} }
tmparc.prop_ptr = NULL; tmparc.prop_ptr = NULL;
load_ascii_string( &tmparc.prop_ptr, lcc[level].fd); load_ascii_string( &tmparc.prop_ptr, lcc[level].fd);
if( !strboolcmp(get_tok_value(tmparc.prop_ptr, "symbol_ignore", 0), "true")) { if( !strboolcmp(get_tok_value(tmparc.prop_ptr, "symbol_ignore", 0), "true")) {
my_free(_ALLOC_ID_, &tmparc.prop_ptr); my_free(_ALLOC_ID_, &tmparc.prop_ptr);
continue; continue;
} }
i=lasta[c]; i=lasta[c];
my_realloc(_ALLOC_ID_, &aa[c],(i+1)*sizeof(xArc)); my_realloc(_ALLOC_ID_, &aa[c],(i+1)*sizeof(xArc));
aa[c][i].x = tmparc.x; aa[c][i].x = tmparc.x;
aa[c][i].y = tmparc.y; aa[c][i].y = tmparc.y;
aa[c][i].r = tmparc.r; aa[c][i].r = tmparc.r;
aa[c][i].a = tmparc.a; aa[c][i].a = tmparc.a;
aa[c][i].b = tmparc.b; aa[c][i].b = tmparc.b;
aa[c][i].prop_ptr = tmparc.prop_ptr; aa[c][i].prop_ptr = tmparc.prop_ptr;
if (level>0) { if (level>0) {
rot = lcc[level].rot; flip = lcc[level].flip; rot = lcc[level].rot; flip = lcc[level].flip;
if (flip) { if (flip) {
@ -4598,7 +4598,7 @@ int load_sym_def(const char *name, FILE *embed_fd)
read_line(lcc[level].fd, 0); read_line(lcc[level].fd, 0);
continue; continue;
} }
if(fscanf(lcc[level].fd, "%lf %lf %lf %lf ",&tmprect.x1, &tmprect.y1, if(fscanf(lcc[level].fd, "%lf %lf %lf %lf ",&tmprect.x1, &tmprect.y1,
&tmprect.x2, &tmprect.y2) < 4 ) { &tmprect.x2, &tmprect.y2) < 4 ) {
fprintf(errfp,"l_s_d(): WARNING: missing fields for LINE object, ignoring\n"); fprintf(errfp,"l_s_d(): WARNING: missing fields for LINE object, ignoring\n");
@ -4607,22 +4607,22 @@ int load_sym_def(const char *name, FILE *embed_fd)
} }
tmprect.prop_ptr = NULL; tmprect.prop_ptr = NULL;
load_ascii_string(&tmprect.prop_ptr, lcc[level].fd); load_ascii_string(&tmprect.prop_ptr, lcc[level].fd);
if( !strboolcmp(get_tok_value(tmprect.prop_ptr, "symbol_ignore", 0), "true")) { if( !strboolcmp(get_tok_value(tmprect.prop_ptr, "symbol_ignore", 0), "true")) {
my_free(_ALLOC_ID_, &tmprect.prop_ptr); my_free(_ALLOC_ID_, &tmprect.prop_ptr);
continue; continue;
} }
if (level>0 && c == PINLAYER) c = 7; /* Don't care about pins inside SYM: set on different layer */ if (level>0 && c == PINLAYER) c = 7; /* Don't care about pins inside SYM: set on different layer */
i=lastr[c]; i=lastr[c];
my_realloc(_ALLOC_ID_, &bb[c],(i+1)*sizeof(xRect)); my_realloc(_ALLOC_ID_, &bb[c],(i+1)*sizeof(xRect));
bb[c][i].x1 = tmprect.x1; bb[c][i].x1 = tmprect.x1;
bb[c][i].y1 = tmprect.y1; bb[c][i].y1 = tmprect.y1;
bb[c][i].x2 = tmprect.x2; bb[c][i].x2 = tmprect.x2;
bb[c][i].y2 = tmprect.y2; bb[c][i].y2 = tmprect.y2;
bb[c][i].prop_ptr = tmprect.prop_ptr; bb[c][i].prop_ptr = tmprect.prop_ptr;
if (level>0) { if (level>0) {
rot = lcc[level].rot; flip = lcc[level].flip; rot = lcc[level].rot; flip = lcc[level].flip;
ROTATION(rot, flip, 0.0, 0.0, bb[c][i].x1, bb[c][i].y1, rx1, ry1); ROTATION(rot, flip, 0.0, 0.0, bb[c][i].x1, bb[c][i].y1, rx1, ry1);
@ -4649,7 +4649,7 @@ int load_sym_def(const char *name, FILE *embed_fd)
int d = atoi(attr); int d = atoi(attr);
bb[c][i].dash = (short)(d >= 0 ? d : 0); bb[c][i].dash = (short)(d >= 0 ? d : 0);
} else bb[c][i].dash = 0; } else bb[c][i].dash = 0;
bb[c][i].bus = get_attr_val(get_tok_value(bb[c][i].prop_ptr,"bus", 0)); bb[c][i].bus = get_attr_val(get_tok_value(bb[c][i].prop_ptr,"bus", 0));
attr = get_tok_value(bb[c][i].prop_ptr,"ellipse", 0); attr = get_tok_value(bb[c][i].prop_ptr,"ellipse", 0);
if( strcmp(attr, "") ) { if( strcmp(attr, "") ) {
@ -4665,7 +4665,7 @@ int load_sym_def(const char *name, FILE *embed_fd)
bb[c][i].ellipse_a = -1; bb[c][i].ellipse_a = -1;
bb[c][i].ellipse_b = -1; bb[c][i].ellipse_b = -1;
} }
bb[c][i].sel = 0; bb[c][i].sel = 0;
bb[c][i].extraptr = NULL; bb[c][i].extraptr = NULL;
set_rect_flags(&bb[c][i]); set_rect_flags(&bb[c][i]);
@ -4681,7 +4681,7 @@ int load_sym_def(const char *name, FILE *embed_fd)
continue; continue;
} }
load_ascii_string(&tmptext.prop_ptr, lcc[level].fd); load_ascii_string(&tmptext.prop_ptr, lcc[level].fd);
is_floater = 0; is_floater = 0;
get_tok_value(tmptext.prop_ptr, "name", 2); get_tok_value(tmptext.prop_ptr, "name", 2);
if(xctx->tok_size) is_floater = 1; /* get rid of floater texts in LCC symbols */ if(xctx->tok_size) is_floater = 1; /* get rid of floater texts in LCC symbols */
@ -4748,9 +4748,9 @@ int load_sym_def(const char *name, FILE *embed_fd)
for(i = 1; i <level; ++i) { for(i = 1; i <level; ++i) {
const char *instname = get_tok_value(lcc[i].prop_ptr, "name", 0); const char *instname = get_tok_value(lcc[i].prop_ptr, "name", 0);
my_strcat(_ALLOC_ID_, &path, instname); my_strcat(_ALLOC_ID_, &path, instname);
my_strcat(_ALLOC_ID_, &path, "."); my_strcat(_ALLOC_ID_, &path, ".");
} }
} }
if(path) new_size += strlen(path); if(path) new_size += strlen(path);
dev = get_tok_value(prop_ptr, "name", 0); dev = get_tok_value(prop_ptr, "name", 0);
new_size += strlen(tt[i].txt_ptr) + strlen(dev) + 2 + 1; /* tok(<dev>) */ new_size += strlen(tt[i].txt_ptr) + strlen(dev) + 2 + 1; /* tok(<dev>) */
@ -4760,7 +4760,7 @@ int load_sym_def(const char *name, FILE *embed_fd)
tt[i].txt_ptr = txt_ptr; tt[i].txt_ptr = txt_ptr;
my_free(_ALLOC_ID_, &path); my_free(_ALLOC_ID_, &path);
dbg(1, "--> tt[i].txt_ptr=%s\n", tt[i].txt_ptr); dbg(1, "--> tt[i].txt_ptr=%s\n", tt[i].txt_ptr);
} }
ROTATION(rot, flip, 0.0, 0.0, tt[i].x0, tt[i].y0, rx1, ry1); ROTATION(rot, flip, 0.0, 0.0, tt[i].x0, tt[i].y0, rx1, ry1);
tt[i].x0 = lcc[level].x0 + rx1; tt[i].y0 = lcc[level].y0 + ry1; tt[i].x0 = lcc[level].x0 + rx1; tt[i].y0 = lcc[level].y0 + ry1;
tt[i].rot = (tt[i].rot + ((lcc[level].flip && (tt[i].rot & 1)) ? tt[i].rot = (tt[i].rot + ((lcc[level].flip && (tt[i].rot & 1)) ?
@ -4777,21 +4777,21 @@ int load_sym_def(const char *name, FILE *embed_fd)
++lastt; ++lastt;
break; break;
case 'N': /* store wires as lines on layer WIRELAYER. */ case 'N': /* store wires as lines on layer WIRELAYER. */
tmpline.prop_ptr = NULL; tmpline.prop_ptr = NULL;
if(fscanf(lcc[level].fd, "%lf %lf %lf %lf ",&tmpline.x1, &tmpline.y1, if(fscanf(lcc[level].fd, "%lf %lf %lf %lf ",&tmpline.x1, &tmpline.y1,
&tmpline.x2, &tmpline.y2) < 4 ) { &tmpline.x2, &tmpline.y2) < 4 ) {
fprintf(errfp,"l_s_d(): WARNING: missing fields for LINE object, ignoring\n"); fprintf(errfp,"l_s_d(): WARNING: missing fields for LINE object, ignoring\n");
read_line(lcc[level].fd, 0); read_line(lcc[level].fd, 0);
continue; continue;
} }
load_ascii_string(&tmpline.prop_ptr, lcc[level].fd); load_ascii_string(&tmpline.prop_ptr, lcc[level].fd);
if( !strboolcmp(get_tok_value(tmpline.prop_ptr, "symbol_ignore", 0), "true")) { if( !strboolcmp(get_tok_value(tmpline.prop_ptr, "symbol_ignore", 0), "true")) {
my_free(_ALLOC_ID_, &tmpline.prop_ptr); my_free(_ALLOC_ID_, &tmpline.prop_ptr);
continue; continue;
} }
i = lastl[WIRELAYER]; i = lastl[WIRELAYER];
my_realloc(_ALLOC_ID_, &ll[WIRELAYER],(i+1)*sizeof(xLine)); my_realloc(_ALLOC_ID_, &ll[WIRELAYER],(i+1)*sizeof(xLine));
ll[WIRELAYER][i].x1 = tmpline.x1; ll[WIRELAYER][i].x1 = tmpline.x1;
@ -4799,7 +4799,7 @@ int load_sym_def(const char *name, FILE *embed_fd)
ll[WIRELAYER][i].x2 = tmpline.x2; ll[WIRELAYER][i].x2 = tmpline.x2;
ll[WIRELAYER][i].y2 = tmpline.y2; ll[WIRELAYER][i].y2 = tmpline.y2;
ll[WIRELAYER][i].prop_ptr = tmpline.prop_ptr; ll[WIRELAYER][i].prop_ptr = tmpline.prop_ptr;
if (level>0) { if (level>0) {
rot = lcc[level].rot; flip = lcc[level].flip; rot = lcc[level].rot; flip = lcc[level].flip;
ROTATION(rot, flip, 0.0, 0.0, ll[WIRELAYER][i].x1, ll[WIRELAYER][i].y1, rx1, ry1); ROTATION(rot, flip, 0.0, 0.0, ll[WIRELAYER][i].x1, ll[WIRELAYER][i].y1, rx1, ry1);
@ -4829,7 +4829,7 @@ int load_sym_def(const char *name, FILE *embed_fd)
endfile = 1; endfile = 1;
continue; continue;
} }
if(generator) { if(generator) {
/* for generators (data from a pipe) can not inspect next line (fseek/ftell) looking for /* for generators (data from a pipe) can not inspect next line (fseek/ftell) looking for
* embedded symbols. Assume no embedded symbol follows */ * embedded symbols. Assume no embedded symbol follows */
@ -4852,7 +4852,7 @@ int load_sym_def(const char *name, FILE *embed_fd)
xfseek(lcc[level].fd, filepos, SEEK_SET); /* rewind file pointer */ xfseek(lcc[level].fd, filepos, SEEK_SET); /* rewind file pointer */
} }
dbg(1, "l_s_d(): level=%d, symname=%s symtype=%s\n", level, symname, symtype); dbg(1, "l_s_d(): level=%d, symname=%s symtype=%s\n", level, symname, symtype);
if( /* add here symbol types not to consider when loading schematic-as-symbol instances */ if( /* add here symbol types not to consider when loading schematic-as-symbol instances */
!symtype || !symtype ||
!strcmp(symtype, "logo") || !strcmp(symtype, "logo") ||
@ -4882,7 +4882,7 @@ int load_sym_def(const char *name, FILE *embed_fd)
} }
/* replace i/o/iopin.sym filename with better looking (for LCC symbol) pins */ /* replace i/o/iopin.sym filename with better looking (for LCC symbol) pins */
use_lcc_pins(level, symtype, &sympath); use_lcc_pins(level, symtype, &sympath);
dbg(1, "l_s_d(): fopen2(%s), level=%d\n",sympath, level); dbg(1, "l_s_d(): fopen2(%s), level=%d\n",sympath, level);
/* find out if symbol is in an external file or embedded, set fd_tmp accordingly */ /* find out if symbol is in an external file or embedded, set fd_tmp accordingly */
if ((fd_tmp = my_fopen(sympath, fopen_read_mode)) == NULL) { if ((fd_tmp = my_fopen(sympath, fopen_read_mode)) == NULL) {
@ -4919,7 +4919,7 @@ int load_sym_def(const char *name, FILE *embed_fd)
if (level > 1) { if (level > 1) {
short rot, flip; short rot, flip;
static const int map[4]={0,3,2,1}; static const int map[4]={0,3,2,1};
flip = lcc[level-1].flip; flip = lcc[level-1].flip;
rot = lcc[level-1].rot; rot = lcc[level-1].rot;
ROTATION(rot, flip, 0.0, 0.0, lcc[level].x0, lcc[level].y0,lcc[level].x0, lcc[level].y0); ROTATION(rot, flip, 0.0, 0.0, lcc[level].x0, lcc[level].y0,lcc[level].x0, lcc[level].y0);
@ -4932,7 +4932,7 @@ int load_sym_def(const char *name, FILE *embed_fd)
} }
my_strdup(_ALLOC_ID_, &lcc[level].prop_ptr, prop_ptr); my_strdup(_ALLOC_ID_, &lcc[level].prop_ptr, prop_ptr);
my_strdup(_ALLOC_ID_, &lcc[level].symname, symname); my_strdup(_ALLOC_ID_, &lcc[level].symname, symname);
dbg(1, "level incremented: level=%d, symname=%s, prop_ptr=%s sympath=%s\n", dbg(1, "level incremented: level=%d, symname=%s, prop_ptr=%s sympath=%s\n",
level, symname, prop_ptr, sympath); level, symname, prop_ptr, sympath);
} }
break; break;
@ -5017,7 +5017,7 @@ int load_sym_def(const char *name, FILE *embed_fd)
void make_schematic_symbol_from_sel(void) void make_schematic_symbol_from_sel(void)
{ {
char filename[PATH_MAX] = ""; char filename[PATH_MAX] = "";
char name[1024]; char name[1024];
my_snprintf(name, S(name), "save_file_dialog {Save file} * INITIALLOADDIR"); my_snprintf(name, S(name), "save_file_dialog {Save file} * INITIALLOADDIR");
tcleval(name); tcleval(name);
@ -5034,7 +5034,7 @@ void make_schematic_symbol_from_sel(void)
place_symbol(-1, filename, 0, 0, 0, 0, NULL, 4, 1, 0/*to_push_undo*/); place_symbol(-1, filename, 0, 0, 0, 0, NULL, 4, 1, 0/*to_push_undo*/);
if (has_x) if (has_x)
{ {
my_snprintf(name, S(name), my_snprintf(name, S(name),
"tk_messageBox -type okcancel -parent [xschem get topwindow] " "tk_messageBox -type okcancel -parent [xschem get topwindow] "
"-message {do you want to make symbol view for %s ?}", filename); "-message {do you want to make symbol view for %s ?}", filename);
tcleval(name); tcleval(name);
@ -5074,7 +5074,7 @@ void create_sch_from_sym(void)
my_strdup(_ALLOC_ID_, &pinname[1], tcleval("rel_sym_path [find_file_first opin.sym]")); my_strdup(_ALLOC_ID_, &pinname[1], tcleval("rel_sym_path [find_file_first opin.sym]"));
my_strdup(_ALLOC_ID_, &pinname[2], tcleval("rel_sym_path [find_file_first iopin.sym]")); my_strdup(_ALLOC_ID_, &pinname[2], tcleval("rel_sym_path [find_file_first iopin.sym]"));
my_strdup(_ALLOC_ID_, &generic_pin, tcleval("rel_sym_path [find_file_first generic_pin.sym]")); my_strdup(_ALLOC_ID_, &generic_pin, tcleval("rel_sym_path [find_file_first generic_pin.sym]"));
if(pinname[0] && pinname[1] && pinname[2] && generic_pin) { if(pinname[0] && pinname[1] && pinname[2] && generic_pin) {
rebuild_selected_array(); rebuild_selected_array();
if(xctx->lastsel > 1) return; if(xctx->lastsel > 1) return;
@ -5137,7 +5137,7 @@ void create_sch_from_sym(void)
if(!sub_prop) continue; if(!sub_prop) continue;
/* remove dir=... from prop string 20171004 */ /* remove dir=... from prop string 20171004 */
my_strdup(_ALLOC_ID_, &sub2_prop, subst_token(sub_prop, "dir", NULL)); my_strdup(_ALLOC_ID_, &sub2_prop, subst_token(sub_prop, "dir", NULL));
my_strdup(_ALLOC_ID_, &dir, get_tok_value(rct[i].prop_ptr,"dir",0)); my_strdup(_ALLOC_ID_, &dir, get_tok_value(rct[i].prop_ptr,"dir",0));
if(!sub2_prop) continue; if(!sub2_prop) continue;
if(!dir) continue; if(!dir) continue;
@ -5192,7 +5192,7 @@ int descend_symbol(void)
/* if circuit is changed but not saved before descending /* if circuit is changed but not saved before descending
* state will be inconsistent when returning, can not propagare hilights * state will be inconsistent when returning, can not propagare hilights
* save() return value: * save() return value:
* 1 : file saved * 1 : file saved
* -1 : user cancel * -1 : user cancel
* 0 : file not saved due to errors or per user request * 0 : file not saved due to errors or per user request
*/ */
@ -5222,7 +5222,7 @@ int descend_symbol(void)
xctx->inst[n].prop_ptr); xctx->inst[n].prop_ptr);
my_strdup(_ALLOC_ID_, &xctx->hier_attr[xctx->currsch].templ, my_strdup(_ALLOC_ID_, &xctx->hier_attr[xctx->currsch].templ,
xctx->sym[xctx->inst[n].ptr].templ); xctx->sym[xctx->inst[n].ptr].templ);
my_strdup(_ALLOC_ID_, &xctx->hier_attr[xctx->currsch].sym_extra, my_strdup(_ALLOC_ID_, &xctx->hier_attr[xctx->currsch].sym_extra,
get_tok_value(xctx->sym[xctx->inst[n].ptr].prop_ptr, "extra", 0)); get_tok_value(xctx->sym[xctx->inst[n].ptr].prop_ptr, "extra", 0));
if(!xctx->inst[n].embed) if(!xctx->inst[n].embed)

View File

@ -408,7 +408,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
{ {
int interactive = 0; int interactive = 0;
if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;} if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
if(argc > 2) interactive = atoi(argv[2]); if(argc > 2) interactive = atoi(argv[2]);
attach_labels_to_inst(interactive); attach_labels_to_inst(interactive);
Tcl_ResetResult(interp); Tcl_ResetResult(interp);
@ -1701,7 +1701,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
Tcl_SetResult(interp, xctx->schverilogprop ? xctx->schverilogprop : "", TCL_VOLATILE); Tcl_SetResult(interp, xctx->schverilogprop ? xctx->schverilogprop : "", TCL_VOLATILE);
} }
else if(!strcmp(argv[2], "schspectreprop")) /* get schematic "spectre" global attributes */ else if(!strcmp(argv[2], "schspectreprop")) /* get schematic "spectre" global attributes */
{ {
Tcl_SetResult(interp, xctx->schspectreprop ? xctx->schspectreprop : "", TCL_VOLATILE); Tcl_SetResult(interp, xctx->schspectreprop ? xctx->schspectreprop : "", TCL_VOLATILE);
} }
else if(!strcmp(argv[2], "schsymbolprop")) /* get schematic "symbol" global attributes */ else if(!strcmp(argv[2], "schsymbolprop")) /* get schematic "symbol" global attributes */
@ -1746,7 +1746,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
else if(!strcmp(argv[2], "symbols")) { /* number of loaded symbols */ else if(!strcmp(argv[2], "symbols")) { /* number of loaded symbols */
if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;} if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
Tcl_SetResult(interp, my_itoa(xctx->symbols), TCL_VOLATILE); Tcl_SetResult(interp, my_itoa(xctx->symbols), TCL_VOLATILE);
} }
break; break;
case 't': case 't':
@ -1890,7 +1890,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
/* get_fqdevice instname param modelparam /* get_fqdevice instname param modelparam
* get the full pathname of "instname" device * get the full pathname of "instname" device
* modelparam: * modelparam:
* 0: current, 1: modelparam, 2: modelvoltage * 0: current, 1: modelparam, 2: modelvoltage
* param: device parameter, like ib, gm, vth * param: device parameter, like ib, gm, vth
* set param to {} (empty str) for just branch current of 2 terminal device * set param to {} (empty str) for just branch current of 2 terminal device
@ -2385,18 +2385,18 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
{ {
const char *instname=NULL; const char *instname=NULL;
int i, fast = 0; int i, fast = 0;
if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;} if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
for(i = 2; i < argc; i++) { for(i = 2; i < argc; i++) {
if(argv[i][0] == '-') { if(argv[i][0] == '-') {
if(!strcmp(argv[i], "-fast")) { if(!strcmp(argv[i], "-fast")) {
fast = 1; fast = 1;
} }
} else { } else {
instname = argv[i]; instname = argv[i];
break; break;
} }
} }
if(instname) { if(instname) {
int inst; int inst;
char *type; char *type;
@ -2431,7 +2431,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
} }
Tcl_ResetResult(interp); Tcl_ResetResult(interp);
} }
/* hilight_netname [-fast] net /* hilight_netname [-fast] net
* Highlight net name 'net' * Highlight net name 'net'
* if '-fast' is given do not redraw hilights after operation */ * if '-fast' is given do not redraw hilights after operation */
else if(!strcmp(argv[1], "hilight_netname")) else if(!strcmp(argv[1], "hilight_netname"))
@ -3049,7 +3049,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
for(i = 2; i < argc; i++) { for(i = 2; i < argc; i++) {
if(argv[i][0] == '-') { if(argv[i][0] == '-') {
if(!strcmp(argv[i], "-nosymbols")) { if(!strcmp(argv[i], "-nosymbols")) {
load_symbols = 0 ; load_symbols = 0 ;
} else if(!strcmp(argv[i], "-gui")) { } else if(!strcmp(argv[i], "-gui")) {
force = 0; force = 0;
@ -3172,7 +3172,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
if(!strcmp(argv[i], "-lastclosed")) { if(!strcmp(argv[i], "-lastclosed")) {
my_strncpy(f, tcleval("get_lastclosed"), S(f)); my_strncpy(f, tcleval("get_lastclosed"), S(f));
} else if(!strcmp(argv[i], "-lastopened")) { } else if(!strcmp(argv[i], "-lastopened")) {
my_strncpy(f, tcleval("get_lastopened"), S(f)); my_strncpy(f, tcleval("get_lastopened"), S(f));
} else if(!is_from_web(argv[i])) { } else if(!is_from_web(argv[i])) {
my_snprintf(f, S(f),"regsub {^~/} {%s} {%s/}", argv[i], home_dir); my_snprintf(f, S(f),"regsub {^~/} {%s} {%s/}", argv[i], home_dir);
@ -3250,7 +3250,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
int res = -2; int res = -2;
struct stat buf; struct stat buf;
if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;} if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
if(argc > 2) { if(argc > 2) {
int i = get_symbol(rel_sym_path(argv[2])); int i = get_symbol(rel_sym_path(argv[2]));
if(i < 0 ) { if(i < 0 ) {
if(!stat(argv[2], &buf)) { /* file exists */ if(!stat(argv[2], &buf)) { /* file exists */
@ -3530,7 +3530,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
* will create the netlist in different places. * will create the netlist in different places.
* netlisting directory is reset to previous setting after completing this command * netlisting directory is reset to previous setting after completing this command
* If -messages is given return the ERC messages instead of just a fail (1) * If -messages is given return the ERC messages instead of just a fail (1)
* or no fail (0) code. * or no fail (0) code.
* If -erc is given it means netlister is called from gui, enable show infowindow * If -erc is given it means netlister is called from gui, enable show infowindow
* If -nohier is given netlist only current level * If -nohier is given netlist only current level
* If -keep_symbols is given no not purge symbols encountered traversing the * If -keep_symbols is given no not purge symbols encountered traversing the
@ -4701,7 +4701,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
} else { } else {
xctx->ui_state |= MENUSTART; xctx->ui_state |= MENUSTART;
xctx->ui_state2 = MENUSTARTRECT; xctx->ui_state2 = MENUSTARTRECT;
} }
} else { } else {
xctx->ui_state |= MENUSTART; xctx->ui_state |= MENUSTART;
xctx->ui_state2 = MENUSTARTRECT; xctx->ui_state2 = MENUSTARTRECT;
@ -5599,7 +5599,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
else if(!strcmp(argv[2], "schspectreprop")) { /* set schematic global spectre attribute string */ else if(!strcmp(argv[2], "schspectreprop")) { /* set schematic global spectre attribute string */
if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;} if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
my_strdup(_ALLOC_ID_, &xctx->schspectreprop, argv[3]); my_strdup(_ALLOC_ID_, &xctx->schspectreprop, argv[3]);
} }
else if(!strcmp(argv[2], "schvhdlprop")) { /* set schematic global vhdl attribute string */ else if(!strcmp(argv[2], "schvhdlprop")) { /* set schematic global vhdl attribute string */
if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;} if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
my_strdup(_ALLOC_ID_, &xctx->schvhdlprop, argv[3]); my_strdup(_ALLOC_ID_, &xctx->schvhdlprop, argv[3]);
@ -5720,7 +5720,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
argc -= shift; argc -= shift;
/* 0 1 2 3 4 5 /* 0 1 2 3 4 5
* xschem setprop instance R4 value [30k] */ * xschem setprop instance R4 value [30k] */
if(argc > 2 && !strcmp(argv[2], "instance")) { if(argc > 2 && !strcmp(argv[2], "instance")) {
int inst; int inst;
@ -5736,7 +5736,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
char *translated_sym = NULL; char *translated_sym = NULL;
int sym_number = -1; int sym_number = -1;
char *subst = NULL, *old_name = NULL;; char *subst = NULL, *old_name = NULL;;
if(!fast) { if(!fast) {
symbol_bbox(inst, &xctx->inst[inst].x1, &xctx->inst[inst].y1, &xctx->inst[inst].x2, &xctx->inst[inst].y2); symbol_bbox(inst, &xctx->inst[inst].x1, &xctx->inst[inst].y1, &xctx->inst[inst].x2, &xctx->inst[inst].y2);
xctx->push_undo(); xctx->push_undo();
@ -5811,7 +5811,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
my_strdup2(_ALLOC_ID_, &sym->prop_ptr, subst_token(sym->prop_ptr, argv[4], NULL)); /* delete attr */ my_strdup2(_ALLOC_ID_, &sym->prop_ptr, subst_token(sym->prop_ptr, argv[4], NULL)); /* delete attr */
} else if(argc > 5 && !strcmp(argv[2], "rect")) { } else if(argc > 5 && !strcmp(argv[2], "rect")) {
/* 0 1 2 3 4 5 6 /* 0 1 2 3 4 5 6
* xschem setprop rect c n token [value] */ * xschem setprop rect c n token [value] */
int change_done = 0; int change_done = 0;
xRect *r; xRect *r;
@ -5948,7 +5948,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
/* show_unconnected_pins /* show_unconnected_pins
* Add a "lab_show.sym" to all instance pins that are not connected to anything */ * Add a "lab_show.sym" to all instance pins that are not connected to anything */
else if(!strcmp(argv[1], "show_unconnected_pins") ) else if(!strcmp(argv[1], "show_unconnected_pins") )
{ {
if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;} if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
show_unconnected_pins(); show_unconnected_pins();
Tcl_ResetResult(interp); Tcl_ResetResult(interp);
@ -6192,7 +6192,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
extra_rawfile(3, NULL, NULL, -1.0, -1.0); extra_rawfile(3, NULL, NULL, -1.0, -1.0);
/* free_rawfile(&xctx->raw, 0, 0); */ /* free_rawfile(&xctx->raw, 0, 0); */
table_read(f); table_read(f);
if(sch_waves_loaded() >= 0) { if(sch_waves_loaded() >= 0) {
my_strdup(_ALLOC_ID_, &xctx->raw->sim_type, "table"); my_strdup(_ALLOC_ID_, &xctx->raw->sim_type, "table");
draw(); draw();
@ -6513,7 +6513,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
} }
/* unselect_attached_floaters /* unselect_attached_floaters
* Unselect objects (not symbol instances) attached to some instance with a * Unselect objects (not symbol instances) attached to some instance with a
* non empty name=... attribute */ * non empty name=... attribute */
else if(!strcmp(argv[1], "unselect_attached_floaters")) else if(!strcmp(argv[1], "unselect_attached_floaters"))
{ {
@ -6644,7 +6644,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
} }
} else { } else {
xctx->last_command = 0; xctx->last_command = 0;
xctx->ui_state |= MENUSTART; xctx->ui_state |= MENUSTART;
xctx->ui_state2 = MENUSTARTWIRE; xctx->ui_state2 = MENUSTARTWIRE;
} }
} else { } else {

View File

@ -28,7 +28,7 @@
* Recursive routine * Recursive routine
*/ */
static void check_connected_nets(int stop_at_junction, int n) static void check_connected_nets(int stop_at_junction, int n)
{ {
int k, touches; int k, touches;
xWire * const wire = xctx->wire; xWire * const wire = xctx->wire;
Wireentry *wireptr; Wireentry *wireptr;
@ -36,7 +36,7 @@ static void check_connected_nets(int stop_at_junction, int n)
char *type; char *type;
double x1, y1, x2, y2; double x1, y1, x2, y2;
Iterator_ctx ctx; Iterator_ctx ctx;
x1 = wire[n].x1; x1 = wire[n].x1;
y1 = wire[n].y1; y1 = wire[n].y1;
x2 = wire[n].x2; x2 = wire[n].x2;
@ -78,7 +78,7 @@ static void check_connected_nets(int stop_at_junction, int n)
(wire[n].x1 == wire[k].x2 && wire[n].y1 == wire[k].y2 && wire[n].end1 < 2 && wire[k].end2 < 2) || (wire[n].x1 == wire[k].x2 && wire[n].y1 == wire[k].y2 && wire[n].end1 < 2 && wire[k].end2 < 2) ||
(wire[n].x2 == wire[k].x1 && wire[n].y2 == wire[k].y1 && wire[n].end2 < 2 && wire[k].end1 < 2) || (wire[n].x2 == wire[k].x1 && wire[n].y2 == wire[k].y1 && wire[n].end2 < 2 && wire[k].end1 < 2) ||
(wire[n].x2 == wire[k].x2 && wire[n].y2 == wire[k].y2 && wire[n].end2 < 2 && wire[k].end2 < 2); (wire[n].x2 == wire[k].x2 && wire[n].y2 == wire[k].y2 && wire[n].end2 < 2 && wire[k].end2 < 2);
} }
if(touches) { if(touches) {
xctx->wire[k].sel = SELECTED; xctx->wire[k].sel = SELECTED;
check_connected_nets(stop_at_junction, k); /* recursive check */ check_connected_nets(stop_at_junction, k); /* recursive check */
@ -87,7 +87,7 @@ static void check_connected_nets(int stop_at_junction, int n)
} }
} }
/* stop_at_junction==1 --> stop selecting wires at 'T' junctions /* stop_at_junction==1 --> stop selecting wires at 'T' junctions
* stop_at_junction==2 --> select only wires directly attached to selected net/instance * stop_at_junction==2 --> select only wires directly attached to selected net/instance
*/ */
void select_connected_nets(int stop_at_junction) void select_connected_nets(int stop_at_junction)
@ -132,7 +132,7 @@ void select_connected_nets(int stop_at_junction)
xRect *rct; xRect *rct;
int n = iptr->n; int n = iptr->n;
double x1, y1; double x1, y1;
if(n == i) continue; if(n == i) continue;
type = (xctx->inst[n].ptr+ xctx->sym)->type; type = (xctx->inst[n].ptr+ xctx->sym)->type;
if( type && (!strcmp(type, "label") || !strcmp(type, "probe")) ) { if( type && (!strcmp(type, "label") || !strcmp(type, "probe")) ) {
@ -176,7 +176,7 @@ int select_dangling_nets(void)
double x0, y0, x1, y1, x2, y2; double x0, y0, x1, y1, x2, y2;
table = my_calloc(_ALLOC_ID_, xctx->wires, sizeof(int)); table = my_calloc(_ALLOC_ID_, xctx->wires, sizeof(int));
hash_instances(); hash_instances();
hash_wires(); hash_wires();
@ -229,7 +229,7 @@ int select_dangling_nets(void)
touch(wire[w].x1, wire[w].y1, wire[w].x2, wire[w].y2, wire[i].x2, wire[i].y2) || touch(wire[w].x1, wire[w].y1, wire[w].x2, wire[w].y2, wire[i].x2, wire[i].y2) ||
touch(wire[i].x1, wire[i].y1, wire[i].x2, wire[i].y2, wire[w].x1, wire[w].y1) || touch(wire[i].x1, wire[i].y1, wire[i].x2, wire[i].y2, wire[w].x1, wire[w].y1) ||
touch(wire[i].x1, wire[i].y1, wire[i].x2, wire[i].y2, wire[w].x2, wire[w].y2); touch(wire[i].x1, wire[i].y1, wire[i].x2, wire[i].y2, wire[w].x2, wire[w].y2);
if(touches) { if(touches) {
table[i] = 1; /* wire[i] also not dangling */ table[i] = 1; /* wire[i] also not dangling */
done = 0; done = 0;
} }
@ -296,7 +296,7 @@ int select_dangling_nets(void)
if(!rct) continue; if(!rct) continue;
rects = (xctx->inst[n].ptr + xctx->sym)->rects[PINLAYER]; rects = (xctx->inst[n].ptr + xctx->sym)->rects[PINLAYER];
for(p = 0; p < rects; p++) for(p = 0; p < rects; p++)
{ {
get_inst_pin_coord(n, p, &x1, &y1); get_inst_pin_coord(n, p, &x1, &y1);
touches = (x0 == x1 && y0 == y1); touches = (x0 == x1 && y0 == y1);
if(touches) { if(touches) {
@ -734,9 +734,9 @@ void bbox(int what,double x1,double y1, double x2, double y2)
} }
} }
/* n = -1 : clear first selected info /* n = -1 : clear first selected info
* n = -2 : return first selected element if still selected, or get first from * n = -2 : return first selected element if still selected, or get first from
* selected list. If no elements selected return first selected item (j = 0) * selected list. If no elements selected return first selected item (j = 0)
* n >= 0 : store indicated element as first selected * n >= 0 : store indicated element as first selected
*/ */
int set_first_sel(unsigned short type, int n, unsigned int col) int set_first_sel(unsigned short type, int n, unsigned int col)
@ -744,7 +744,7 @@ int set_first_sel(unsigned short type, int n, unsigned int col)
if(n == -2) { if(n == -2) {
int j; int j;
/* retrieve first selected element (if still selected)... */ /* retrieve first selected element (if still selected)... */
if(xctx->first_sel.n >=0 && xctx->first_sel.type == ELEMENT && if(xctx->first_sel.n >=0 && xctx->first_sel.type == ELEMENT &&
xctx->inst[xctx->first_sel.n].sel == SELECTED) { xctx->inst[xctx->first_sel.n].sel == SELECTED) {
for(j=0; j < xctx->lastsel; j++) { for(j=0; j < xctx->lastsel; j++) {
if(xctx->sel_array[j].type == ELEMENT && xctx->sel_array[j].n == xctx->first_sel.n) { if(xctx->sel_array[j].type == ELEMENT && xctx->sel_array[j].n == xctx->first_sel.n) {
@ -948,7 +948,7 @@ void select_wire(int i,unsigned short select_mode, int fast, int override_lock)
static int select_attached_floaters(int inst, const char *name) static int select_attached_floaters(int inst, const char *name)
{ {
int i, c; int i, c;
int found = 0; int found = 0;
char *attach = NULL; char *attach = NULL;
@ -971,7 +971,7 @@ static int select_attached_floaters(int inst, const char *name)
select_line(c, i, SELECTED, 1, 1); select_line(c, i, SELECTED, 1, 1);
} }
} }
for(i = 0; i < xctx->polygons[c]; i++) { for(i = 0; i < xctx->polygons[c]; i++) {
if(!strcmp(name, get_tok_value(xctx->poly[c][i].prop_ptr, "name", 0))) { if(!strcmp(name, get_tok_value(xctx->poly[c][i].prop_ptr, "name", 0))) {
found = 1; found = 1;
@ -983,14 +983,14 @@ static int select_attached_floaters(int inst, const char *name)
found = 1; found = 1;
select_arc(c, i, SELECTED, 1, 1); select_arc(c, i, SELECTED, 1, 1);
} }
} }
} }
for(i = 0; i < xctx->wires; i++) { for(i = 0; i < xctx->wires; i++) {
if(!strcmp(name, get_tok_value(xctx->wire[i].prop_ptr, "name", 0))) { if(!strcmp(name, get_tok_value(xctx->wire[i].prop_ptr, "name", 0))) {
found = 1; found = 1;
select_wire(i, SELECTED, 1, 1); select_wire(i, SELECTED, 1, 1);
} }
} }
for(i = 0; i < xctx->texts; i++) { for(i = 0; i < xctx->texts; i++) {
if(!strcmp(name, get_tok_value(xctx->text[i].prop_ptr, "name", 0))) { if(!strcmp(name, get_tok_value(xctx->text[i].prop_ptr, "name", 0))) {
found = 1; found = 1;
@ -1042,7 +1042,7 @@ void select_element(int i,unsigned short select_mode, int fast, int override_loc
} }
} }
tcleval("infowindow"); tcleval("infowindow");
my_snprintf(str, S(str), "n=%4d x = %.16g y = %.16g w = %.16g h = %.16g",i, my_snprintf(str, S(str), "n=%4d x = %.16g y = %.16g w = %.16g h = %.16g",i,
xctx->inst[i].xx1, xctx->inst[i].yy1, xctx->inst[i].xx1, xctx->inst[i].yy1,
xctx->inst[i].xx2-xctx->inst[i].xx1, xctx->inst[i].yy2-xctx->inst[i].yy1 xctx->inst[i].xx2-xctx->inst[i].xx1, xctx->inst[i].yy2-xctx->inst[i].yy1
); );
@ -1149,7 +1149,7 @@ void select_box(int c, int i, unsigned short select_mode, int fast, int override
xctx->rect[c][i].x2, xctx->rect[c][i].y2); xctx->rect[c][i].x2, xctx->rect[c][i].y2);
} else { } else {
xctx->rect[c][i].sel = 0; xctx->rect[c][i].sel = 0;
if(!(fast & 2)) drawtemprect(xctx->gctiled, NOW, xctx->rect[c][i].x1, xctx->rect[c][i].y1, if(!(fast & 2)) drawtemprect(xctx->gctiled, NOW, xctx->rect[c][i].x1, xctx->rect[c][i].y1,
xctx->rect[c][i].x2, xctx->rect[c][i].y2); xctx->rect[c][i].x2, xctx->rect[c][i].y2);
} }
if( xctx->rect[c][i].sel == (SELECTED1|SELECTED2|SELECTED3|SELECTED4)) xctx->rect[c][i].sel = SELECTED; if( xctx->rect[c][i].sel == (SELECTED1|SELECTED2|SELECTED3|SELECTED4)) xctx->rect[c][i].sel = SELECTED;
@ -1173,7 +1173,7 @@ void select_arc(int c, int i, unsigned short select_mode, int fast, int override
my_snprintf(str, S(str), "Info: selected arc : layer=%d, n=%d properties: %s",c-4,i,s); my_snprintf(str, S(str), "Info: selected arc : layer=%d, n=%d properties: %s",c-4,i,s);
statusmsg(str,3); statusmsg(str,3);
tcleval("infowindow"); tcleval("infowindow");
my_snprintf(str, S(str), "n=%4d x = %.16g y = %.16g r = %.16g a = %.16g b = %.16g", my_snprintf(str, S(str), "n=%4d x = %.16g y = %.16g r = %.16g a = %.16g b = %.16g",
i, xctx->arc[c][i].x, xctx->arc[c][i].y, xctx->arc[c][i].r, xctx->arc[c][i].a, xctx->arc[c][i].b); i, xctx->arc[c][i].x, xctx->arc[c][i].y, xctx->arc[c][i].r, xctx->arc[c][i].a, xctx->arc[c][i].b);
statusmsg(str,1); statusmsg(str,1);
@ -1279,7 +1279,7 @@ Selected select_object(double mx,double my, unsigned short select_mode,
{ {
Selected sel; Selected sel;
xctx->already_selected = 0; xctx->already_selected = 0;
if(!selptr) if(!selptr)
sel = find_closest_obj(mx, my, override_lock); sel = find_closest_obj(mx, my, override_lock);
else else
sel = *selptr; sel = *selptr;
@ -1441,7 +1441,7 @@ void select_inside(int stretch, double x1,double y1, double x2, double y2, int s
#endif #endif
estr = my_expand(get_text_floater(i), tclgetintvar("tabstop")); estr = my_expand(get_text_floater(i), tclgetintvar("tabstop"));
text_bbox(estr, text_bbox(estr,
xctx->text[i].xscale, xctx->text[i].yscale, (short)select_rot, (short)select_flip, xctx->text[i].xscale, xctx->text[i].yscale, (short)select_rot, (short)select_flip,
xctx->text[i].hcenter, xctx->text[i].vcenter, xctx->text[i].hcenter, xctx->text[i].vcenter,
xctx->text[i].x0, xctx->text[i].y0, xctx->text[i].x0, xctx->text[i].y0,
&xx1,&yy1, &xx2,&yy2, &tmpint, &dtmp); &xx1,&yy1, &xx2,&yy2, &tmpint, &dtmp);
@ -1485,7 +1485,7 @@ void select_inside(int stretch, double x1,double y1, double x2, double y2, int s
if(!xctx->enable_layer[c]) continue; if(!xctx->enable_layer[c]) continue;
for(i=0;i<xctx->polygons[c]; ++i) { for(i=0;i<xctx->polygons[c]; ++i) {
int k, selected_points, flag; int k, selected_points, flag;
polygon_bbox(xctx->poly[c][i].x, xctx->poly[c][i].y, xctx->poly[c][i].points, &xa, &ya, &xb, &yb); polygon_bbox(xctx->poly[c][i].x, xctx->poly[c][i].y, xctx->poly[c][i].points, &xa, &ya, &xb, &yb);
if(RECT_OUTSIDE(xa, ya, xb, yb, x1, y1, x2, y2)) continue; if(RECT_OUTSIDE(xa, ya, xb, yb, x1, y1, x2, y2)) continue;
selected_points = 0; selected_points = 0;
@ -1510,7 +1510,7 @@ void select_inside(int stretch, double x1,double y1, double x2, double y2, int s
if(sel && stretch) select_polygon(c, i, SELECTED1, 1, 0); if(sel && stretch) select_polygon(c, i, SELECTED1, 1, 0);
} }
} }
} }
for(i=0;i<xctx->lines[c]; ++i) for(i=0;i<xctx->lines[c]; ++i)
{ {
@ -1604,7 +1604,7 @@ void select_inside(int stretch, double x1,double y1, double x2, double y2, int s
select_box(c, i,SELECTED4,1, 0); select_box(c, i,SELECTED4,1, 0);
} }
} }
} /* end for i */ } /* end for i */
} /* end for c */ } /* end for c */
drawtemparc(xctx->gc[SELLAYER], END, 0.0, 0.0, 0.0, 0.0, 0.0); drawtemparc(xctx->gc[SELLAYER], END, 0.0, 0.0, 0.0, 0.0, 0.0);
@ -1654,7 +1654,7 @@ void select_touch(double x1,double y1, double x2, double y2, int sel) /*added un
estr = my_expand(get_text_floater(i), tclgetintvar("tabstop")); estr = my_expand(get_text_floater(i), tclgetintvar("tabstop"));
text_bbox(estr, text_bbox(estr,
xctx->text[i].xscale, xctx->text[i].yscale, (short)select_rot, (short)select_flip, xctx->text[i].xscale, xctx->text[i].yscale, (short)select_rot, (short)select_flip,
xctx->text[i].hcenter, xctx->text[i].vcenter, xctx->text[i].hcenter, xctx->text[i].vcenter,
xctx->text[i].x0, xctx->text[i].y0, xctx->text[i].x0, xctx->text[i].y0,
&xx1,&yy1, &xx2,&yy2, &tmpint, &dtmp); &xx1,&yy1, &xx2,&yy2, &tmpint, &dtmp);
@ -1689,7 +1689,7 @@ void select_touch(double x1,double y1, double x2, double y2, int sel) /*added un
if(!xctx->enable_layer[c]) continue; if(!xctx->enable_layer[c]) continue;
for(i=0;i<xctx->polygons[c]; ++i) { for(i=0;i<xctx->polygons[c]; ++i) {
int k, flag; int k, flag;
polygon_bbox(xctx->poly[c][i].x, xctx->poly[c][i].y, xctx->poly[c][i].points, &xa, &ya, &xb, &yb); polygon_bbox(xctx->poly[c][i].x, xctx->poly[c][i].y, xctx->poly[c][i].points, &xa, &ya, &xb, &yb);
if(RECT_OUTSIDE(xa, ya, xb, yb, x1, y1, x2, y2)) continue; if(RECT_OUTSIDE(xa, ya, xb, yb, x1, y1, x2, y2)) continue;
flag=0; flag=0;
@ -1800,15 +1800,15 @@ int floaters_from_selected_inst()
txty0 = symtxt->y0; txty0 = symtxt->y0;
txtrot = symtxt->rot; txtrot = symtxt->rot;
txtflip = symtxt->flip; txtflip = symtxt->flip;
rot = (txtrot + ( (instflip && (txtrot & 1) ) ? instrot+2 : instrot) ) & 0x3; rot = (txtrot + ( (instflip && (txtrot & 1) ) ? instrot+2 : instrot) ) & 0x3;
flip = txtflip ^ instflip; flip = txtflip ^ instflip;
ROTATION(instrot, instflip, 0.0, 0.0, txtx0, txty0, x0, y0); ROTATION(instrot, instflip, 0.0, 0.0, txtx0, txty0, x0, y0);
x0 += instx0; x0 += instx0;
y0 += insty0; y0 += insty0;
create_text(0, x0, y0, rot, flip, symtxt->txt_ptr, create_text(0, x0, y0, rot, flip, symtxt->txt_ptr,
subst_token(symtxt->prop_ptr, "name", xctx->inst[i].instname), subst_token(symtxt->prop_ptr, "name", xctx->inst[i].instname),
symtxt->xscale, symtxt->yscale); symtxt->xscale, symtxt->yscale);
xctx->text[xctx->texts - 1].sel = SELECTED; xctx->text[xctx->texts - 1].sel = SELECTED;

View File

@ -1,22 +1,22 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
# #
# File: sort_labels.awk # File: sort_labels.awk
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers # Copyright (C) 1998-2024 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -31,13 +31,13 @@ BEGIN{
} }
# LDYMS[12] # LDYMS[12]
{ {
line[lines++] = $0 " " hash_string($1) line[lines++] = $0 " " hash_string($1)
} }
END{ END{
close(FILENAME) close(FILENAME)
for(i=0;i< lines;i++) { for(i=0;i< lines;i++) {
print line[i] > FILENAME print line[i] > FILENAME
@ -48,12 +48,12 @@ END{
} }
function hash_string(s, n, i, h, c) function hash_string(s, n, i, h, c)
{ {
n = s n = s
sub(/^.*\[/,"",n) sub(/^.*\[/,"",n)
sub(/\].*/,"",n) sub(/\].*/,"",n)
sub(/\[.*/, "", s) sub(/\[.*/, "", s)
h = s "__" sprintf("%08d", n) h = s "__" sprintf("%08d", n)

View File

@ -1,22 +1,22 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
# #
# File: spice.awk # File: spice.awk
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers # Copyright (C) 1998-2024 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -28,7 +28,7 @@ BEGIN{
user_code=0 #20180129 user_code=0 #20180129
while( (ARGV[1] ~ /^[-]/) || (ARGV[1] ~ /^$/) ) { while( (ARGV[1] ~ /^[-]/) || (ARGV[1] ~ /^$/) ) {
# if(ARGV[1] == "-xyce") { xyce = 1} # if(ARGV[1] == "-xyce") { xyce = 1}
for(i=2; i<= ARGC;i++) { for(i=2; i<= ARGC;i++) {
ARGV[i-1] = ARGV[i] ARGV[i-1] = ARGV[i]
} }
@ -55,7 +55,7 @@ END{
## resolve parametric instance name vector multiplicity ## resolve parametric instance name vector multiplicity
substitute_instance_param() substitute_instance_param()
for(i=0; i<lines; i++) { for(i=0; i<lines; i++) {
$0 = line[i] $0 = line[i]
@ -113,7 +113,7 @@ function substitute_instance_param( i, j, name, first, last)
} }
function sign(x) function sign(x)
{ {
return x<0 ? -1 : x>0 ? 1 : 0 return x<0 ? -1 : x>0 ? 1 : 0
} }
@ -162,22 +162,22 @@ function process( i,j, iprefix, saveinstr, savetype, saveanalysis)
#20150922 handle the case of pmos elements that netlist also a diode #20150922 handle the case of pmos elements that netlist also a diode
# format="@name @pinlist @model w=@w l=@l geomod=0 m=@m # format="@name @pinlist @model w=@w l=@l geomod=0 m=@m
# #dx#name 0 @@b dnwell area=... pj=..." # #dx#name 0 @@b dnwell area=... pj=..."
# replace #dx#name with dx prefix added on all @name elements # replace #dx#name with dx prefix added on all @name elements
# example: # example:
# m6[3] GWL WLDECF[3] WL[3] HDD phv w=50u l=10u geomod=0 m=1 # m6[3] GWL WLDECF[3] WL[3] HDD phv w=50u l=10u geomod=0 m=1
# m6[2] GWL WLDECF[2] WL[2] HDD phv w=50u l=10u geomod=0 m=1 # m6[2] GWL WLDECF[2] WL[2] HDD phv w=50u l=10u geomod=0 m=1
# m6[1] GWL WLDECF[1] WL[1] HDD phv w=50u l=10u geomod=0 m=1 # m6[1] GWL WLDECF[1] WL[1] HDD phv w=50u l=10u geomod=0 m=1
# m6[0] GWL WLDECF[0] WL[0] HDD phv w=50u l=10u geomod=0 m=1 # m6[0] GWL WLDECF[0] WL[0] HDD phv w=50u l=10u geomod=0 m=1
# dxm6[3] 0 HDD dnwell area='(50u + 73u)*(10u + 32u)' pj='2*(50u +73u)+2*(10u +32u)' # dxm6[3] 0 HDD dnwell area='(50u + 73u)*(10u + 32u)' pj='2*(50u +73u)+2*(10u +32u)'
# dxm6[2] 0 HDD dnwell area='(50u + 73u)*(10u + 32u)' pj='2*(50u +73u)+2*(10u +32u)' # dxm6[2] 0 HDD dnwell area='(50u + 73u)*(10u + 32u)' pj='2*(50u +73u)+2*(10u +32u)'
# dxm6[1] 0 HDD dnwell area='(50u + 73u)*(10u + 32u)' pj='2*(50u +73u)+2*(10u +32u)' # dxm6[1] 0 HDD dnwell area='(50u + 73u)*(10u + 32u)' pj='2*(50u +73u)+2*(10u +32u)'
# dxm6[0] 0 HDD dnwell area='(50u + 73u)*(10u + 32u)' pj='2*(50u +73u)+2*(10u +32u)' # dxm6[0] 0 HDD dnwell area='(50u + 73u)*(10u + 32u)' pj='2*(50u +73u)+2*(10u +32u)'
#20151027 do this for all fields #20151027 do this for all fields
for(i=1; i<=NF;i++) { for(i=1; i<=NF;i++) {
if($i ~/^##[a-zA-Z_]+/) { if($i ~/^##[a-zA-Z_]+/) {
sub(/^##/, "", $i) sub(/^##/, "", $i)
} else } else
if($i ~/^#[a-zA-Z_0-9]+#[a-zA-Z_]+/) { if($i ~/^#[a-zA-Z_0-9]+#[a-zA-Z_]+/) {
iprefix=$i iprefix=$i
sub(/^#/,"",iprefix) sub(/^#/,"",iprefix)
@ -187,8 +187,8 @@ function process( i,j, iprefix, saveinstr, savetype, saveanalysis)
## 20160301 add '?1' if missing in format string ## 20160301 add '?1' if missing in format string
if(i>1 && ( $(i-1) !~/^\?/) ) { if(i>1 && ( $(i-1) !~/^\?/) ) {
$i = "?1 " $i $i = "?1 " $i
} }
$0 = $0 # reparse input line $0 = $0 # reparse input line
} }
} }
## 20140506 do not transform {} of variation groups ## 20140506 do not transform {} of variation groups
@ -217,7 +217,7 @@ function process( i,j, iprefix, saveinstr, savetype, saveanalysis)
sub(/ value=/," c=") sub(/ value=/," c=")
IGNORECASE=0 IGNORECASE=0
} }
### ?? too dangerous ### ?? too dangerous
# gsub(/ value=/," ") # gsub(/ value=/," ")
# gsub(/ VALUE=/," ") # gsub(/ VALUE=/," ")
@ -235,10 +235,10 @@ function process( i,j, iprefix, saveinstr, savetype, saveanalysis)
num = split($1, name, ",") num = split($1, name, ",")
if(num==0) print "" if(num==0) print ""
for(j=2;j<=NF;j+=1) # start from 2 not from 3 20070221 for(j=2;j<=NF;j+=1) # start from 2 not from 3 20070221
{ {
# ............ --> matches ?n and ?-n # ............ --> matches ?n and ?-n
# some CDL netlists have this: $SUB=?1 B where B is a node # some CDL netlists have this: $SUB=?1 B where B is a node
if($j ~/^(.*=)?\?-?[0-9]+$/) continue # handle the case that $2 not pinlist 20070221 if($j ~/^(.*=)?\?-?[0-9]+$/) continue # handle the case that $2 not pinlist 20070221
arg_num[j]=split($j,tmp,",") arg_num[j]=split($j,tmp,",")

View File

@ -94,7 +94,7 @@ static int spectre_netlist(FILE *fd, int spectre_stop )
{ {
if(skip_instance(i, 1, lvs_ignore)) continue; if(skip_instance(i, 1, lvs_ignore)) continue;
type = (xctx->inst[i].ptr+ xctx->sym)->type; type = (xctx->inst[i].ptr+ xctx->sym)->type;
if( type && !IS_LABEL_OR_PIN(type) ) { if( type && !IS_LABEL_OR_PIN(type) ) {
/* already done in global_spectre_netlist */ /* already done in global_spectre_netlist */
if(!strcmp(type,"netlist_commands") && xctx->netlist_count==0) continue; if(!strcmp(type,"netlist_commands") && xctx->netlist_count==0) continue;
@ -187,7 +187,7 @@ int global_spectre_netlist(int global, int alert) /* netlister driver */
bus_char[1] = str_tmp[1]; bus_char[1] = str_tmp[1];
} }
xctx->netlist_count=0; xctx->netlist_count=0;
my_snprintf(netl_filename, S(netl_filename), "%s/.%s_%d", my_snprintf(netl_filename, S(netl_filename), "%s/.%s_%d",
tclgetvar("netlist_dir"), get_cell(xctx->sch[xctx->currsch], 0), getpid()); tclgetvar("netlist_dir"), get_cell(xctx->sch[xctx->currsch], 0), getpid());
dbg(1, "global_spectre_netlist(): opening %s for writing\n",netl_filename); dbg(1, "global_spectre_netlist(): opening %s for writing\n",netl_filename);
fd=fopen(netl_filename, "w"); fd=fopen(netl_filename, "w");
@ -231,7 +231,7 @@ int global_spectre_netlist(int global, int alert) /* netlister driver */
} }
} }
if(!top_sub) fprintf(fd,"//"); if(!top_sub) fprintf(fd,"//");
if(uppercase_subckt) if(uppercase_subckt)
fprintf(fd,"SUBCKT %s ( ", get_cell(xctx->sch[xctx->currsch], 0)); fprintf(fd,"SUBCKT %s ( ", get_cell(xctx->sch[xctx->currsch], 0));
else else
fprintf(fd,"subckt %s ( ", get_cell(xctx->sch[xctx->currsch], 0)); fprintf(fd,"subckt %s ( ", get_cell(xctx->sch[xctx->currsch], 0));
@ -243,7 +243,7 @@ int global_spectre_netlist(int global, int alert) /* netlister driver */
dbg(1, "found top level symbol %s\n", top_symbol_name); dbg(1, "found top level symbol %s\n", top_symbol_name);
load_sym_def(top_symbol_name, NULL); load_sym_def(top_symbol_name, NULL);
found_top_symbol = 1; found_top_symbol = 1;
if(xctx->sym[xctx->symbols - 1].type != NULL && if(xctx->sym[xctx->symbols - 1].type != NULL &&
/* only use the symbol if it has pins and is a subcircuit ? */ /* only use the symbol if it has pins and is a subcircuit ? */
/* !strcmp(xctx->sym[xctx->symbols - 1].type, "subcircuit") && */ /* !strcmp(xctx->sym[xctx->symbols - 1].type, "subcircuit") && */
xctx->sym[xctx->symbols - 1].rects[PINLAYER] > 0) { xctx->sym[xctx->symbols - 1].rects[PINLAYER] > 0) {
@ -298,7 +298,7 @@ int global_spectre_netlist(int global, int alert) /* netlister driver */
/* /20100217 */ /* /20100217 */
if(!top_sub) fprintf(fd,"//"); if(!top_sub) fprintf(fd,"//");
if(uppercase_subckt) if(uppercase_subckt)
fprintf(fd, "ENDS\n"); fprintf(fd, "ENDS\n");
else else
fprintf(fd, "ends\n"); fprintf(fd, "ends\n");
@ -323,9 +323,9 @@ int global_spectre_netlist(int global, int alert) /* netlister driver */
/* preserve current level instance flags before descending hierarchy for netlisting, restore later */ /* preserve current level instance flags before descending hierarchy for netlisting, restore later */
stored_flags = my_calloc(_ALLOC_ID_, xctx->instances, sizeof(unsigned int)); stored_flags = my_calloc(_ALLOC_ID_, xctx->instances, sizeof(unsigned int));
for(i=0;i<xctx->instances; ++i) stored_flags[i] = xctx->inst[i].color; for(i=0;i<xctx->instances; ++i) stored_flags[i] = xctx->inst[i].color;
if(global) if(global)
{ {
int saved_hilight_nets = xctx->hilight_nets; int saved_hilight_nets = xctx->hilight_nets;
int web_url = is_from_web(xctx->current_dirname); int web_url = is_from_web(xctx->current_dirname);
char *current_dirname_save = NULL; char *current_dirname_save = NULL;
@ -360,7 +360,7 @@ int global_spectre_netlist(int global, int alert) /* netlister driver */
/* only additional symbols (created with instance schematic=... attr) will have this attribute */ /* only additional symbols (created with instance schematic=... attr) will have this attribute */
my_strdup(_ALLOC_ID_, &xctx->hier_attr[xctx->currsch - 1].prop_ptr, my_strdup(_ALLOC_ID_, &xctx->hier_attr[xctx->currsch - 1].prop_ptr,
tcl_hook2(xctx->sym[i].parent_prop_ptr)); tcl_hook2(xctx->sym[i].parent_prop_ptr));
my_strdup(_ALLOC_ID_, &xctx->hier_attr[xctx->currsch - 1].sym_extra, my_strdup(_ALLOC_ID_, &xctx->hier_attr[xctx->currsch - 1].sym_extra,
get_tok_value(xctx->sym[i].prop_ptr, "extra", 0)); get_tok_value(xctx->sym[i].prop_ptr, "extra", 0));
my_strdup(_ALLOC_ID_, &abs_path, abs_sym_path(xctx->sym[i].name, "")); my_strdup(_ALLOC_ID_, &abs_path, abs_sym_path(xctx->sym[i].name, ""));
if(strcmp(xctx->sym[i].type,"subcircuit")==0 && check_lib(1, abs_path)) if(strcmp(xctx->sym[i].type,"subcircuit")==0 && check_lib(1, abs_path))
@ -515,7 +515,7 @@ int spectre_block_netlist(FILE *fd, int i, int alert)
char *name = NULL; char *name = NULL;
const char *default_schematic; const char *default_schematic;
int uppercase_subckt = tclgetboolvar("uppercase_subckt"); int uppercase_subckt = tclgetboolvar("uppercase_subckt");
split_f = tclgetboolvar("split_files"); split_f = tclgetboolvar("split_files");
if(!strboolcmp( get_tok_value(xctx->sym[i].prop_ptr,"spectre_stop",0),"true") ) if(!strboolcmp( get_tok_value(xctx->sym[i].prop_ptr,"spectre_stop",0),"true") )
@ -573,12 +573,12 @@ int spectre_block_netlist(FILE *fd, int i, int alert)
/* /*
* fprintf(fd, "%s ", extra ? extra : "" ); * fprintf(fd, "%s ", extra ? extra : "" );
*/ */
/* 20081206 new get_sym_template does not return token=value pairs where token listed in extra */ /* 20081206 new get_sym_template does not return token=value pairs where token listed in extra */
fprintf(fd, "\nparameters %s", get_sym_template(xctx->sym[i].templ, extra)); fprintf(fd, "\nparameters %s", get_sym_template(xctx->sym[i].templ, extra));
my_free(_ALLOC_ID_, &extra); my_free(_ALLOC_ID_, &extra);
fprintf(fd, "\n"); fprintf(fd, "\n");
spectre_stop ? load_schematic(0,filename, 0, alert) : load_schematic(1,filename, 0, alert); spectre_stop ? load_schematic(0,filename, 0, alert) : load_schematic(1,filename, 0, alert);
get_additional_symbols(1); get_additional_symbols(1);
err |= spectre_netlist(fd, spectre_stop); /* 20111113 added spectre_stop */ err |= spectre_netlist(fd, spectre_stop); /* 20111113 added spectre_stop */

View File

@ -1,22 +1,22 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
# #
# File: spice.awk # File: spice.awk
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers # Copyright (C) 1998-2024 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -39,7 +39,7 @@ BEGIN{
special_devs[".subckt"] = 1 special_devs[".subckt"] = 1
while( (ARGV[1] ~ /^[-]/) || (ARGV[1] ~ /^$/) ) { while( (ARGV[1] ~ /^[-]/) || (ARGV[1] ~ /^$/) ) {
if(ARGV[1] == "-xyce") { xyce = 1} if(ARGV[1] == "-xyce") { xyce = 1}
for(i=2; i<= ARGC;i++) { for(i=2; i<= ARGC;i++) {
ARGV[i-1] = ARGV[i] ARGV[i-1] = ARGV[i]
} }
@ -61,7 +61,7 @@ BEGIN{
zz = yy zz = yy
yy = $0 yy = $0
$0 = zz $0 = zz
if(first) { if(first) {
first=0 first=0
next next
} }
@ -79,7 +79,7 @@ END{
## resolve parametric instance name vector multiplicity ## resolve parametric instance name vector multiplicity
substitute_instance_param() substitute_instance_param()
for(i=0; i<lines; i++) { for(i=0; i<lines; i++) {
$0 = line[i] $0 = line[i]
@ -89,7 +89,7 @@ END{
if(tolower($0) ~/^[ \t]*\.save[ \t]+.*\?-?[0-9]+/) { # .save file=test1.raw format=raw v( ?1 C2 ) if(tolower($0) ~/^[ \t]*\.save[ \t]+.*\?-?[0-9]+/) { # .save file=test1.raw format=raw v( ?1 C2 )
$1 = "" $1 = ""
$0 = ".print " $0 $0 = ".print " $0
} }
gsub(/ [mM] *= *1 *$/,"") # xyce does not like m=# fields (multiplicity) removing m=1 is no an issue anyway gsub(/ [mM] *= *1 *$/,"") # xyce does not like m=# fields (multiplicity) removing m=1 is no an issue anyway
} }
process() process()
@ -142,7 +142,7 @@ function substitute_instance_param( i, j, name, first, last)
} }
function sign(x) function sign(x)
{ {
return x<0 ? -1 : x>0 ? 1 : 0 return x<0 ? -1 : x>0 ? 1 : 0
} }
@ -190,22 +190,22 @@ function process( i,j, iprefix, saveinstr, savetype, saveanalysis)
#20150922 handle the case of pmos elements that netlist also a diode #20150922 handle the case of pmos elements that netlist also a diode
# format="@name @pinlist @model w=@w l=@l geomod=0 m=@m # format="@name @pinlist @model w=@w l=@l geomod=0 m=@m
# #dx#name 0 @@b dnwell area=... pj=..." # #dx#name 0 @@b dnwell area=... pj=..."
# replace #dx#name with dx prefix added on all @name elements # replace #dx#name with dx prefix added on all @name elements
# example: # example:
# m6[3] GWL WLDECF[3] WL[3] HDD phv w=50u l=10u geomod=0 m=1 # m6[3] GWL WLDECF[3] WL[3] HDD phv w=50u l=10u geomod=0 m=1
# m6[2] GWL WLDECF[2] WL[2] HDD phv w=50u l=10u geomod=0 m=1 # m6[2] GWL WLDECF[2] WL[2] HDD phv w=50u l=10u geomod=0 m=1
# m6[1] GWL WLDECF[1] WL[1] HDD phv w=50u l=10u geomod=0 m=1 # m6[1] GWL WLDECF[1] WL[1] HDD phv w=50u l=10u geomod=0 m=1
# m6[0] GWL WLDECF[0] WL[0] HDD phv w=50u l=10u geomod=0 m=1 # m6[0] GWL WLDECF[0] WL[0] HDD phv w=50u l=10u geomod=0 m=1
# dxm6[3] 0 HDD dnwell area='(50u + 73u)*(10u + 32u)' pj='2*(50u +73u)+2*(10u +32u)' # dxm6[3] 0 HDD dnwell area='(50u + 73u)*(10u + 32u)' pj='2*(50u +73u)+2*(10u +32u)'
# dxm6[2] 0 HDD dnwell area='(50u + 73u)*(10u + 32u)' pj='2*(50u +73u)+2*(10u +32u)' # dxm6[2] 0 HDD dnwell area='(50u + 73u)*(10u + 32u)' pj='2*(50u +73u)+2*(10u +32u)'
# dxm6[1] 0 HDD dnwell area='(50u + 73u)*(10u + 32u)' pj='2*(50u +73u)+2*(10u +32u)' # dxm6[1] 0 HDD dnwell area='(50u + 73u)*(10u + 32u)' pj='2*(50u +73u)+2*(10u +32u)'
# dxm6[0] 0 HDD dnwell area='(50u + 73u)*(10u + 32u)' pj='2*(50u +73u)+2*(10u +32u)' # dxm6[0] 0 HDD dnwell area='(50u + 73u)*(10u + 32u)' pj='2*(50u +73u)+2*(10u +32u)'
#20151027 do this for all fields #20151027 do this for all fields
for(i=1; i<=NF;i++) { for(i=1; i<=NF;i++) {
if($i ~/^##[a-zA-Z_]+/) { if($i ~/^##[a-zA-Z_]+/) {
sub(/^##/, "", $i) sub(/^##/, "", $i)
} else } else
if($i ~/^#[a-zA-Z_0-9]+#[a-zA-Z_]+/) { if($i ~/^#[a-zA-Z_0-9]+#[a-zA-Z_]+/) {
iprefix=$i iprefix=$i
sub(/^#/,"",iprefix) sub(/^#/,"",iprefix)
@ -215,8 +215,8 @@ function process( i,j, iprefix, saveinstr, savetype, saveanalysis)
## 20160301 add '?1' if missing in format string ## 20160301 add '?1' if missing in format string
if(i>1 && ( $(i-1) !~/^\?/) ) { if(i>1 && ( $(i-1) !~/^\?/) ) {
$i = "?1 " $i $i = "?1 " $i
} }
$0 = $0 # reparse input line $0 = $0 # reparse input line
} }
} }
## 20140506 do not transform {} of variation groups ## 20140506 do not transform {} of variation groups
@ -245,7 +245,7 @@ function process( i,j, iprefix, saveinstr, savetype, saveanalysis)
sub(/ value=/," c=") sub(/ value=/," c=")
IGNORECASE=0 IGNORECASE=0
} }
### ?? too dangerous ### ?? too dangerous
# gsub(/ value=/," ") # gsub(/ value=/," ")
# gsub(/ VALUE=/," ") # gsub(/ VALUE=/," ")
@ -259,8 +259,8 @@ function process( i,j, iprefix, saveinstr, savetype, saveanalysis)
if(!xyce) { if(!xyce) {
$1="" $1=""
$0 = $0 # reparse line for field splitting $0 = $0 # reparse line for field splitting
gsub(/ *\?-?[0-9]+ */, "") # in some cases ?-1 is printed (unknow multiplicity) gsub(/ *\?-?[0-9]+ */, "") # in some cases ?-1 is printed (unknow multiplicity)
gsub(/\( */, "(") gsub(/\( */, "(")
gsub(/ *\)/, ")") gsub(/ *\)/, ")")
for(i=1; i<=NF; i++) { for(i=1; i<=NF; i++) {
@ -273,7 +273,7 @@ function process( i,j, iprefix, saveinstr, savetype, saveanalysis)
} }
} }
} }
} else if( $1 ~ /^\*\.(ipin|opin|iopin)/ ) { } else if( $1 ~ /^\*\.(ipin|opin|iopin)/ ) {
num=split($2,name,",") num=split($2,name,",")
for(i=1;i<=num;i++) print $1 " " name[i] for(i=1;i<=num;i++) print $1 " " name[i]
@ -284,7 +284,7 @@ function process( i,j, iprefix, saveinstr, savetype, saveanalysis)
print $0 print $0
} else { } else {
# handle uncommon primitives that have a prefix before the device name # handle uncommon primitives that have a prefix before the device name
if(tolower($1) in special_devs) { if(tolower($1) in special_devs) {
# YDELAY ?1 Rda[4],Rda[3],Rda[2],Rda[1],Rda[0] ?1 softrst[4],softrst[3],... # YDELAY ?1 Rda[4],Rda[3],Rda[2],Rda[1],Rda[0] ?1 softrst[4],softrst[3],...
devprefix = $1 devprefix = $1
num = split($3, name, ",") num = split($3, name, ",")
@ -300,10 +300,10 @@ function process( i,j, iprefix, saveinstr, savetype, saveanalysis)
} }
if(num==0) print "" if(num==0) print ""
for(j=2;j<=NF;j+=1) # start from 2 not from 3 20070221 for(j=2;j<=NF;j+=1) # start from 2 not from 3 20070221
{ {
# ............ --> matches ?n and ?-n # ............ --> matches ?n and ?-n
# some CDL netlists have this: $SUB=?1 B where B is a node # some CDL netlists have this: $SUB=?1 B where B is a node
if($j ~/^(.*=)?\?-?[0-9]+$/) continue # handle the case that $2 not pinlist 20070221 if($j ~/^(.*=)?\?-?[0-9]+$/) continue # handle the case that $2 not pinlist 20070221
arg_num[j]=split($j,tmp,",") arg_num[j]=split($j,tmp,",")

View File

@ -29,7 +29,7 @@ static const char *hier_psprint_mtime(const char *file_name)
static char date[200]; static char date[200];
struct stat time_buf; struct stat time_buf;
struct tm *tm; struct tm *tm;
my_strncpy(date, "xxxxxxxx_xxxxxx", S(date)); my_strncpy(date, "xxxxxxxx_xxxxxx", S(date));
if(!stat(file_name , &time_buf)) { if(!stat(file_name , &time_buf)) {
tm=localtime(&(time_buf.st_mtime) ); tm=localtime(&(time_buf.st_mtime) );
strftime(date, sizeof(date), "%Y%m%d_%H%M%S", tm); strftime(date, sizeof(date), "%Y%m%d_%H%M%S", tm);
@ -38,8 +38,8 @@ static const char *hier_psprint_mtime(const char *file_name)
return date; return date;
} }
/* /*
* what: * what:
* 1 : ps/pdf print * 1 : ps/pdf print
* 2 : list hierarchy * 2 : list hierarchy
*/ */
@ -52,7 +52,7 @@ void hier_psprint(char **res, int what) /* netlister driver */
struct stat buf; struct stat buf;
Str_hashtable subckt_table = {NULL, 0}; Str_hashtable subckt_table = {NULL, 0};
int save_prev_mod = xctx->prev_set_modify; int save_prev_mod = xctx->prev_set_modify;
save = xctx->do_copy_area; save = xctx->do_copy_area;
xctx->do_copy_area = 0; xctx->do_copy_area = 0;
if((what & 1) && !ps_draw(1, 1, 0)) return; /* prolog */ if((what & 1) && !ps_draw(1, 1, 0)) return; /* prolog */
@ -208,7 +208,7 @@ static int spice_netlist(FILE *fd, int spice_stop )
{ {
if(skip_instance(i, 1, lvs_ignore)) continue; if(skip_instance(i, 1, lvs_ignore)) continue;
type = (xctx->inst[i].ptr+ xctx->sym)->type; type = (xctx->inst[i].ptr+ xctx->sym)->type;
if( type && !IS_LABEL_OR_PIN(type) ) { if( type && !IS_LABEL_OR_PIN(type) ) {
/* already done in global_spice_netlist */ /* already done in global_spice_netlist */
if(!strcmp(type,"netlist_commands") && xctx->netlist_count==0) continue; if(!strcmp(type,"netlist_commands") && xctx->netlist_count==0) continue;
@ -301,7 +301,7 @@ int global_spice_netlist(int global, int alert) /* netlister driver */
bus_char[1] = str_tmp[1]; bus_char[1] = str_tmp[1];
} }
xctx->netlist_count=0; xctx->netlist_count=0;
my_snprintf(netl_filename, S(netl_filename), "%s/.%s_%d", my_snprintf(netl_filename, S(netl_filename), "%s/.%s_%d",
tclgetvar("netlist_dir"), get_cell(xctx->sch[xctx->currsch], 0), getpid()); tclgetvar("netlist_dir"), get_cell(xctx->sch[xctx->currsch], 0), getpid());
dbg(1, "global_spice_netlist(): opening %s for writing\n",netl_filename); dbg(1, "global_spice_netlist(): opening %s for writing\n",netl_filename);
fd=fopen(netl_filename, "w"); fd=fopen(netl_filename, "w");
@ -345,7 +345,7 @@ int global_spice_netlist(int global, int alert) /* netlister driver */
} }
} }
if(!top_sub) fprintf(fd,"**"); if(!top_sub) fprintf(fd,"**");
if(uppercase_subckt) if(uppercase_subckt)
fprintf(fd,".SUBCKT %s", get_cell(xctx->sch[xctx->currsch], 0)); fprintf(fd,".SUBCKT %s", get_cell(xctx->sch[xctx->currsch], 0));
else else
fprintf(fd,".subckt %s", get_cell(xctx->sch[xctx->currsch], 0)); fprintf(fd,".subckt %s", get_cell(xctx->sch[xctx->currsch], 0));
@ -357,7 +357,7 @@ int global_spice_netlist(int global, int alert) /* netlister driver */
dbg(1, "found top level symbol %s\n", top_symbol_name); dbg(1, "found top level symbol %s\n", top_symbol_name);
load_sym_def(top_symbol_name, NULL); load_sym_def(top_symbol_name, NULL);
found_top_symbol = 1; found_top_symbol = 1;
if(xctx->sym[xctx->symbols - 1].type != NULL && if(xctx->sym[xctx->symbols - 1].type != NULL &&
/* only use the symbol if it has pins and is a subcircuit ? */ /* only use the symbol if it has pins and is a subcircuit ? */
/* !strcmp(xctx->sym[xctx->symbols - 1].type, "subcircuit") && */ /* !strcmp(xctx->sym[xctx->symbols - 1].type, "subcircuit") && */
xctx->sym[xctx->symbols - 1].rects[PINLAYER] > 0) { xctx->sym[xctx->symbols - 1].rects[PINLAYER] > 0) {
@ -412,7 +412,7 @@ int global_spice_netlist(int global, int alert) /* netlister driver */
/* /20100217 */ /* /20100217 */
if(!top_sub) fprintf(fd,"**"); if(!top_sub) fprintf(fd,"**");
if(uppercase_subckt) if(uppercase_subckt)
fprintf(fd, ".ENDS\n"); fprintf(fd, ".ENDS\n");
else else
fprintf(fd, ".ends\n"); fprintf(fd, ".ends\n");
@ -437,9 +437,9 @@ int global_spice_netlist(int global, int alert) /* netlister driver */
/* preserve current level instance flags before descending hierarchy for netlisting, restore later */ /* preserve current level instance flags before descending hierarchy for netlisting, restore later */
stored_flags = my_calloc(_ALLOC_ID_, xctx->instances, sizeof(unsigned int)); stored_flags = my_calloc(_ALLOC_ID_, xctx->instances, sizeof(unsigned int));
for(i=0;i<xctx->instances; ++i) stored_flags[i] = xctx->inst[i].color; for(i=0;i<xctx->instances; ++i) stored_flags[i] = xctx->inst[i].color;
if(global) if(global)
{ {
int saved_hilight_nets = xctx->hilight_nets; int saved_hilight_nets = xctx->hilight_nets;
int web_url = is_from_web(xctx->current_dirname); int web_url = is_from_web(xctx->current_dirname);
char *current_dirname_save = NULL; char *current_dirname_save = NULL;
@ -474,7 +474,7 @@ int global_spice_netlist(int global, int alert) /* netlister driver */
/* only additional symbols (created with instance schematic=... attr) will have this attribute */ /* only additional symbols (created with instance schematic=... attr) will have this attribute */
my_strdup(_ALLOC_ID_, &xctx->hier_attr[xctx->currsch - 1].prop_ptr, my_strdup(_ALLOC_ID_, &xctx->hier_attr[xctx->currsch - 1].prop_ptr,
tcl_hook2(xctx->sym[i].parent_prop_ptr)); tcl_hook2(xctx->sym[i].parent_prop_ptr));
my_strdup(_ALLOC_ID_, &xctx->hier_attr[xctx->currsch - 1].sym_extra, my_strdup(_ALLOC_ID_, &xctx->hier_attr[xctx->currsch - 1].sym_extra,
get_tok_value(xctx->sym[i].prop_ptr, "extra", 0)); get_tok_value(xctx->sym[i].prop_ptr, "extra", 0));
my_strdup(_ALLOC_ID_, &abs_path, abs_sym_path(xctx->sym[i].name, "")); my_strdup(_ALLOC_ID_, &abs_path, abs_sym_path(xctx->sym[i].name, ""));
if(strcmp(xctx->sym[i].type,"subcircuit")==0 && check_lib(1, abs_path)) if(strcmp(xctx->sym[i].type,"subcircuit")==0 && check_lib(1, abs_path))
@ -629,7 +629,7 @@ int spice_block_netlist(FILE *fd, int i, int alert)
char *name = NULL; char *name = NULL;
const char *default_schematic; const char *default_schematic;
int uppercase_subckt = tclgetboolvar("uppercase_subckt"); int uppercase_subckt = tclgetboolvar("uppercase_subckt");
split_f = tclgetboolvar("split_files"); split_f = tclgetboolvar("split_files");
if(!strboolcmp( get_tok_value(xctx->sym[i].prop_ptr,"spice_stop",0),"true") ) if(!strboolcmp( get_tok_value(xctx->sym[i].prop_ptr,"spice_stop",0),"true") )
@ -680,18 +680,18 @@ int spice_block_netlist(FILE *fd, int i, int alert)
else else
fprintf(fd, ".subckt %s ", s); fprintf(fd, ".subckt %s ", s);
print_spice_subckt_nodes(fd, i); print_spice_subckt_nodes(fd, i);
my_strdup(_ALLOC_ID_, &extra, get_tok_value(xctx->sym[i].prop_ptr,"extra",0) ); my_strdup(_ALLOC_ID_, &extra, get_tok_value(xctx->sym[i].prop_ptr,"extra",0) );
/* this is now done in print_spice_subckt_nodes */ /* this is now done in print_spice_subckt_nodes */
/* /*
* fprintf(fd, "%s ", extra ? extra : "" ); * fprintf(fd, "%s ", extra ? extra : "" );
*/ */
/* 20081206 new get_sym_template does not return token=value pairs where token listed in extra */ /* 20081206 new get_sym_template does not return token=value pairs where token listed in extra */
fprintf(fd, "%s", get_sym_template(xctx->sym[i].templ, extra)); fprintf(fd, "%s", get_sym_template(xctx->sym[i].templ, extra));
my_free(_ALLOC_ID_, &extra); my_free(_ALLOC_ID_, &extra);
fprintf(fd, "\n"); fprintf(fd, "\n");
spice_stop ? load_schematic(0,filename, 0, alert) : load_schematic(1,filename, 0, alert); spice_stop ? load_schematic(0,filename, 0, alert) : load_schematic(1,filename, 0, alert);
get_additional_symbols(1); get_additional_symbols(1);
err |= spice_netlist(fd, spice_stop); /* 20111113 added spice_stop */ err |= spice_netlist(fd, spice_stop); /* 20111113 added spice_stop */

View File

@ -69,13 +69,13 @@ void check_inst_storage(void)
if(xctx->instances >= xctx->maxi) if(xctx->instances >= xctx->maxi)
{ {
int i, old = xctx->maxi; int i, old = xctx->maxi;
xctx->maxi=(1 + xctx->instances / ELEMINST) * ELEMINST; xctx->maxi=(1 + xctx->instances / ELEMINST) * ELEMINST;
my_realloc(_ALLOC_ID_, &xctx->inst, sizeof(xInstance)*xctx->maxi); my_realloc(_ALLOC_ID_, &xctx->inst, sizeof(xInstance)*xctx->maxi);
#ifdef ZERO_REALLOC #ifdef ZERO_REALLOC
memset(xctx->inst + xctx->instances, 0, sizeof(xInstance) * (xctx->maxi - xctx->instances)); memset(xctx->inst + xctx->instances, 0, sizeof(xInstance) * (xctx->maxi - xctx->instances));
#endif #endif
/* clear all flag bits (to avoid random data in bit 8, that can not be cleraed /* clear all flag bits (to avoid random data in bit 8, that can not be cleraed
* by set_inst_flags() */ * by set_inst_flags() */
for(i = old; i < xctx->maxi; i++) xctx->inst[i].flags = 0; for(i = old; i < xctx->maxi; i++) xctx->inst[i].flags = 0;
} }
@ -171,7 +171,7 @@ void store_arc(int pos, double x, double y, double r, double a, double b,
xctx->arcs[rectc]++; xctx->arcs[rectc]++;
} }
void store_poly(int pos, double *x, double *y, int points, unsigned int rectc, void store_poly(int pos, double *x, double *y, int points, unsigned int rectc,
unsigned short sel, char *prop_ptr) unsigned short sel, char *prop_ptr)
{ {
int n, j; int n, j;
@ -288,7 +288,7 @@ int storeobject(int pos, double x1,double y1,double x2,double y2,
xctx->rect[rectc][n].bus = 0.0; xctx->rect[rectc][n].bus = 0.0;
if(prop_ptr) { if(prop_ptr) {
xctx->rect[rectc][n].bus = get_attr_val(get_tok_value(prop_ptr, "bus", 0)); xctx->rect[rectc][n].bus = get_attr_val(get_tok_value(prop_ptr, "bus", 0));
} }
if(prop_ptr && (attr = get_tok_value(prop_ptr,"dash",0))[0]) { if(prop_ptr && (attr = get_tok_value(prop_ptr,"dash",0))[0]) {
int d = atoi(attr); int d = atoi(attr);
xctx->rect[rectc][n].dash = (char) (d >= 0 ? d : 0); xctx->rect[rectc][n].dash = (char) (d >= 0 ? d : 0);

View File

@ -35,7 +35,7 @@ FNR == 1 { a=b=c=d=e=f=g=h=i=j=k=l="" }
print h print h
print i print i
print "" print ""
} }
' $@ ' $@

View File

@ -74,7 +74,7 @@ static void svg_xfillrectangle(int layer, double x1, double y1, double x2, doubl
double bus, int dash, int fill) double bus, int dash, int fill)
{ {
double width; double width;
if(bus == -1.0) width = BUS_WIDTH * svg_linew; if(bus == -1.0) width = BUS_WIDTH * svg_linew;
else if(bus > 0.0) width = bus * xctx->mooz; else if(bus > 0.0) width = bus * xctx->mooz;
else width = -1.0; else width = -1.0;
@ -89,15 +89,15 @@ static void svg_xfillrectangle(int layer, double x1, double y1, double x2, doubl
if(bus > 0.0) { if(bus > 0.0) {
fprintf(fd, " stroke-linecap:square;\n"); fprintf(fd, " stroke-linecap:square;\n");
fprintf(fd, " stroke-linejoin:miter;\n"); fprintf(fd, " stroke-linejoin:miter;\n");
} }
if(fill == 0) { if(fill == 0) {
fprintf(fd,"fill:none;\" "); fprintf(fd,"fill:none;\" ");
} else if(fill == 2) { } else if(fill == 2) {
fprintf(fd, "fill-opacity:1.0;\" "); fprintf(fd, "fill-opacity:1.0;\" ");
} else { } else {
fprintf(fd, "\" "); fprintf(fd, "\" ");
} }
} }
fprintf(fd,"d=\"M%g %gL%g %gL%g %gL%g %gL%g %gz\"/>\n", x1, y1, x2, y1, x2, y2, x1, y2, x1, y1); fprintf(fd,"d=\"M%g %gL%g %gL%g %gL%g %gL%g %gz\"/>\n", x1, y1, x2, y1, x2, y2, x1, y2, x1, y1);
} }
@ -209,7 +209,7 @@ static void svg_filledrect(int gc, double rectx1,double recty1,double rectx2,dou
{ {
double x1,y1,x2,y2; double x1,y1,x2,y2;
double width; double width;
if(bus == -1.0) width = BUS_WIDTH * svg_linew; if(bus == -1.0) width = BUS_WIDTH * svg_linew;
else if(bus > 0.0) width = bus * xctx->mooz; else if(bus > 0.0) width = bus * xctx->mooz;
else width = -1.0; else width = -1.0;
@ -250,8 +250,8 @@ static void svg_filledrect(int gc, double rectx1,double recty1,double rectx2,dou
if(bus > 0.0) { if(bus > 0.0) {
fprintf(fd, " stroke-linecap:square;\n"); fprintf(fd, " stroke-linecap:square;\n");
fprintf(fd, " stroke-linejoin:miter;\n"); fprintf(fd, " stroke-linejoin:miter;\n");
} }
if(fill == 0) { if(fill == 0) {
fprintf(fd,"fill:none;\" "); fprintf(fd,"fill:none;\" ");
fprintf(fd, "d=\"M%g %g A%g %g 0 %d %d %g %g\"/>\n", xx1, yy1, rx, ry, fa, fs, xx2, yy2); fprintf(fd, "d=\"M%g %g A%g %g 0 %d %d %g %g\"/>\n", xx1, yy1, rx, ry, fa, fs, xx2, yy2);
} else if(fill == 2) { } else if(fill == 2) {
@ -260,8 +260,8 @@ static void svg_filledrect(int gc, double rectx1,double recty1,double rectx2,dou
} else { } else {
fprintf(fd, "\" "); fprintf(fd, "\" ");
fprintf(fd, "d=\"M%g %g A%g %g 0 %d %d %g %gL%g %gz\"/>\n", xx1, yy1, rx, ry, fa, fs, xx2, yy2, cx, cy); fprintf(fd, "d=\"M%g %g A%g %g 0 %d %d %g %gL%g %gz\"/>\n", xx1, yy1, rx, ry, fa, fs, xx2, yy2, cx, cy);
} }
} }
} }
} else { } else {
svg_xfillrectangle(gc, x1,y1,x2,y2, bus, dash, fill); svg_xfillrectangle(gc, x1,y1,x2,y2, bus, dash, fill);
@ -340,17 +340,17 @@ static void svg_drawarc(int gc, int fillarc, double x,double y,double r,double a
if(bus > 0.0) { if(bus > 0.0) {
fprintf(fd, " stroke-linecap:square;\n"); fprintf(fd, " stroke-linecap:square;\n");
fprintf(fd, " stroke-linejoin:miter;\n"); fprintf(fd, " stroke-linejoin:miter;\n");
} }
if(fillarc == 0) { if(fillarc == 0) {
fprintf(fd,"fill:none;\" "); fprintf(fd,"fill:none;\" ");
fprintf(fd, "d=\"M%g %g A%g %g 0 %d %d %g %g\"/>\n", xx1, yy1, rr, rr, fa, fs, xx2, yy2); fprintf(fd, "d=\"M%g %g A%g %g 0 %d %d %g %g\"/>\n", xx1, yy1, rr, rr, fa, fs, xx2, yy2);
} else if(fillarc == 2) { } else if(fillarc == 2) {
fprintf(fd, "fill-opacity:1.0;\" "); fprintf(fd, "fill-opacity:1.0;\" ");
fprintf(fd, "d=\"M%g %g A%g %g 0 %d %d %g %gL%g %gz\"/>\n", xx1, yy1, rr, rr, fa, fs, xx2, yy2, xx, yy); fprintf(fd, "d=\"M%g %g A%g %g 0 %d %d %g %gL%g %gz\"/>\n", xx1, yy1, rr, rr, fa, fs, xx2, yy2, xx, yy);
} else { } else {
fprintf(fd, "d=\"M%g %g A%g %g 0 %d %d %g %gL%g %gz\"/>\n", xx1, yy1, rr, rr, fa, fs, xx2, yy2, xx, yy); fprintf(fd, "d=\"M%g %g A%g %g 0 %d %d %g %gL%g %gz\"/>\n", xx1, yy1, rr, rr, fa, fs, xx2, yy2, xx, yy);
} }
} }
} }
} }
@ -379,7 +379,7 @@ static void svg_draw_string_line(int layer, char *s, double x, double y, double
double line_delta; double line_delta;
double lines; double lines;
char col[20]; char col[20];
if(color_ps) if(color_ps)
my_snprintf(col, S(col), "#%02x%02x%02x", my_snprintf(col, S(col), "#%02x%02x%02x",
svg_colors[layer].red, svg_colors[layer].green, svg_colors[layer].blue); svg_colors[layer].red, svg_colors[layer].green, svg_colors[layer].blue);
else if(tclgetboolvar("dark_colorscheme")) else if(tclgetboolvar("dark_colorscheme"))
@ -388,16 +388,16 @@ static void svg_draw_string_line(int layer, char *s, double x, double y, double
my_snprintf(col, S(col), "#%02x%02x%02x", 0, 0, 0); my_snprintf(col, S(col), "#%02x%02x%02x", 0, 0, 0);
if(s==NULL) return; if(s==NULL) return;
if(llength==0) return; if(llength==0) return;
line_delta = lineno*fontheight; line_delta = lineno*fontheight;
lines = (no_of_lines-1)*fontheight; lines = (no_of_lines-1)*fontheight;
ix=X_TO_SCREEN(x); ix=X_TO_SCREEN(x);
iy=Y_TO_SCREEN(y); iy=Y_TO_SCREEN(y);
if(rot&1) { if(rot&1) {
rot1=3; rot1=3;
} else rot1=0; } else rot1=0;
if( rot==0 && flip==0) {iy+=line_delta+fontascent;} if( rot==0 && flip==0) {iy+=line_delta+fontascent;}
else if(rot==1 && flip==0) {iy+=longest_line;ix=ix-fontheight+fontascent-lines+line_delta;} else if(rot==1 && flip==0) {iy+=longest_line;ix=ix-fontheight+fontascent-lines+line_delta;}
else if(rot==2 && flip==0) {iy=iy-fontheight-lines+line_delta+fontascent; ix=ix-longest_line;} else if(rot==2 && flip==0) {iy=iy-fontheight-lines+line_delta+fontascent; ix=ix-longest_line;}
@ -406,7 +406,7 @@ static void svg_draw_string_line(int layer, char *s, double x, double y, double
else if(rot==1 && flip==1) {ix=ix-fontheight+line_delta-lines+fontascent;} else if(rot==1 && flip==1) {ix=ix-fontheight+line_delta-lines+fontascent;}
else if(rot==2 && flip==1) {iy=iy-fontheight-lines+line_delta+fontascent;} else if(rot==2 && flip==1) {iy=iy-fontheight-lines+line_delta+fontascent;}
else if(rot==3 && flip==1) {iy=iy+longest_line;ix+=line_delta+fontascent;} else if(rot==3 && flip==1) {iy=iy+longest_line;ix+=line_delta+fontascent;}
fprintf(fd,"<text fill=\"%s\" xml:space=\"preserve\" font-size=\"%g\" ", col, size*xctx->mooz); fprintf(fd,"<text fill=\"%s\" xml:space=\"preserve\" font-size=\"%g\" ", col, size*xctx->mooz);
if(strcmp(svg_font_weight, "normal")) fprintf(fd, "font-weight=\"%s\" ", svg_font_weight); if(strcmp(svg_font_weight, "normal")) fprintf(fd, "font-weight=\"%s\" ", svg_font_weight);
if(strcmp(svg_font_style, "normal")) fprintf(fd, "font-style=\"%s\" ", svg_font_style); if(strcmp(svg_font_style, "normal")) fprintf(fd, "font-style=\"%s\" ", svg_font_style);
@ -417,13 +417,13 @@ static void svg_draw_string_line(int layer, char *s, double x, double y, double
while(*s) { while(*s) {
switch(*s) { switch(*s) {
case '<': case '<':
fputs("&lt;", fd); fputs("&lt;", fd);
break; break;
case '>': case '>':
fputs("&gt;", fd); fputs("&gt;", fd);
break; break;
case '&': case '&':
fputs("&amp;", fd); fputs("&amp;", fd);
break; break;
default: default:
fputc(*s, fd); fputc(*s, fd);
@ -608,7 +608,7 @@ static int svg_embedded_image(xRect *r, double rx1, double ry1, double rx2, doub
/* screen position */ /* screen position */
if(RECT_OUTSIDE(x1, y1, x2, y2, if(RECT_OUTSIDE(x1, y1, x2, y2,
xctx->areax1,xctx->areay1,xctx->areax2,xctx->areay2)) return 0; xctx->areax1,xctx->areay1,xctx->areax2,xctx->areay2)) return 0;
if(rot == 1 || rot == 3) { if(rot == 1 || rot == 3) {
w = fabs(y2 - y1); w = fabs(y2 - y1);
h = fabs(x2 - x1); h = fabs(x2 - x1);
@ -629,12 +629,12 @@ static int svg_embedded_image(xRect *r, double rx1, double ry1, double rx2, doub
if(!strncmp(attr, "/9j/", 4)) jpg = 1; if(!strncmp(attr, "/9j/", 4)) jpg = 1;
else if(!strncmp(attr, "iVBOR", 5)) jpg = 0; else if(!strncmp(attr, "iVBOR", 5)) jpg = 0;
else if(my_memmem(buffer, buffer_size, "<svg", 4) && else if(my_memmem(buffer, buffer_size, "<svg", 4) &&
my_memmem(buffer, buffer_size, "xmlns", 5)) { my_memmem(buffer, buffer_size, "xmlns", 5)) {
if(filter) { if(filter) {
jpg = 2; /* svg */ jpg = 2; /* svg */
} }
} }
else jpg = -1; /* some invalid data */ else jpg = -1; /* some invalid data */
} else { } else {
jpg = -1; jpg = -1;
@ -668,7 +668,7 @@ static int svg_embedded_image(xRect *r, double rx1, double ry1, double rx2, doub
} }
} }
my_snprintf(transform, S(transform), my_snprintf(transform, S(transform),
"transform=\"translate(%g,%g) rotate(%d) scale(%g,%g)\"", xorig, yorig, rot * 90, scalex, scaley); "transform=\"translate(%g,%g) rotate(%d) scale(%g,%g)\"", xorig, yorig, rot * 90, scalex, scaley);
if(alpha == 1.0) strcpy(opacity, ""); if(alpha == 1.0) strcpy(opacity, "");
else my_snprintf(opacity, S(opacity), "style=\"opacity:%g;\"", alpha); else my_snprintf(opacity, S(opacity), "style=\"opacity:%g;\"", alpha);
@ -709,7 +709,7 @@ static void svg_draw_symbol(int c, int n,int layer,short tmp_flip, short rot,
type = xctx->sym[xctx->inst[n].ptr].type; type = xctx->sym[xctx->inst[n].ptr].type;
lvs_ignore=tclgetboolvar("lvs_ignore"); lvs_ignore=tclgetboolvar("lvs_ignore");
if(xctx->inst[n].ptr == -1) return; if(xctx->inst[n].ptr == -1) return;
if(layer == 0) { if(layer == 0) {
xctx->inst[n].flags &= ~IGNORE_INST; /* clear bit */ xctx->inst[n].flags &= ~IGNORE_INST; /* clear bit */
if( type && strcmp(type, "launcher") && strcmp(type, "logo") && if( type && strcmp(type, "launcher") && strcmp(type, "logo") &&
strcmp(type, "probe") && strcmp(type, "probe") &&
@ -759,7 +759,7 @@ static void svg_draw_symbol(int c, int n,int layer,short tmp_flip, short rot,
} }
if(hide) { if(hide) {
int color = (disabled==1) ? GRIDLAYER : (disabled == 2) ? PINLAYER : SYMLAYER; int color = (disabled==1) ? GRIDLAYER : (disabled == 2) ? PINLAYER : SYMLAYER;
svg_filledrect(color, xctx->inst[n].xx1, xctx->inst[n].yy1, xctx->inst[n].xx2, xctx->inst[n].yy2, svg_filledrect(color, xctx->inst[n].xx1, xctx->inst[n].yy1, xctx->inst[n].xx2, xctx->inst[n].yy2,
0.0, 2, 0, -1, -1); 0.0, 2, 0, -1, -1);
} }
} }
@ -874,7 +874,7 @@ static void svg_draw_symbol(int c, int n,int layer,short tmp_flip, short rot,
for(j=0;j< symptr->texts; ++j) { for(j=0;j< symptr->texts; ++j) {
double xscale, yscale; double xscale, yscale;
get_sym_text_size(n, j, &xscale, &yscale); get_sym_text_size(n, j, &xscale, &yscale);
text = symptr->text[j]; text = symptr->text[j];
/* if(xscale*FONTWIDTH* xctx->mooz<1) continue; */ /* if(xscale*FONTWIDTH* xctx->mooz<1) continue; */
@ -884,7 +884,7 @@ static void svg_draw_symbol(int c, int n,int layer,short tmp_flip, short rot,
ROTATION(rot, flip, 0.0,0.0,text.x0,text.y0,x1,y1); ROTATION(rot, flip, 0.0,0.0,text.x0,text.y0,x1,y1);
textlayer = c_for_text; textlayer = c_for_text;
/* do not allow custom text color on hilighted instances */ /* do not allow custom text color on hilighted instances */
if(disabled == 1) textlayer = GRIDLAYER; if(disabled == 1) textlayer = GRIDLAYER;
else if(disabled == 2) textlayer = PINLAYER; else if(disabled == 2) textlayer = PINLAYER;
else if( xctx->inst[n].color == -10000) { else if( xctx->inst[n].color == -10000) {
int lay; int lay;
@ -909,7 +909,7 @@ static void svg_draw_symbol(int c, int n,int layer,short tmp_flip, short rot,
my_snprintf(svg_font_style, S(svg_font_style), "italic"); my_snprintf(svg_font_style, S(svg_font_style), "italic");
if( symptr->text[j].flags & TEXT_OBLIQUE) if( symptr->text[j].flags & TEXT_OBLIQUE)
my_snprintf(svg_font_style, S(svg_font_style), "oblique"); my_snprintf(svg_font_style, S(svg_font_style), "oblique");
if(text_svg) if(text_svg)
svg_draw_string(textlayer, txtptr, svg_draw_string(textlayer, txtptr,
(text.rot + ( (flip && (text.rot & 1) ) ? rot+2 : rot) ) & 0x3, (text.rot + ( (flip && (text.rot & 1) ) ? rot+2 : rot) ) & 0x3,
flip^text.flip, text.hcenter, text.vcenter, flip^text.flip, text.hcenter, text.vcenter,
@ -1007,16 +1007,16 @@ void svg_draw(void)
dx=xctx->xrect[0].width; dx=xctx->xrect[0].width;
dy=xctx->xrect[0].height; dy=xctx->xrect[0].height;
dbg(1, "svg_draw(): dx=%g dy=%g\n", dx, dy); dbg(1, "svg_draw(): dx=%g dy=%g\n", dx, dy);
if(xctx->plotfile[0]) { if(xctx->plotfile[0]) {
fd=fopen(xctx->plotfile, "w"); fd=fopen(xctx->plotfile, "w");
if(!fd) { if(!fd) {
dbg(0, "can not open file: %s\n", xctx->plotfile); dbg(0, "can not open file: %s\n", xctx->plotfile);
return; return;
} }
} else { } else {
fd=fopen("plot.svg", "w"); fd=fopen("plot.svg", "w");
if(!fd) { if(!fd) {
dbg(0, "can not open file: %s\n", "plot.svg"); dbg(0, "can not open file: %s\n", "plot.svg");
return; return;
} }
@ -1070,14 +1070,14 @@ void svg_draw(void)
fprintf(fd, "<svg xmlns=\"http://www.w3.org/2000/svg\"" fprintf(fd, "<svg xmlns=\"http://www.w3.org/2000/svg\""
" xmlns:xlink=\"http://www.w3.org/1999/xlink\"" " xmlns:xlink=\"http://www.w3.org/1999/xlink\""
" width=\"%g\" height=\"%g\" version=\"1.1\">\n", dx, dy); " width=\"%g\" height=\"%g\" version=\"1.1\">\n", dx, dy);
fprintf(fd, "<style type=\"text/css\">\n"); /* use css stylesheet 20121119 */ fprintf(fd, "<style type=\"text/css\">\n"); /* use css stylesheet 20121119 */
/* fill_pattern: /* fill_pattern:
* 0 : no fill * 0 : no fill
* 1 : stippled fill * 1 : stippled fill
* 2 : solid fill * 2 : solid fill
* fill_type[i]: * fill_type[i]:
* 0 : no fill * 0 : no fill
* 1 : patterned (stippled) fill * 1 : patterned (stippled) fill
* 2 : solid fill * 2 : solid fill
@ -1085,15 +1085,15 @@ void svg_draw(void)
for(i=0;i<cadlayers; ++i){ for(i=0;i<cadlayers; ++i){
if(unused_layer[i]) continue; if(unused_layer[i]) continue;
fprintf(fd, ".l%d{\n", i); fprintf(fd, ".l%d{\n", i);
if( xctx->fill_pattern == 0 || xctx->fill_type[i] == 0) if( xctx->fill_pattern == 0 || xctx->fill_type[i] == 0)
fprintf(fd, " fill: #%02x%02x%02x; fill-opacity: 0.2;\n", fprintf(fd, " fill: #%02x%02x%02x; fill-opacity: 0.2;\n",
svg_colors[i].red, svg_colors[i].green, svg_colors[i].blue); svg_colors[i].red, svg_colors[i].green, svg_colors[i].blue);
else if( xctx->fill_pattern == 2 && xctx->fill_type[i]) else if( xctx->fill_pattern == 2 && xctx->fill_type[i])
fprintf(fd, " fill: #%02x%02x%02x;\n", svg_colors[i].red, svg_colors[i].green, svg_colors[i].blue); fprintf(fd, " fill: #%02x%02x%02x;\n", svg_colors[i].red, svg_colors[i].green, svg_colors[i].blue);
else if( xctx->fill_pattern && xctx->fill_type[i] == 2) else if( xctx->fill_pattern && xctx->fill_type[i] == 2)
fprintf(fd, " fill: #%02x%02x%02x;\n", svg_colors[i].red, svg_colors[i].green, svg_colors[i].blue); fprintf(fd, " fill: #%02x%02x%02x;\n", svg_colors[i].red, svg_colors[i].green, svg_colors[i].blue);
else else
fprintf(fd, " fill: #%02x%02x%02x; fill-opacity: 0.5;\n", fprintf(fd, " fill: #%02x%02x%02x; fill-opacity: 0.5;\n",
svg_colors[i].red, svg_colors[i].green, svg_colors[i].blue); svg_colors[i].red, svg_colors[i].green, svg_colors[i].blue);
fprintf(fd, " stroke: #%02x%02x%02x;\n", svg_colors[i].red, svg_colors[i].green, svg_colors[i].blue); fprintf(fd, " stroke: #%02x%02x%02x;\n", svg_colors[i].red, svg_colors[i].green, svg_colors[i].blue);
fprintf(fd, " stroke-linecap:round;\n"); fprintf(fd, " stroke-linecap:round;\n");
@ -1105,10 +1105,10 @@ void svg_draw(void)
} }
fprintf(fd, "}\n"); fprintf(fd, "}\n");
} }
fprintf(fd, "text {font-family: %s;}\n", tclgetvar("svg_font_name")); fprintf(fd, "text {font-family: %s;}\n", tclgetvar("svg_font_name"));
fprintf(fd, "</style>\n"); fprintf(fd, "</style>\n");
/* background */ /* background */
fprintf(fd, "<rect class=\"l0\" x=\"%g\" y=\"%g\" width=\"%g\" height=\"%g\"/>\n", 0.0, 0.0, dx, dy); fprintf(fd, "<rect class=\"l0\" x=\"%g\" y=\"%g\" width=\"%g\" height=\"%g\"/>\n", 0.0, 0.0, dx, dy);
svg_drawgrid(); svg_drawgrid();
@ -1167,7 +1167,7 @@ void svg_draw(void)
if(xctx->hilight_nets && (entry=bus_hilight_hash_lookup( xctx->wire[i].node, 0, XLOOKUP))) { if(xctx->hilight_nets && (entry=bus_hilight_hash_lookup( xctx->wire[i].node, 0, XLOOKUP))) {
color = get_color(entry->value); color = get_color(entry->value);
} }
svg_drawline(color, xctx->wire[i].bus, xctx->wire[i].x1, svg_drawline(color, xctx->wire[i].bus, xctx->wire[i].x1,
xctx->wire[i].y1,xctx->wire[i].x2,xctx->wire[i].y2, 0); xctx->wire[i].y1,xctx->wire[i].x2,xctx->wire[i].y2, 0);
} }
@ -1215,8 +1215,8 @@ void svg_draw(void)
my_snprintf(svg_font_style, S(svg_font_style), "italic"); my_snprintf(svg_font_style, S(svg_font_style), "italic");
if( xctx->text[i].flags & TEXT_OBLIQUE) if( xctx->text[i].flags & TEXT_OBLIQUE)
my_snprintf(svg_font_style, S(svg_font_style), "oblique"); my_snprintf(svg_font_style, S(svg_font_style), "oblique");
if(text_svg) if(text_svg)
svg_draw_string(textlayer, get_text_floater(i), svg_draw_string(textlayer, get_text_floater(i),
xctx->text[i].rot, xctx->text[i].flip, xctx->text[i].hcenter, xctx->text[i].vcenter, xctx->text[i].rot, xctx->text[i].flip, xctx->text[i].hcenter, xctx->text[i].vcenter,
xctx->text[i].x0,xctx->text[i].y0, xctx->text[i].x0,xctx->text[i].y0,

View File

@ -1,22 +1,22 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
# #
# File: symgen.awk # File: symgen.awk
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers # Copyright (C) 1998-2024 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -106,7 +106,7 @@ start_labels == 1 {
next next
} }
/^\./{ /^\./{
if(/^\.bus/) { if(/^\.bus/) {
if( !horizontal || (pos == 0 || pos == 2) ) { if( !horizontal || (pos == 0 || pos == 2) ) {
bus = 1 bus = 1
@ -164,7 +164,7 @@ start_pin {
delta1 = delta2 = pinspacing / 2 delta1 = delta2 = pinspacing / 2
} }
} }
coord += delta1 coord += delta1
pin[pos, n, "coord"] = round(coord) pin[pos, n, "coord"] = round(coord)
dbg("pin[" pos ", " n ", coord]: " pin[pos, n, "coord"] " pinname: " \ dbg("pin[" pos ", " n ", coord]: " pin[pos, n, "coord"] " pinname: " \
@ -181,12 +181,12 @@ start_pin {
END{ END{
header() header()
attrs(attributes) attrs(attributes)
if(horizontal !=1) { if(horizontal !=1) {
firstpinyoffset = round(pintextoffset + pincharspacing * pin[1, "maxlength"]) firstpinyoffset = round(pintextoffset + pincharspacing * pin[1, "maxlength"])
lastpinyoffset = round(pintextoffset + pincharspacing * pin[3, "maxlength"]) lastpinyoffset = round(pintextoffset + pincharspacing * pin[3, "maxlength"])
} }
dbg("pin[1, maxlength]: " pin[1, "maxlength"]) dbg("pin[1, maxlength]: " pin[1, "maxlength"])
dbg("pin[3, maxlength]: " pin[3, "maxlength"]) dbg("pin[3, maxlength]: " pin[3, "maxlength"])
dbg("firstpinyoffset: " firstpinyoffset) dbg("firstpinyoffset: " firstpinyoffset)
@ -218,19 +218,19 @@ END{
for(n = 0; n < pin[p,"n"]; n++) { for(n = 0; n < pin[p,"n"]; n++) {
dir = pin[p, n, "dir"] dir = pin[p, n, "dir"]
plinelay = (dir =="in") ? 4 : (dir == "inout") ? 3 : 2 plinelay = (dir =="in") ? 4 : (dir == "inout") ? 3 : 2
if(p == 0 ) { if(p == 0 ) {
x = symbolx1 - pinlinelength x = symbolx1 - pinlinelength
y = symboly1 + pin[p, n, "coord"] + firstpinyoffset y = symboly1 + pin[p, n, "coord"] + firstpinyoffset
} }
else if(p == 1 ) { else if(p == 1 ) {
x = symbolx1 + pin[p, n, "coord"] x = symbolx1 + pin[p, n, "coord"]
y = symboly1 - pinlinelength y = symboly1 - pinlinelength
} }
else if(p == 2 ) { else if(p == 2 ) {
x = symbolx2 + pinlinelength x = symbolx2 + pinlinelength
y = symboly1 + pin[p, n, "coord"] + firstpinyoffset y = symboly1 + pin[p, n, "coord"] + firstpinyoffset
} }
else if(p == 3 ) { else if(p == 3 ) {
x = symbolx1 + pin[p, n, "coord"] x = symbolx1 + pin[p, n, "coord"]
y = symboly2 + pinlinelength y = symboly2 + pinlinelength
} }
@ -327,7 +327,7 @@ END{
laby = (symboly1 + symboly2) / 2 + ( l - label["n"] / 2 ) * labelspacing + labelcenteroffset laby = (symboly1 + symboly2) / 2 + ( l - label["n"] / 2 ) * labelspacing + labelcenteroffset
text(label[l], labx, laby, 0, 0, labeltextsize, "hcenter=1") text(label[l], labx, laby, 0, 0, labeltextsize, "hcenter=1")
} }
} }
function dbg(s) function dbg(s)
{ {
@ -360,7 +360,7 @@ function trigger(x, y, layer, pos)
} }
function pinnumber_id(pinseq) function pinnumber_id(pinseq)
{ {
return("@#" pinseq ":pinnumber") return("@#" pinseq ":pinnumber")
} }

View File

@ -1,22 +1,22 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
# #
# File: tedax.awk # File: tedax.awk
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers # Copyright (C) 1998-2024 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -30,14 +30,14 @@ BEGIN{
# conn U1:2 INPUT_A A 1:4:9:12 1 # conn U1:2 INPUT_A A 1:4:9:12 1
/^[ \t]*#/{ print; next} /^[ \t]*#/{ print; next}
/^begin netlist/{ /^begin netlist/{
print print
next next
} }
/^begin_inst .* numslots/{ /^begin_inst .* numslots/{
reparse() reparse()
numslots=$4; numslots=$4;
if(numslots ==0) numslots = 1 if(numslots ==0) numslots = 1
next next
} }
@ -78,7 +78,7 @@ $1=="device"||$1=="footprint"{
} }
next next
} }
# conn U1 Tx2In Tx2\ In 10 10 # conn U1 Tx2In Tx2\ In 10 10
/^conn/{ /^conn/{
reparse() reparse()
@ -137,7 +137,7 @@ $1=="device"||$1=="footprint"{
print "pinname", i_arr[1], i_arr[2], n_arr[3] print "pinname", i_arr[1], i_arr[2], n_arr[3]
} }
} }
for(ii = 0; ii < footprint_n; ii++) { # used to preserve ordering for(ii = 0; ii < footprint_n; ii++) { # used to preserve ordering
i = footprint_num[ii] i = footprint_num[ii]
print "footprint", i, footprint[i] print "footprint", i, footprint[i]
@ -157,7 +157,7 @@ $1=="device"||$1=="footprint"{
delete device delete device
delete device_num # used to preserve ordering delete device_num # used to preserve ordering
device_n = 0 device_n = 0
next next
} }

View File

@ -150,7 +150,7 @@ int global_tedax_netlist(int global, int alert) /* netlister driver */
bus_char[1] = str_tmp[1]; bus_char[1] = str_tmp[1];
} }
xctx->netlist_count=0; xctx->netlist_count=0;
my_snprintf(netl_filename, S(netl_filename), "%s/.%s_%d", my_snprintf(netl_filename, S(netl_filename), "%s/.%s_%d",
tclgetvar("netlist_dir"), get_cell(xctx->sch[xctx->currsch], 0), getpid()); tclgetvar("netlist_dir"), get_cell(xctx->sch[xctx->currsch], 0), getpid());
fd=fopen(netl_filename, "w"); fd=fopen(netl_filename, "w");
if(fd==NULL){ if(fd==NULL){
@ -197,7 +197,7 @@ int global_tedax_netlist(int global, int alert) /* netlister driver */
{ {
int saved_hilight_nets = xctx->hilight_nets; int saved_hilight_nets = xctx->hilight_nets;
int web_url = is_from_web(xctx->current_dirname); int web_url = is_from_web(xctx->current_dirname);
char *current_dirname_save = NULL; char *current_dirname_save = NULL;
unselect_all(1); unselect_all(1);
/* ensure all unused symbols purged before descending hierarchy */ /* ensure all unused symbols purged before descending hierarchy */

View File

@ -47,12 +47,12 @@ void floater_hash_all_names(void)
int i; int i;
int_hash_free(&xctx->floater_inst_table); int_hash_free(&xctx->floater_inst_table);
int_hash_init(&xctx->floater_inst_table, HASHSIZE); int_hash_init(&xctx->floater_inst_table, HASHSIZE);
for(i=0; i<xctx->instances; ++i) { for(i=0; i<xctx->instances; ++i) {
if(xctx->inst[i].instname && xctx->inst[i].instname[0]) { if(xctx->inst[i].instname && xctx->inst[i].instname[0]) {
int_hash_lookup(&xctx->floater_inst_table, xctx->inst[i].instname, i, XINSERT); int_hash_lookup(&xctx->floater_inst_table, xctx->inst[i].instname, i, XINSERT);
} }
} }
} }
/* if cmd is wrapped inside tcleval(...) pass the content to tcl /* if cmd is wrapped inside tcleval(...) pass the content to tcl
* for evaluation, return tcl result. If no tcleval(...) found return copy of cmd */ * for evaluation, return tcl result. If no tcleval(...) found return copy of cmd */
@ -82,8 +82,8 @@ int is_generator(const char *name)
{ {
#ifdef __unix__ #ifdef __unix__
int res = 0; int res = 0;
static regex_t *re = NULL; static regex_t *re = NULL;
if(!name) { if(!name) {
if(re) { if(re) {
regfree(re); regfree(re);
@ -112,7 +112,7 @@ int is_generator(const char *name)
} }
/* cleanup syntax of symbol generators: xxx(a,b,c) --> xxx_a_b_c */ /* cleanup syntax of symbol generators: xxx(a,b,c) --> xxx_a_b_c */
const char *sanitize(const char *name) const char *sanitize(const char *name)
{ {
static char *s = NULL; static char *s = NULL;
static char *empty=""; static char *empty="";
@ -182,7 +182,7 @@ char *get_generator_command(const char *str)
int match_symbol(const char *name) /* never returns -1, if symbol not found load systemlib/missing.sym */ int match_symbol(const char *name) /* never returns -1, if symbol not found load systemlib/missing.sym */
{ {
int i,found; int i,found;
found=0; found=0;
dbg(1, "match_symbol(): name=%s\n", name); dbg(1, "match_symbol(): name=%s\n", name);
for(i=0;i<xctx->symbols; ++i) { for(i=0;i<xctx->symbols; ++i) {
@ -360,32 +360,32 @@ const char *list_tokens(const char *s, int with_quotes)
} }
static int get_sym_pin_number(int sym, const char *pin_name) static int get_sym_pin_number(int sym, const char *pin_name)
{ {
int n = -1; int n = -1;
if(isonlydigit(pin_name)) { if(isonlydigit(pin_name)) {
n = atoi(pin_name); n = atoi(pin_name);
} }
else if(pin_name[0]) { else if(pin_name[0]) {
for(n = 0 ; n < xctx->sym[sym].rects[PINLAYER]; ++n) { for(n = 0 ; n < xctx->sym[sym].rects[PINLAYER]; ++n) {
char *prop = xctx->sym[sym].rect[PINLAYER][n].prop_ptr; char *prop = xctx->sym[sym].rect[PINLAYER][n].prop_ptr;
if(!strcmp(get_tok_value(prop,"name",0), pin_name)) break; if(!strcmp(get_tok_value(prop,"name",0), pin_name)) break;
} }
} }
return n; return n;
} }
int get_inst_pin_number(int inst, const char *pin_name) int get_inst_pin_number(int inst, const char *pin_name)
{ {
int n = -1; int n = -1;
if(isonlydigit(pin_name)) { if(isonlydigit(pin_name)) {
n = atoi(pin_name); n = atoi(pin_name);
} }
else if(pin_name[0] && xctx->inst[inst].ptr >= 0) { else if(pin_name[0] && xctx->inst[inst].ptr >= 0) {
for(n = 0 ; n < (xctx->inst[inst].ptr + xctx->sym)->rects[PINLAYER]; ++n) { for(n = 0 ; n < (xctx->inst[inst].ptr + xctx->sym)->rects[PINLAYER]; ++n) {
char *prop = (xctx->inst[inst].ptr + xctx->sym)->rect[PINLAYER][n].prop_ptr; char *prop = (xctx->inst[inst].ptr + xctx->sym)->rect[PINLAYER][n].prop_ptr;
if(!strcmp(get_tok_value(prop,"name",0), pin_name)) break; if(!strcmp(get_tok_value(prop,"name",0), pin_name)) break;
} }
} }
return n; return n;
} }
@ -416,7 +416,7 @@ static void get_pin_and_attr(const char *token, char **pin_num_or_name, char **p
my_strdup2(_ALLOC_ID_, pin_attr, ""); my_strdup2(_ALLOC_ID_, pin_attr, "");
} }
dbg(1, "get_pin_and_attr(): token=%s, name=%s, attr=%s\n", token, dbg(1, "get_pin_and_attr(): token=%s, name=%s, attr=%s\n", token,
*pin_num_or_name ? *pin_num_or_name : "<NULL>", *pin_num_or_name ? *pin_num_or_name : "<NULL>",
*pin_attr ? *pin_attr: "<NULL>"); *pin_attr ? *pin_attr: "<NULL>");
} }
@ -449,7 +449,7 @@ const char *get_tok_value(const char *s,const char *tok, int with_quotes)
static char *translated_tok = NULL; static char *translated_tok = NULL;
xctx->tok_size = 0; xctx->tok_size = 0;
if(s==NULL) { if(s==NULL) {
if(tok == NULL) { if(tok == NULL) {
my_free(_ALLOC_ID_, &result); my_free(_ALLOC_ID_, &result);
@ -624,7 +624,7 @@ const char *get_sym_template(char *s,char *extra)
} }
/* caller is responsible for freeing up storage for return value /* caller is responsible for freeing up storage for return value
* return NULL if no matching token found * return NULL if no matching token found
* caller is responsible for freeing up storage for pin_attr_value */ * caller is responsible for freeing up storage for pin_attr_value */
static char *get_pin_attr_from_inst(int inst, int pin, const char *attr) static char *get_pin_attr_from_inst(int inst, int pin, const char *attr)
{ {
@ -715,7 +715,7 @@ void hash_names(int inst, int action)
/* return -1 if name is not used, else return first instance number with same name found /* return -1 if name is not used, else return first instance number with same name found
* old_basename: base name (without [...]) of instance name the new 'name' was built from * old_basename: base name (without [...]) of instance name the new 'name' was built from
* brkt: pointer to '[...]' part of instance name (or empty string if no [...] found) * brkt: pointer to '[...]' part of instance name (or empty string if no [...] found)
* q: integer number added to 'name' when trying an unused instance name * q: integer number added to 'name' when trying an unused instance name
* (name = old_basename + q + bracket) * (name = old_basename + q + bracket)
* or -1 if only testing for unique 'name'. * or -1 if only testing for unique 'name'.
*/ */
@ -767,14 +767,14 @@ void new_prop_string(int i, const char *old_prop, int dis_uniq_names)
char *old_name_base = NULL; char *old_name_base = NULL;
char *up_new_name = NULL; char *up_new_name = NULL;
int is_used; int is_used;
dbg(1, "new_prop_string(): i=%d, old_prop=%s\n", i, old_prop); dbg(1, "new_prop_string(): i=%d, old_prop=%s\n", i, old_prop);
if(old_prop==NULL) { if(old_prop==NULL) {
my_free(_ALLOC_ID_, &xctx->inst[i].prop_ptr); my_free(_ALLOC_ID_, &xctx->inst[i].prop_ptr);
return; return;
} }
old_name_len = my_strdup(_ALLOC_ID_, &old_name,get_tok_value(old_prop,"name",0) ); /* added old_name_len */ old_name_len = my_strdup(_ALLOC_ID_, &old_name,get_tok_value(old_prop,"name",0) ); /* added old_name_len */
if(old_name==NULL) { if(old_name==NULL) {
my_strdup(_ALLOC_ID_, &xctx->inst[i].prop_ptr, old_prop); /* changed to copy old props if no name */ my_strdup(_ALLOC_ID_, &xctx->inst[i].prop_ptr, old_prop); /* changed to copy old props if no name */
my_strdup2(_ALLOC_ID_, &xctx->inst[i].instname, ""); my_strdup2(_ALLOC_ID_, &xctx->inst[i].instname, "");
@ -795,13 +795,13 @@ void new_prop_string(int i, const char *old_prop, int dis_uniq_names)
if(!n) old_name_base[0] = '\0'; /* there is no basename (like in "[3:0]" or "12"), set to empty string */ if(!n) old_name_base[0] = '\0'; /* there is no basename (like in "[3:0]" or "12"), set to empty string */
brkt=find_bracket(old_name); /* if no bracket found will point to end of string ('\0') */ brkt=find_bracket(old_name); /* if no bracket found will point to end of string ('\0') */
my_realloc(_ALLOC_ID_, &new_name, old_name_len + 40); my_realloc(_ALLOC_ID_, &new_name, old_name_len + 40);
qq = get_last_used_index(old_name_base, brkt); /* */ qq = get_last_used_index(old_name_base, brkt); /* */
for(q = qq;; ++q) { for(q = qq;; ++q) {
my_snprintf(new_name, old_name_len + 40, "%s%d%s", old_name_base, q, brkt); my_snprintf(new_name, old_name_len + 40, "%s%d%s", old_name_base, q, brkt);
is_used = name_is_used(new_name, old_name_base, brkt, q); is_used = name_is_used(new_name, old_name_base, brkt, q);
if(is_used == -1 ) break; if(is_used == -1 ) break;
} }
my_free(_ALLOC_ID_, &old_name_base); my_free(_ALLOC_ID_, &old_name_base);
dbg(1, "new_prop_string(): new_name=%s\n", new_name); dbg(1, "new_prop_string(): new_name=%s\n", new_name);
@ -958,10 +958,10 @@ static void print_vhdl_primitive(FILE *fd, int inst) /* netlist primitives, 200
if(!xctx->tok_size) if(!xctx->tok_size)
my_strdup(_ALLOC_ID_, &format, get_tok_value(xctx->sym[xctx->inst[inst].ptr].prop_ptr, fmt_attr, 2)); my_strdup(_ALLOC_ID_, &format, get_tok_value(xctx->sym[xctx->inst[inst].ptr].prop_ptr, fmt_attr, 2));
/* allow format string override in instance */ /* allow format string override in instance */
if(xctx->tok_size && strcmp(fmt_attr, "vhdl_format")) if(xctx->tok_size && strcmp(fmt_attr, "vhdl_format"))
my_strdup(_ALLOC_ID_, &format, get_tok_value(xctx->inst[inst].prop_ptr, "vhdl_format", 2)); my_strdup(_ALLOC_ID_, &format, get_tok_value(xctx->inst[inst].prop_ptr, "vhdl_format", 2));
/* get netlist format rule from symbol */ /* get netlist format rule from symbol */
if(!xctx->tok_size && strcmp(fmt_attr, "vhdl_format")) if(!xctx->tok_size && strcmp(fmt_attr, "vhdl_format"))
my_strdup(_ALLOC_ID_, &format, get_tok_value(xctx->sym[xctx->inst[inst].ptr].prop_ptr, "vhdl_format", 2)); my_strdup(_ALLOC_ID_, &format, get_tok_value(xctx->sym[xctx->inst[inst].ptr].prop_ptr, "vhdl_format", 2));
if((name==NULL) || (format==NULL) ) { if((name==NULL) || (format==NULL) ) {
my_free(_ALLOC_ID_, &template); my_free(_ALLOC_ID_, &template);
@ -1042,7 +1042,7 @@ static void print_vhdl_primitive(FILE *fd, int inst) /* netlist primitives, 200
const char *s = sanitize(translate(inst, get_sym_name(inst, 0, 0, 0))); const char *s = sanitize(translate(inst, get_sym_name(inst, 0, 0, 0)));
my_mstrcat(_ALLOC_ID_, &result, s, NULL); my_mstrcat(_ALLOC_ID_, &result, s, NULL);
} }
else if (strcmp(token,"@symname_ext")==0) else if (strcmp(token,"@symname_ext")==0)
{ {
const char *s = sanitize(translate(inst, get_sym_name(inst, 0, 1, 0))); const char *s = sanitize(translate(inst, get_sym_name(inst, 0, 1, 0)));
my_mstrcat(_ALLOC_ID_, &result, s, NULL); my_mstrcat(_ALLOC_ID_, &result, s, NULL);
@ -1096,7 +1096,7 @@ static void print_vhdl_primitive(FILE *fd, int inst) /* netlist primitives, 200
} }
} }
/* reference by pin number instead of pin name, allows faster lookup of the attached net name /* reference by pin number instead of pin name, allows faster lookup of the attached net name
* @#0, @#1:net_name, @#2:name, ... */ * @#0, @#1:net_name, @#2:name, ... */
else if(token[0]=='@' && token[1]=='#') { else if(token[0]=='@' && token[1]=='#') {
int n; int n;
@ -1197,7 +1197,7 @@ static void print_vhdl_primitive(FILE *fd, int inst) /* netlist primitives, 200
* can be calculated. Before that do also a round of translation to remove remaining @params */ * can be calculated. Before that do also a round of translation to remove remaining @params */
if(result) { if(result) {
dbg(1, "print_vhdl_primitive(): before translate3() result=%s\n", result); dbg(1, "print_vhdl_primitive(): before translate3() result=%s\n", result);
if(strchr(result, '@')) { if(strchr(result, '@')) {
/* netlist_commands often have @ characters due to ngspice syntax. Do not translate */ /* netlist_commands often have @ characters due to ngspice syntax. Do not translate */
if(strcmp(xctx->sym[xctx->inst[inst].ptr].type, "netlist_commands")) { if(strcmp(xctx->sym[xctx->inst[inst].ptr].type, "netlist_commands")) {
my_strdup2(_ALLOC_ID_, &result, my_strdup2(_ALLOC_ID_, &result,
@ -1205,18 +1205,18 @@ static void print_vhdl_primitive(FILE *fd, int inst) /* netlist primitives, 200
/* can not put template in above translate3: -----------------------^^^^ /* can not put template in above translate3: -----------------------^^^^
* if instance has VHI=VHI, format string has VHI=@VHI, and symbol template has VHI=3 * if instance has VHI=VHI, format string has VHI=@VHI, and symbol template has VHI=3
* we do not want token @VHI to resolve to 3, but stop at VHI as specified in instance */ * we do not want token @VHI to resolve to 3, but stop at VHI as specified in instance */
if(strchr(result, '@')) { if(strchr(result, '@')) {
my_strdup2(_ALLOC_ID_, &result, my_strdup2(_ALLOC_ID_, &result,
translate3(result, 0, xctx->inst[inst].prop_ptr, parent_prop_ptr, template, NULL)); translate3(result, 0, xctx->inst[inst].prop_ptr, parent_prop_ptr, template, NULL));
} }
} }
} }
my_strdup2(_ALLOC_ID_, &result, tcl_hook2(result)); /* tcl evaluation if tcleval(....) */ my_strdup2(_ALLOC_ID_, &result, tcl_hook2(result)); /* tcl evaluation if tcleval(....) */
if(is_expr(result)) { if(is_expr(result)) {
my_strdup2(_ALLOC_ID_, &result, eval_expr(result)); my_strdup2(_ALLOC_ID_, &result, eval_expr(result));
} }
dbg(1, "print_vhdl_primitive(): after translate3() result=%s\n", result); dbg(1, "print_vhdl_primitive(): after translate3() result=%s\n", result);
} }
if(result) fprintf(fd, "%s", result); if(result) fprintf(fd, "%s", result);
fputc('\n',fd); fputc('\n',fd);
fprintf(fd, "---- end primitive\n"); fprintf(fd, "---- end primitive\n");
@ -1417,7 +1417,7 @@ const char *get_trailing_path(const char *str, int no_of_dir, int skip_ext)
size_t ext_pos, dir_pos; size_t ext_pos, dir_pos;
int n_ext, n_dir, c, i, generator = 0; int n_ext, n_dir, c, i, generator = 0;
if(str == NULL) return NULL; if(str == NULL) return NULL;
my_strncpy(s, str, S(s)); my_strncpy(s, str, S(s));
len = strlen(s); len = strlen(s);
@ -1750,7 +1750,7 @@ void print_generic(FILE *fd, char *ent_or_comp, int symbol)
{ {
my_strdup(_ALLOC_ID_, &generic_type, my_strdup(_ALLOC_ID_, &generic_type,
get_tok_value(xctx->sym[symbol].rect[GENERICLAYER][i].prop_ptr,"generic_type",0)); get_tok_value(xctx->sym[symbol].rect[GENERICLAYER][i].prop_ptr,"generic_type",0));
my_strdup(_ALLOC_ID_, &generic_value, my_strdup(_ALLOC_ID_, &generic_value,
get_tok_value(xctx->sym[symbol].rect[GENERICLAYER][i].prop_ptr,"value", 0) ); get_tok_value(xctx->sym[symbol].rect[GENERICLAYER][i].prop_ptr,"value", 0) );
str_tmp = get_tok_value(xctx->sym[symbol].rect[GENERICLAYER][i].prop_ptr,"name",0); str_tmp = get_tok_value(xctx->sym[symbol].rect[GENERICLAYER][i].prop_ptr,"name",0);
if(!tmp) fprintf(fd, "generic (\n"); if(!tmp) fprintf(fd, "generic (\n");
@ -1879,7 +1879,7 @@ void print_tedax_subckt(FILE *fd, int symbol)
} }
/* This function is used to generate the @pinlist replacement getting port order /* This function is used to generate the @pinlist replacement getting port order
* from the spice_sym_def attribute (either directly or by loading the provided .include file), * from the spice_sym_def attribute (either directly or by loading the provided .include file),
* checking with the corresponding symbol pin name and getting the net name attached to it. * checking with the corresponding symbol pin name and getting the net name attached to it.
* Any name mismatch is reported, in this case the function does nothing and the default xschem * Any name mismatch is reported, in this case the function does nothing and the default xschem
* symbol port ordering will be used. */ * symbol port ordering will be used. */
@ -1904,7 +1904,7 @@ static int has_included_subcircuit(int inst, int symbol, char **result)
char *net, *net_save; char *net, *net_save;
Str_hashentry *entry; Str_hashentry *entry;
Str_hashtable table = {NULL, 0}; Str_hashtable table = {NULL, 0};
my_strdup2(_ALLOC_ID_, &symname, get_tok_value(xctx->inst[inst].prop_ptr, "schematic", 0)); my_strdup2(_ALLOC_ID_, &symname, get_tok_value(xctx->inst[inst].prop_ptr, "schematic", 0));
if(!symname[0]) { if(!symname[0]) {
my_strdup2(_ALLOC_ID_, &symname, get_tok_value(xctx->sym[symbol].prop_ptr, "schematic", 0)); my_strdup2(_ALLOC_ID_, &symname, get_tok_value(xctx->sym[symbol].prop_ptr, "schematic", 0));
@ -1990,7 +1990,7 @@ static int has_included_subcircuit(int inst, int symbol, char **result)
dbg(0, "has_included_subcircuit(): %s symbol and .subckt pins do not match. Discard port order\n", dbg(0, "has_included_subcircuit(): %s symbol and .subckt pins do not match. Discard port order\n",
symname); symname);
if(has_x) if(has_x)
tclvareval("alert_ {has_included_subcircuit(): ", symname, tclvareval("alert_ {has_included_subcircuit(): ", symname,
" symbol and .subckt pins do not match. Discard .subckt port order}", NULL); " symbol and .subckt pins do not match. Discard .subckt port order}", NULL);
} }
if(tmp_result) my_free(_ALLOC_ID_, &tmp_result); if(tmp_result) my_free(_ALLOC_ID_, &tmp_result);
@ -2128,7 +2128,7 @@ void print_spice_subckt_nodes(FILE *fd, int symbol)
} }
my_free(_ALLOC_ID_, &pin_attr); my_free(_ALLOC_ID_, &pin_attr);
my_free(_ALLOC_ID_, &pin_num_or_name); my_free(_ALLOC_ID_, &pin_num_or_name);
} }
/* this will print the other @parameters, usually "extra" nodes so they will be in the order /* this will print the other @parameters, usually "extra" nodes so they will be in the order
* specified by the format string. The 'extra' attribute is no more used to print extra nodes * specified by the format string. The 'extra' attribute is no more used to print extra nodes
@ -2140,7 +2140,7 @@ void print_spice_subckt_nodes(FILE *fd, int symbol)
my_mstrcat(_ALLOC_ID_, &result, token + 1, " ", NULL); my_mstrcat(_ALLOC_ID_, &result, token + 1, " ", NULL);
} }
} }
/* if(c!='%' && c!='@' && c!='\0' ) fputc(c,fd); */ /* if(c!='%' && c!='@' && c!='\0' ) fputc(c,fd); */
if(c == '@' || c =='%') s--; if(c == '@' || c =='%') s--;
state=TOK_BEGIN; state=TOK_BEGIN;
} }
@ -2289,7 +2289,7 @@ void print_spectre_subckt_nodes(FILE *fd, int symbol)
} }
my_free(_ALLOC_ID_, &pin_attr); my_free(_ALLOC_ID_, &pin_attr);
my_free(_ALLOC_ID_, &pin_num_or_name); my_free(_ALLOC_ID_, &pin_num_or_name);
} }
/* this will print the other @parameters, usually "extra" nodes so they will be in the order /* this will print the other @parameters, usually "extra" nodes so they will be in the order
* specified by the format string. The 'extra' attribute is no more used to print extra nodes * specified by the format string. The 'extra' attribute is no more used to print extra nodes
@ -2301,7 +2301,7 @@ void print_spectre_subckt_nodes(FILE *fd, int symbol)
my_mstrcat(_ALLOC_ID_, &result, token + 1, " ", NULL); my_mstrcat(_ALLOC_ID_, &result, token + 1, " ", NULL);
} }
} }
/* if(c!='%' && c!='@' && c!='\0' ) fputc(c,fd); */ /* if(c!='%' && c!='@' && c!='\0' ) fputc(c,fd); */
if(c == '@' || c =='%') s--; if(c == '@' || c =='%') s--;
state=TOK_BEGIN; state=TOK_BEGIN;
} }
@ -2349,7 +2349,7 @@ int print_spice_element(FILE *fd, int inst)
const char *str_ptr=NULL; const char *str_ptr=NULL;
register int c, state=TOK_BEGIN, space; register int c, state=TOK_BEGIN, space;
char *template=NULL,*format=NULL, *s, *name=NULL, *token=NULL; char *template=NULL,*format=NULL, *s, *name=NULL, *token=NULL;
const char *lab; const char *lab;
const char *value = NULL; const char *value = NULL;
/* char *translatedvalue = NULL; */ /* char *translatedvalue = NULL; */
size_t sizetok=0; size_t sizetok=0;
@ -2358,7 +2358,7 @@ int print_spice_element(FILE *fd, int inst)
int no_of_pins=0; int no_of_pins=0;
char *result = NULL; char *result = NULL;
size_t size = 0; size_t size = 0;
char *spiceprefixtag = NULL; char *spiceprefixtag = NULL;
const char *fmt_attr = NULL; const char *fmt_attr = NULL;
size = CADCHUNKALLOC; size = CADCHUNKALLOC;
@ -2425,7 +2425,7 @@ int print_spice_element(FILE *fd, int inst)
token[token_pos]='\0'; token[token_pos]='\0';
token_pos=0; token_pos=0;
if(strcmp(token,"@symref")==0) if(strcmp(token,"@symref")==0)
{ {
const char *s = get_sym_name(inst, 9999, 1, 0); const char *s = get_sym_name(inst, 9999, 1, 0);
my_mstrcat(_ALLOC_ID_, &result, s, NULL); my_mstrcat(_ALLOC_ID_, &result, s, NULL);
@ -2479,7 +2479,7 @@ int print_spice_element(FILE *fd, int inst)
if(!spice_ignore) { if(!spice_ignore) {
if(!int_hash_lookup(&table, name, 1, XINSERT_NOREPLACE)) { if(!int_hash_lookup(&table, name, 1, XINSERT_NOREPLACE)) {
str_ptr = net_name(inst, i, &multip, 0, 1); str_ptr = net_name(inst, i, &multip, 0, 1);
my_mstrcat(_ALLOC_ID_, &result, "?", my_itoa(multip), " ", str_ptr, " ", NULL); my_mstrcat(_ALLOC_ID_, &result, "?", my_itoa(multip), " ", str_ptr, " ", NULL);
} }
} }
@ -2500,13 +2500,13 @@ int print_spice_element(FILE *fd, int inst)
} }
} }
} }
/* reference by pin number instead of pin name, allows faster lookup of the attached net name /* reference by pin number instead of pin name, allows faster lookup of the attached net name
* @#0, @#1:net_name, @#2:name, ... */ * @#0, @#1:net_name, @#2:name, ... */
else if(token[0]=='@' && token[1]=='#') { else if(token[0]=='@' && token[1]=='#') {
int n; int n;
char *pin_attr = NULL; char *pin_attr = NULL;
char *pin_num_or_name = NULL; char *pin_num_or_name = NULL;
get_pin_and_attr(token, &pin_num_or_name, &pin_attr); get_pin_and_attr(token, &pin_num_or_name, &pin_attr);
n = get_inst_pin_number(inst, pin_num_or_name); n = get_inst_pin_number(inst, pin_num_or_name);
if(n>=0 && pin_attr[0] && n < (xctx->inst[inst].ptr + xctx->sym)->rects[PINLAYER]) { if(n>=0 && pin_attr[0] && n < (xctx->inst[inst].ptr + xctx->sym)->rects[PINLAYER]) {
@ -2604,16 +2604,16 @@ int print_spice_element(FILE *fd, int inst)
* passgate.sch: * passgate.sch:
* instance of nmos.sym: L=L_N W=W_N nf=1 m=1 model=@modeln * instance of nmos.sym: L=L_N W=W_N nf=1 m=1 model=@modeln
* nmos.sym: * nmos.sym:
* format="@name @pinlist @model L=@L W=@W nf=@nf * format="@name @pinlist @model L=@L W=@W nf=@nf
* + ad=@ad as=@as pd=@pd .... m=@m * + ad=@ad as=@as pd=@pd .... m=@m
* template="name=M1 W=1 L=0.15 m=1 * template="name=M1 W=1 L=0.15 m=1
* ad=\"expr('int((@nf + 1)/2) * @W / @nf * 0.29')\" * ad=\"expr('int((@nf + 1)/2) * @W / @nf * 0.29')\"
* ..." * ..."
* model=nfet_01v8 * model=nfet_01v8
*/ */
my_strdup2(_ALLOC_ID_, &val, my_strdup2(_ALLOC_ID_, &val,
translate3(token, 0, xctx->inst[inst].prop_ptr, NULL, NULL, NULL)); translate3(token, 0, xctx->inst[inst].prop_ptr, NULL, NULL, NULL));
/* can not put template in above translate3: ---------------------------^^^^ /* can not put template in above translate3: ---------------------------^^^^
* if instance has VHI=VHI, format string has VHI=@VHI, and symbol template has VHI=3 * if instance has VHI=VHI, format string has VHI=@VHI, and symbol template has VHI=3
@ -2681,7 +2681,7 @@ int print_spice_element(FILE *fd, int inst)
if (!(strcmp(token+1,"name") && strcmp(token+1,"lab")) /* expand name/labels */ if (!(strcmp(token+1,"name") && strcmp(token+1,"lab")) /* expand name/labels */
&& ((lab = expandlabel(value, &itmp)) != NULL)) { && ((lab = expandlabel(value, &itmp)) != NULL)) {
my_mstrcat(_ALLOC_ID_, &result, lab, NULL); my_mstrcat(_ALLOC_ID_, &result, lab, NULL);
} else { } else {
my_mstrcat(_ALLOC_ID_, &result, value, NULL); my_mstrcat(_ALLOC_ID_, &result, value, NULL);
} }
} }
@ -2743,7 +2743,7 @@ int print_spectre_element(FILE *fd, int inst)
const char *str_ptr=NULL; const char *str_ptr=NULL;
register int c, state=TOK_BEGIN, space; register int c, state=TOK_BEGIN, space;
char *template=NULL,*format=NULL, *s, *name=NULL, *token=NULL; char *template=NULL,*format=NULL, *s, *name=NULL, *token=NULL;
const char *lab; const char *lab;
const char *value = NULL; const char *value = NULL;
/* char *translatedvalue = NULL; */ /* char *translatedvalue = NULL; */
size_t sizetok=0; size_t sizetok=0;
@ -2752,7 +2752,7 @@ int print_spectre_element(FILE *fd, int inst)
int no_of_pins=0; int no_of_pins=0;
char *result = NULL; char *result = NULL;
size_t size = 0; size_t size = 0;
char *spiceprefixtag = NULL; char *spiceprefixtag = NULL;
const char *fmt_attr = NULL; const char *fmt_attr = NULL;
size = CADCHUNKALLOC; size = CADCHUNKALLOC;
@ -2819,7 +2819,7 @@ int print_spectre_element(FILE *fd, int inst)
token[token_pos]='\0'; token[token_pos]='\0';
token_pos=0; token_pos=0;
if(strcmp(token,"@symref")==0) if(strcmp(token,"@symref")==0)
{ {
const char *s = get_sym_name(inst, 9999, 1, 0); const char *s = get_sym_name(inst, 9999, 1, 0);
my_mstrcat(_ALLOC_ID_, &result, s, NULL); my_mstrcat(_ALLOC_ID_, &result, s, NULL);
@ -2872,7 +2872,7 @@ int print_spectre_element(FILE *fd, int inst)
if(!spectre_ignore) { if(!spectre_ignore) {
if(!int_hash_lookup(&table, name, 1, XINSERT_NOREPLACE)) { if(!int_hash_lookup(&table, name, 1, XINSERT_NOREPLACE)) {
str_ptr = net_name(inst, i, &multip, 0, 1); str_ptr = net_name(inst, i, &multip, 0, 1);
my_mstrcat(_ALLOC_ID_, &result, "?", my_itoa(multip), " ", str_ptr, " ", NULL); my_mstrcat(_ALLOC_ID_, &result, "?", my_itoa(multip), " ", str_ptr, " ", NULL);
} }
} }
@ -2892,13 +2892,13 @@ int print_spectre_element(FILE *fd, int inst)
} }
} }
} }
/* reference by pin number instead of pin name, allows faster lookup of the attached net name /* reference by pin number instead of pin name, allows faster lookup of the attached net name
* @#0, @#1:net_name, @#2:name, ... */ * @#0, @#1:net_name, @#2:name, ... */
else if(token[0]=='@' && token[1]=='#') { else if(token[0]=='@' && token[1]=='#') {
int n; int n;
char *pin_attr = NULL; char *pin_attr = NULL;
char *pin_num_or_name = NULL; char *pin_num_or_name = NULL;
get_pin_and_attr(token, &pin_num_or_name, &pin_attr); get_pin_and_attr(token, &pin_num_or_name, &pin_attr);
n = get_inst_pin_number(inst, pin_num_or_name); n = get_inst_pin_number(inst, pin_num_or_name);
if(n>=0 && pin_attr[0] && n < (xctx->inst[inst].ptr + xctx->sym)->rects[PINLAYER]) { if(n>=0 && pin_attr[0] && n < (xctx->inst[inst].ptr + xctx->sym)->rects[PINLAYER]) {
@ -2996,16 +2996,16 @@ int print_spectre_element(FILE *fd, int inst)
* passgate.sch: * passgate.sch:
* instance of nmos.sym: L=L_N W=W_N nf=1 m=1 model=@modeln * instance of nmos.sym: L=L_N W=W_N nf=1 m=1 model=@modeln
* nmos.sym: * nmos.sym:
* format="@name @pinlist @model L=@L W=@W nf=@nf * format="@name @pinlist @model L=@L W=@W nf=@nf
* + ad=@ad as=@as pd=@pd .... m=@m * + ad=@ad as=@as pd=@pd .... m=@m
* template="name=M1 W=1 L=0.15 m=1 * template="name=M1 W=1 L=0.15 m=1
* ad=\"expr('int((@nf + 1)/2) * @W / @nf * 0.29')\" * ad=\"expr('int((@nf + 1)/2) * @W / @nf * 0.29')\"
* ..." * ..."
* model=nfet_01v8 * model=nfet_01v8
*/ */
my_strdup2(_ALLOC_ID_, &val, my_strdup2(_ALLOC_ID_, &val,
translate3(token, 0, xctx->inst[inst].prop_ptr, NULL, NULL, NULL)); translate3(token, 0, xctx->inst[inst].prop_ptr, NULL, NULL, NULL));
/* can not put template in above translate3: ---------------------------^^^^ /* can not put template in above translate3: ---------------------------^^^^
* if instance has VHI=VHI, format string has VHI=@VHI, and symbol template has VHI=3 * if instance has VHI=VHI, format string has VHI=@VHI, and symbol template has VHI=3
@ -3073,7 +3073,7 @@ int print_spectre_element(FILE *fd, int inst)
if (!(strcmp(token+1,"name") && strcmp(token+1,"lab")) /* expand name/labels */ if (!(strcmp(token+1,"name") && strcmp(token+1,"lab")) /* expand name/labels */
&& ((lab = expandlabel(value, &itmp)) != NULL)) { && ((lab = expandlabel(value, &itmp)) != NULL)) {
my_mstrcat(_ALLOC_ID_, &result, lab, NULL); my_mstrcat(_ALLOC_ID_, &result, lab, NULL);
} else { } else {
my_mstrcat(_ALLOC_ID_, &result, value, NULL); my_mstrcat(_ALLOC_ID_, &result, value, NULL);
} }
} }
@ -3145,7 +3145,7 @@ void print_tedax_element(FILE *fd, int inst)
const char *tmp; const char *tmp;
int instance_based=0; int instance_based=0;
size_t sizetok=0; size_t sizetok=0;
size_t token_pos=0; size_t token_pos=0;
int escape=0; int escape=0;
int no_of_pins=0; int no_of_pins=0;
int subcircuit = 0; int subcircuit = 0;
@ -3186,7 +3186,7 @@ void print_tedax_element(FILE *fd, int inst)
int_hash_init(&table, 37); int_hash_init(&table, 37);
for(i=0;i<no_of_pins; ++i) { for(i=0;i<no_of_pins; ++i) {
my_strdup2(_ALLOC_ID_, &net, net_name(inst,i, &net_mult, 0, 1)); my_strdup2(_ALLOC_ID_, &net, net_name(inst,i, &net_mult, 0, 1));
my_strdup2(_ALLOC_ID_, &pinname, my_strdup2(_ALLOC_ID_, &pinname,
get_tok_value(xctx->sym[xctx->inst[inst].ptr].rect[PINLAYER][i].prop_ptr,"name",0)); get_tok_value(xctx->sym[xctx->inst[inst].ptr].rect[PINLAYER][i].prop_ptr,"name",0));
my_strdup2(_ALLOC_ID_, &pin, expandlabel(pinname, &pin_mult)); my_strdup2(_ALLOC_ID_, &pin, expandlabel(pinname, &pin_mult));
if(!int_hash_lookup(&table, pinname, 1, XINSERT_NOREPLACE)) { if(!int_hash_lookup(&table, pinname, 1, XINSERT_NOREPLACE)) {
@ -3194,8 +3194,8 @@ void print_tedax_element(FILE *fd, int inst)
for(n = 0; n < net_mult; ++n) { for(n = 0; n < net_mult; ++n) {
my_strdup(_ALLOC_ID_, &netbit, find_nth(net, ",", "", 0, n+1)); my_strdup(_ALLOC_ID_, &netbit, find_nth(net, ",", "", 0, n+1));
my_strdup(_ALLOC_ID_, &pinbit, find_nth(pin, ",", "", 0, n+1)); my_strdup(_ALLOC_ID_, &pinbit, find_nth(pin, ",", "", 0, n+1));
fprintf(fd, "__map__ %s -> %s\n", fprintf(fd, "__map__ %s -> %s\n",
pinbit ? pinbit : "__UNCONNECTED_PIN__", pinbit ? pinbit : "__UNCONNECTED_PIN__",
netbit ? netbit : "__UNCONNECTED_PIN__"); netbit ? netbit : "__UNCONNECTED_PIN__");
} }
} }
@ -3240,7 +3240,7 @@ void print_tedax_element(FILE *fd, int inst)
} }
my_free(_ALLOC_ID_, &pinnumber); my_free(_ALLOC_ID_, &pinnumber);
} }
if(extra){ if(extra){
char netstring[40]; char netstring[40];
/* fprintf(errfp, "extra_pinnumber: |%s|\n", extra_pinnumber); */ /* fprintf(errfp, "extra_pinnumber: |%s|\n", extra_pinnumber); */
@ -3252,7 +3252,7 @@ void print_tedax_element(FILE *fd, int inst)
/* fprintf(errfp, "extra_pinnumber_token: |%s|\n", extra_pinnumber_token); */ /* fprintf(errfp, "extra_pinnumber_token: |%s|\n", extra_pinnumber_token); */
/* fprintf(errfp, "extra_token: |%s|\n", extra_token); */ /* fprintf(errfp, "extra_token: |%s|\n", extra_token); */
instance_based=0; instance_based=0;
/* alternate instance based extra net naming: net:<pinumber>=netname */ /* alternate instance based extra net naming: net:<pinumber>=netname */
my_snprintf(netstring, S(netstring), "net:%s", extra_pinnumber_token); my_snprintf(netstring, S(netstring), "net:%s", extra_pinnumber_token);
dbg(1, "print_tedax_element(): netstring=%s\n", netstring); dbg(1, "print_tedax_element(): netstring=%s\n", netstring);
@ -3261,7 +3261,7 @@ void print_tedax_element(FILE *fd, int inst)
if(!extra_token_val[0]) extra_token_val=get_tok_value(template, extra_token, 0); if(!extra_token_val[0]) extra_token_val=get_tok_value(template, extra_token, 0);
else instance_based=1; else instance_based=1;
if(!extra_token_val[0]) extra_token_val="--UNDEF--"; if(!extra_token_val[0]) extra_token_val="--UNDEF--";
fprintf(fd, "conn %s %s %s %s %d", name, extra_token_val, extra_token, extra_pinnumber_token, i+1); fprintf(fd, "conn %s %s %s %s %d", name, extra_token_val, extra_token, extra_pinnumber_token, i+1);
++i; ++i;
if(instance_based) fprintf(fd, " # instance_based"); if(instance_based) fprintf(fd, " # instance_based");
@ -3323,7 +3323,7 @@ void print_tedax_element(FILE *fd, int inst)
const char *s = sanitize(translate(inst, get_sym_name(inst, 0, 0, 0))); const char *s = sanitize(translate(inst, get_sym_name(inst, 0, 0, 0)));
fputs(s, fd); fputs(s, fd);
} }
else if (strcmp(token,"@symname_ext")==0) else if (strcmp(token,"@symname_ext")==0)
{ {
const char *s = sanitize(translate(inst, get_sym_name(inst, 0, 1, 0))); const char *s = sanitize(translate(inst, get_sym_name(inst, 0, 1, 0)));
fputs(s, fd); fputs(s, fd);
@ -3381,7 +3381,7 @@ void print_tedax_element(FILE *fd, int inst)
int n; int n;
char *pin_attr = NULL; char *pin_attr = NULL;
char *pin_num_or_name = NULL; char *pin_num_or_name = NULL;
get_pin_and_attr(token, &pin_num_or_name, &pin_attr); get_pin_and_attr(token, &pin_num_or_name, &pin_attr);
n = get_inst_pin_number(inst, pin_num_or_name); n = get_inst_pin_number(inst, pin_num_or_name);
if(n>=0 && pin_attr[0] && n < (xctx->inst[inst].ptr + xctx->sym)->rects[PINLAYER]) { if(n>=0 && pin_attr[0] && n < (xctx->inst[inst].ptr + xctx->sym)->rects[PINLAYER]) {
@ -3534,10 +3534,10 @@ static void print_verilog_primitive(FILE *fd, int inst) /* netlist switch level
if( state==TOK_BEGIN && (c=='@' || c=='%') && !escape ) state=TOK_TOKEN; if( state==TOK_BEGIN && (c=='@' || c=='%') && !escape ) state=TOK_TOKEN;
else if(state==TOK_TOKEN && token_pos > 1 && else if(state==TOK_TOKEN && token_pos > 1 &&
( (
( (space || c == '%' || c == '@') && !escape ) || ( (space || c == '%' || c == '@') && !escape ) ||
( (!space && c != '%' && c != '@') && escape ) ( (!space && c != '%' && c != '@') && escape )
) )
) { ) {
state=TOK_SEP; state=TOK_SEP;
} }
@ -3585,7 +3585,7 @@ static void print_verilog_primitive(FILE *fd, int inst) /* netlist switch level
const char *s = sanitize(translate(inst, get_sym_name(inst, 0, 0, 0))); const char *s = sanitize(translate(inst, get_sym_name(inst, 0, 0, 0)));
my_mstrcat(_ALLOC_ID_, &result, s, NULL); my_mstrcat(_ALLOC_ID_, &result, s, NULL);
} }
else if (strcmp(token,"@symname_ext")==0) else if (strcmp(token,"@symname_ext")==0)
{ {
const char *s = sanitize(translate(inst, get_sym_name(inst, 0, 1, 0))); const char *s = sanitize(translate(inst, get_sym_name(inst, 0, 1, 0)));
my_mstrcat(_ALLOC_ID_, &result, s, NULL); my_mstrcat(_ALLOC_ID_, &result, s, NULL);
@ -3636,13 +3636,13 @@ static void print_verilog_primitive(FILE *fd, int inst) /* netlist switch level
} }
} }
/* reference by pin number instead of pin name, allows faster lookup of the attached net name /* reference by pin number instead of pin name, allows faster lookup of the attached net name
* @#0, @#1:net_name, @#2:name, ... */ * @#0, @#1:net_name, @#2:name, ... */
else if(token[0]=='@' && token[1]=='#') { else if(token[0]=='@' && token[1]=='#') {
int n; int n;
char *pin_attr = NULL; char *pin_attr = NULL;
char *pin_num_or_name = NULL; char *pin_num_or_name = NULL;
get_pin_and_attr(token, &pin_num_or_name, &pin_attr); get_pin_and_attr(token, &pin_num_or_name, &pin_attr);
n = get_inst_pin_number(inst, pin_num_or_name); n = get_inst_pin_number(inst, pin_num_or_name);
if(n>=0 && pin_attr[0] && n < (xctx->inst[inst].ptr + xctx->sym)->rects[PINLAYER]) { if(n>=0 && pin_attr[0] && n < (xctx->inst[inst].ptr + xctx->sym)->rects[PINLAYER]) {
@ -3727,16 +3727,16 @@ static void print_verilog_primitive(FILE *fd, int inst) /* netlist switch level
if(c=='\0') if(c=='\0')
{ {
char *parent_prop_ptr = NULL; char *parent_prop_ptr = NULL;
if(xctx->currsch > 0) { if(xctx->currsch > 0) {
parent_prop_ptr = xctx->hier_attr[xctx->currsch - 1].prop_ptr; parent_prop_ptr = xctx->hier_attr[xctx->currsch - 1].prop_ptr;
} }
/* if result is like: 'tcleval(some_string)' pass it thru tcl evaluation so expressions /* if result is like: 'tcleval(some_string)' pass it thru tcl evaluation so expressions
* can be calculated. Before that do also a round of translation to remove remaining @params */ * can be calculated. Before that do also a round of translation to remove remaining @params */
if(result) { if(result) {
dbg(1, "print_verilog_primitive(): before translate3() result=%s\n", result); dbg(1, "print_verilog_primitive(): before translate3() result=%s\n", result);
if(strchr(result, '@')) { if(strchr(result, '@')) {
/* netlist_commands often have @ characters due to ngspice syntax. Do not translate */ /* netlist_commands often have @ characters due to ngspice syntax. Do not translate */
if(strcmp(xctx->sym[xctx->inst[inst].ptr].type, "netlist_commands")) { if(strcmp(xctx->sym[xctx->inst[inst].ptr].type, "netlist_commands")) {
my_strdup2(_ALLOC_ID_, &result, my_strdup2(_ALLOC_ID_, &result,
@ -3831,7 +3831,7 @@ void print_verilog_element(FILE *fd, int inst)
my_strdup(_ALLOC_ID_, &v_extra, get_tok_value(xctx->sym[xctx->inst[inst].ptr].prop_ptr, "verilog_extra", 0)); my_strdup(_ALLOC_ID_, &v_extra, get_tok_value(xctx->sym[xctx->inst[inst].ptr].prop_ptr, "verilog_extra", 0));
/* extra is the list of attributes NOT to consider as instance parameters */ /* extra is the list of attributes NOT to consider as instance parameters */
my_strdup(_ALLOC_ID_, &extra, get_tok_value(xctx->sym[xctx->inst[inst].ptr].prop_ptr, "extra", 0)); my_strdup(_ALLOC_ID_, &extra, get_tok_value(xctx->sym[xctx->inst[inst].ptr].prop_ptr, "extra", 0));
my_strdup(_ALLOC_ID_, &verilogprefix, my_strdup(_ALLOC_ID_, &verilogprefix,
get_tok_value(xctx->sym[xctx->inst[inst].ptr].prop_ptr, "verilogprefix", 0)); get_tok_value(xctx->sym[xctx->inst[inst].ptr].prop_ptr, "verilogprefix", 0));
if(verilogprefix) { if(verilogprefix) {
my_strdup(_ALLOC_ID_, &symname, verilogprefix); my_strdup(_ALLOC_ID_, &symname, verilogprefix);
@ -3984,8 +3984,8 @@ const char *net_name(int i, int j, int *multip, int hash_prefix_unnamed_net, int
char *pinname = NULL; char *pinname = NULL;
/* if merging a ngspice_probe.sym element it contains a @@p token, /* if merging a ngspice_probe.sym element it contains a @@p token,
* so translate calls net_name, but we are placing the merged objects, * so translate calls net_name, but we are placing the merged objects,
* no net name is assigned yet */ * no net name is assigned yet */
if(!xctx->inst[i].node) { if(!xctx->inst[i].node) {
return expandlabel("", multip); return expandlabel("", multip);
@ -4019,7 +4019,7 @@ const char *net_name(int i, int j, int *multip, int hash_prefix_unnamed_net, int
xctx->hilight_nets=1; xctx->hilight_nets=1;
} }
} }
if(*multip <= 1) if(*multip <= 1)
my_snprintf(unconn, S(unconn), "__UNCONNECTED_PIN__%d", xctx->netlist_unconn_cnt++); my_snprintf(unconn, S(unconn), "__UNCONNECTED_PIN__%d", xctx->netlist_unconn_cnt++);
else else
my_snprintf(unconn, S(unconn), "__UNCONNECTED_PIN__%d_[%d..0]", xctx->netlist_unconn_cnt++, *multip - 1); my_snprintf(unconn, S(unconn), "__UNCONNECTED_PIN__%d_[%d..0]", xctx->netlist_unconn_cnt++, *multip - 1);
@ -4116,7 +4116,7 @@ char *trim_chars(const char *str, const char *sep)
} }
/* find nth field in str separated by sep. 1st field is position 1 /* find nth field in str separated by sep. 1st field is position 1
* separators inside quotes are not considered as field separators * separators inside quotes are not considered as field separators
* if keep_quote == 1 keep quoting characters and backslashes in returned field * if keep_quote == 1 keep quoting characters and backslashes in returned field
* if keep_quote == 4 same as above but remove surrounding "..." * if keep_quote == 4 same as above but remove surrounding "..."
* find_nth("aaa,bbb,ccc,ddd", ",", 0, 2) --> bbb * find_nth("aaa,bbb,ccc,ddd", ",", 0, 2) --> bbb
@ -4293,7 +4293,7 @@ static char *get_pin_attr(const char *token, int inst, int engineering)
size_t tmp; size_t tmp;
prepare_netlist_structs(0); prepare_netlist_structs(0);
str_ptr = net_name(inst,n, &multip, 0, 1); str_ptr = net_name(inst,n, &multip, 0, 1);
tmp = strlen(str_ptr) +100 ; /* always make room for some extra chars tmp = strlen(str_ptr) +100 ; /* always make room for some extra chars
* so 1-char writes to result do not need reallocs */ * so 1-char writes to result do not need reallocs */
value = my_malloc(_ALLOC_ID_, tmp); value = my_malloc(_ALLOC_ID_, tmp);
@ -4305,16 +4305,16 @@ static char *get_pin_attr(const char *token, int inst, int engineering)
return value; return value;
} }
/* This routine processes the entire string returned by translate, looks /* This routine processes the entire string returned by translate, looks
* for "@spice_get_node <spice_node> " patterns and replaces with the * for "@spice_get_node <spice_node> " patterns and replaces with the
* Spice simulated value for that node. * Spice simulated value for that node.
* the format is "some_text@spice_get_node <spice_node> some_additional_text" * the format is "some_text@spice_get_node <spice_node> some_additional_text"
* Examples: * Examples:
* Id=@spice_get_node i(\@m.@path@spiceprefix@name\.msky130_fd_pr__@model\[id]) * Id=@spice_get_node i(\@m.@path@spiceprefix@name\.msky130_fd_pr__@model\[id])
* will translate to: * will translate to:
* Id=6.6177u * Id=6.6177u
* Id=@spice_get_node i(\@m.@path@spiceprefix@name\.msky130_fd_pr__@model\[id]) A * Id=@spice_get_node i(\@m.@path@spiceprefix@name\.msky130_fd_pr__@model\[id]) A
* will translate to: * will translate to:
* Id=6.6177uA * Id=6.6177uA
* note the required separator spaces around the spice node. Spaces are used here as * note the required separator spaces around the spice node. Spaces are used here as
* separators since spice nodes don't allow spaces. * separators since spice nodes don't allow spaces.
@ -4381,7 +4381,7 @@ const char *spice_get_node(const char *token)
/* caller must free returned value /* caller must free returned value
* get the full pathname of "instname" device * get the full pathname of "instname" device
* modelparam: * modelparam:
* 0: current, 1: modelparam, 2: modelvoltage * 0: current, 1: modelparam, 2: modelvoltage
* param: device parameter, like "ib", "gm", "vth" * param: device parameter, like "ib", "gm", "vth"
* set param to {} (empty str) for just branch current of 2 terminal device * set param to {} (empty str) for just branch current of 2 terminal device
@ -4449,7 +4449,7 @@ char *get_fqdevice(const char *param, int modelparam, const char *instname)
dbg(1, "fqdev=%s\n", fqdev); dbg(1, "fqdev=%s\n", fqdev);
strtolower(fqdev); strtolower(fqdev);
idx = get_raw_index(fqdev, NULL); idx = get_raw_index(fqdev, NULL);
/* special handling for resistors that are converted to b sources: /* special handling for resistors that are converted to b sources:
* i(@r.x4.r1[i]) --> i(@b.x4.br1[i]) * i(@r.x4.r1[i]) --> i(@b.x4.br1[i])
*/ */
if(idx < 0 && !strncmp(fqdev, "i(@r", 4)) { if(idx < 0 && !strncmp(fqdev, "i(@r", 4)) {
@ -4476,7 +4476,7 @@ char *get_fqdevice(const char *param, int modelparam, const char *instname)
const char *translate(int inst, const char* s) const char *translate(int inst, const char* s)
{ {
#ifdef __unix__ #ifdef __unix__
static regex_t *get_sp_cur = NULL; static regex_t *get_sp_cur = NULL;
#endif #endif
static const char *empty=""; static const char *empty="";
static char *result=NULL; /* safe to keep even with multiple schematics */ static char *result=NULL; /* safe to keep even with multiple schematics */
@ -4499,7 +4499,7 @@ const char *translate(int inst, const char* s)
char *value1 = NULL; char *value1 = NULL;
int sim_is_ngspice, sim_is_vacask /*, sim_is_xyce */; int sim_is_ngspice, sim_is_vacask /*, sim_is_xyce */;
char *instname = NULL; char *instname = NULL;
if(!s && inst == -1) { if(!s && inst == -1) {
if(result) my_free(_ALLOC_ID_, &result); if(result) my_free(_ALLOC_ID_, &result);
#ifdef __unix__ #ifdef __unix__
@ -4510,11 +4510,11 @@ const char *translate(int inst, const char* s)
} }
#endif #endif
} }
if(!s || !xctx || !xctx->inst) { if(!s || !xctx || !xctx->inst) {
return empty; return empty;
} }
#ifdef __unix__ #ifdef __unix__
if(!get_sp_cur) { if(!get_sp_cur) {
get_sp_cur = my_malloc(_ALLOC_ID_, sizeof(regex_t)); get_sp_cur = my_malloc(_ALLOC_ID_, sizeof(regex_t));
@ -4525,9 +4525,9 @@ const char *translate(int inst, const char* s)
"^@spice_get_(current|modelparam|modelvoltage)(_[a-zA-Z][a-zA-Z0-9_]*)*\\(", REG_NOSUB | REG_EXTENDED); "^@spice_get_(current|modelparam|modelvoltage)(_[a-zA-Z][a-zA-Z0-9_]*)*\\(", REG_NOSUB | REG_EXTENDED);
} }
#endif #endif
sp_prefix = tclgetboolvar("spiceprefix"); sp_prefix = tclgetboolvar("spiceprefix");
if(inst >= xctx->instances) { if(inst >= xctx->instances) {
dbg(0, "translate(): instance number out of bounds: %d\n", inst); dbg(0, "translate(): instance number out of bounds: %d\n", inst);
return empty; return empty;
@ -4543,9 +4543,9 @@ const char *translate(int inst, const char* s)
size=CADCHUNKALLOC; size=CADCHUNKALLOC;
my_realloc(_ALLOC_ID_, &result,size); my_realloc(_ALLOC_ID_, &result,size);
result[0]='\0'; result[0]='\0';
dbg(1, "translate(): substituting props in <%s>, instance <%s>\n", s ? s : "<NULL>" , instname); dbg(1, "translate(): substituting props in <%s>, instance <%s>\n", s ? s : "<NULL>" , instname);
while(1) while(1)
{ {
c=*s++; c=*s++;
@ -4560,9 +4560,9 @@ const char *translate(int inst, const char* s)
( (
( (space || c == '%' || c == '@') && !escape ) || ( (space || c == '%' || c == '@') && !escape ) ||
( (!space && c != '%' && c != '@') && escape ) ( (!space && c != '%' && c != '@') && escape )
) )
) state=TOK_SEP; ) state=TOK_SEP;
STR_ALLOC(&result, result_pos, &size); STR_ALLOC(&result, result_pos, &size);
STR_ALLOC(&token, token_pos, &sizetok); STR_ALLOC(&token, token_pos, &sizetok);
if(state==TOK_TOKEN) token[token_pos++]=(char)c; if(state==TOK_TOKEN) token[token_pos++]=(char)c;
@ -4592,13 +4592,13 @@ const char *translate(int inst, const char* s)
const char *path = xctx->sch_path[xctx->currsch] + 1; const char *path = xctx->sch_path[xctx->currsch] + 1;
int start_level = sch_waves_loaded(), skip = 0; int start_level = sch_waves_loaded(), skip = 0;
if(start_level == -1) start_level = 0; if(start_level == -1) start_level = 0;
/* skip path components that are above the level where raw file was loaded */ /* skip path components that are above the level where raw file was loaded */
while(*path && skip < start_level) { while(*path && skip < start_level) {
if(*path == '.') skip++; if(*path == '.') skip++;
++path; ++path;
} }
tmp=strlen(path); tmp=strlen(path);
STR_ALLOC(&result, tmp + result_pos, &size); STR_ALLOC(&result, tmp + result_pos, &size);
memcpy(result+result_pos, path, tmp+1); memcpy(result+result_pos, path, tmp+1);
@ -4637,7 +4637,7 @@ const char *translate(int inst, const char* s)
my_free(_ALLOC_ID_, &value); my_free(_ALLOC_ID_, &value);
} }
} else if(inst >= 0 && strcmp(token,"@sch_last_modified")==0 && xctx->inst[inst].ptr >= 0) { } else if(inst >= 0 && strcmp(token,"@sch_last_modified")==0 && xctx->inst[inst].ptr >= 0) {
get_sch_from_sym(file_name, xctx->inst[inst].ptr + xctx->sym, inst, 0); get_sch_from_sym(file_name, xctx->inst[inst].ptr + xctx->sym, inst, 0);
if(!stat(file_name , &time_buf)) { if(!stat(file_name , &time_buf)) {
tm=localtime(&(time_buf.st_mtime) ); tm=localtime(&(time_buf.st_mtime) );
@ -4749,19 +4749,19 @@ const char *translate(int inst, const char* s)
} }
} }
if(net) my_free(_ALLOC_ID_, &net); if(net) my_free(_ALLOC_ID_, &net);
} }
} }
} }
} }
/* copy as is: processed by spice_get_node() later /* copy as is: processed by spice_get_node() later
* the format is "some_text@spice_get_node <spice_node> some_additional_text" * the format is "some_text@spice_get_node <spice_node> some_additional_text"
* Examples: * Examples:
* Id=@spice_get_node i(\@m.@path@spiceprefix@name\.msky130_fd_pr__@model\[id]) * Id=@spice_get_node i(\@m.@path@spiceprefix@name\.msky130_fd_pr__@model\[id])
* will translate to: * will translate to:
* Id=6.6177u * Id=6.6177u
* Id=@spice_get_node i(\@m.@path@spiceprefix@name\.msky130_fd_pr__@model\[id]) A * Id=@spice_get_node i(\@m.@path@spiceprefix@name\.msky130_fd_pr__@model\[id]) A
* will translate to: * will translate to:
* Id=6.6177uA * Id=6.6177uA
* note the required separator spaces around the spice node. Spaces are used here as * note the required separator spaces around the spice node. Spaces are used here as
* separators since spice nodes don't allow spaces. * separators since spice nodes don't allow spaces.
@ -4807,12 +4807,12 @@ const char *translate(int inst, const char* s)
len = strlen(path) + strlen(instname) + strlen(net) + 2; len = strlen(path) + strlen(instname) + strlen(net) + 2;
dbg(1, "net=%s\n", net); dbg(1, "net=%s\n", net);
fqnet = my_malloc(_ALLOC_ID_, len); fqnet = my_malloc(_ALLOC_ID_, len);
global_net = strrchr(net, '.'); global_net = strrchr(net, '.');
if(global_net == NULL) global_net = net; if(global_net == NULL) global_net = net;
else global_net++; else global_net++;
if(inst < 0 || record_global_node(3, NULL, global_net)) { if(inst < 0 || record_global_node(3, NULL, global_net)) {
strtolower(net); strtolower(net);
my_snprintf(fqnet, len, "%s", global_net); my_snprintf(fqnet, len, "%s", global_net);
@ -4855,7 +4855,7 @@ const char *translate(int inst, const char* s)
/* @spice_get_current(...) or @spice_get_current_<param>(...) /* @spice_get_current(...) or @spice_get_current_<param>(...)
* @spice_get_modelparam(...) or @spice_get_modelparam_<param>(...) * @spice_get_modelparam(...) or @spice_get_modelparam_<param>(...)
* @spice_get_modelvoltage(...) or @spice_get_modelvoltage_<param>(...) * @spice_get_modelvoltage(...) or @spice_get_modelvoltage_<param>(...)
* *
* Only @spice_get_current(...) and @spice_get_current_<param>(...) are processed * Only @spice_get_current(...) and @spice_get_current_<param>(...) are processed
* the other types are ignored */ * the other types are ignored */
#ifdef __unix__ #ifdef __unix__
@ -5048,7 +5048,7 @@ const char *translate(int inst, const char* s)
/* token contans _param after @spice_get_current or @spice_get_modelparam /* token contans _param after @spice_get_current or @spice_get_modelparam
* or @spice_get_modelvoltage */ * or @spice_get_modelvoltage */
if(strcmp(token, "@spice_get_current") && if(strcmp(token, "@spice_get_current") &&
strcmp(token, "@spice_get_modelparam") && strcmp(token, "@spice_get_modelparam") &&
strcmp(token, "@spice_get_modelvoltage")) { strcmp(token, "@spice_get_modelvoltage")) {
int n = 0; int n = 0;
param = my_malloc(_ALLOC_ID_, strlen(token) + 1); param = my_malloc(_ALLOC_ID_, strlen(token) + 1);
@ -5117,7 +5117,7 @@ const char *translate(int inst, const char* s)
if(idx >= 0) { if(idx >= 0) {
val = xctx->raw->cursor_b_val[idx]; val = xctx->raw->cursor_b_val[idx];
} }
/* special handling for resistors that are converted to b sources: /* special handling for resistors that are converted to b sources:
* i(@r.x4.r1[i]) --> i(@b.x4.br1[i]) * i(@r.x4.r1[i]) --> i(@b.x4.br1[i])
*/ */
if(idx < 0 && !strncmp(fqdev, "i(@r", 4)) { if(idx < 0 && !strncmp(fqdev, "i(@r", 4)) {
@ -5161,7 +5161,7 @@ const char *translate(int inst, const char* s)
} }
else if(strcmp(token,"@schspectreprop")==0 && xctx->schspectreprop) else if(strcmp(token,"@schspectreprop")==0 && xctx->schspectreprop)
{ {
tmp=strlen(xctx->schspectreprop); tmp=strlen(xctx->schspectreprop);
STR_ALLOC(&result, tmp + result_pos, &size); STR_ALLOC(&result, tmp + result_pos, &size);
memcpy(result+result_pos,xctx->schspectreprop, tmp+1); memcpy(result+result_pos,xctx->schspectreprop, tmp+1);
@ -5176,7 +5176,7 @@ const char *translate(int inst, const char* s)
result_pos+=tmp; result_pos+=tmp;
} }
/* /20100217 */ /* /20100217 */
else if(strcmp(token,"@schsymbolprop")==0 && xctx->schsymbolprop) else if(strcmp(token,"@schsymbolprop")==0 && xctx->schsymbolprop)
{ {
tmp=strlen(xctx->schsymbolprop); tmp=strlen(xctx->schsymbolprop);
@ -5193,7 +5193,7 @@ const char *translate(int inst, const char* s)
result_pos+=tmp; result_pos+=tmp;
} }
/* /20100217 */ /* /20100217 */
else if(strcmp(token,"@schverilogprop")==0 && xctx->schverilogprop) else if(strcmp(token,"@schverilogprop")==0 && xctx->schverilogprop)
{ {
tmp=strlen(xctx->schverilogprop); tmp=strlen(xctx->schverilogprop);
@ -5262,7 +5262,7 @@ const char *translate(int inst, const char* s)
dbg(1, "2 translate(): lcc[%d].prop_ptr=%s, value1=%s\n", i-1, lcc[i-1].prop_ptr, value1); dbg(1, "2 translate(): lcc[%d].prop_ptr=%s, value1=%s\n", i-1, lcc[i-1].prop_ptr, value1);
} else break; } else break;
i--; i--;
} }
tmp=strlen(value1); tmp=strlen(value1);
STR_ALLOC(&result, tmp + result_pos, &size); STR_ALLOC(&result, tmp + result_pos, &size);
@ -5285,11 +5285,11 @@ const char *translate(int inst, const char* s)
} /* while(1) */ } /* while(1) */
dbg(2, "translate(): returning %s\n", result); dbg(2, "translate(): returning %s\n", result);
my_free(_ALLOC_ID_, &token); my_free(_ALLOC_ID_, &token);
/* resolve spice_get_node patterns. /* resolve spice_get_node patterns.
* if result is like: 'tcleval(some_string)' pass it thru tcl evaluation so expressions * if result is like: 'tcleval(some_string)' pass it thru tcl evaluation so expressions
* can be calculated */ * can be calculated */
my_strdup2(_ALLOC_ID_, &result, spice_get_node(tcl_hook2(result))); my_strdup2(_ALLOC_ID_, &result, spice_get_node(tcl_hook2(result)));
if(is_expr(result) && inst >= 0) { if(is_expr(result) && inst >= 0) {
dbg(1, "translate(): expr():%s\n", result); dbg(1, "translate(): expr():%s\n", result);
my_strdup2(_ALLOC_ID_, &result, eval_expr( my_strdup2(_ALLOC_ID_, &result, eval_expr(
@ -5439,8 +5439,8 @@ const char *translate2(Lcc *lcc, int level, char* s)
* ex.: name=@name w=@w l=@l ---> name=m112 w=3e-6 l=0.8e-6 * ex.: name=@name w=@w l=@l ---> name=m112 w=3e-6 l=0.8e-6
* using s1, s2, s3 in turn to resolve @tokens * using s1, s2, s3 in turn to resolve @tokens
* if no definition for @token is found return @token as is in s * if no definition for @token is found return @token as is in s
* if s==NULL return emty string * if s==NULL return emty string
* eat_escapes: * eat_escapes:
* bit0 == 0 --> keep escapes * bit0 == 0 --> keep escapes
* == 1 --> remove escapes * == 1 --> remove escapes
* bit1 == 0 --> return unchanged token if no value found in s* strings * bit1 == 0 --> return unchanged token if no value found in s* strings
@ -5457,7 +5457,7 @@ const char *translate3(const char *s, int eat_escapes, const char *s1,
size_t sizetok=0; size_t sizetok=0;
size_t token_pos=0; size_t token_pos=0;
const char *value; const char *value;
int i, escape=0; int i, escape=0;
size_t found_value = 0; size_t found_value = 0;
const char *escape_pos = NULL; const char *escape_pos = NULL;
const char *sptr[5]; /* 1...4 used */ const char *sptr[5]; /* 1...4 used */
@ -5484,7 +5484,7 @@ const char *translate3(const char *s, int eat_escapes, const char *s1,
( (
( (space || c == '%' || c == '@') && !escape ) || ( (space || c == '%' || c == '@') && !escape ) ||
( (!space && c != '%' && c != '@') && escape ) ( (!space && c != '%' && c != '@') && escape )
) )
) state=TOK_SEP; ) state=TOK_SEP;
if( s > escape_pos ) escape = 0; if( s > escape_pos ) escape = 0;
s++; s++;

View File

@ -1,14 +1,14 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
# memory leak analyzer. Run xschem with options "-d 3 -l log", do some operations you want to check # memory leak analyzer. Run xschem with options "-d 3 -l log", do some operations you want to check
# then *from this directory* launch: # then *from this directory* launch:
# ./track_memory.awk /path/to/log [nosource] # ./track_memory.awk /path/to/log [nosource]
# it will print the amount of leaked memory (total, leak) # it will print the amount of leaked memory (total, leak)
# and the allocation that was not freed, with the source code line (if 'nosource' not given) # and the allocation that was not freed, with the source code line (if 'nosource' not given)
# total and leak should indicate same amount of bytes, it is a cross check for the script. # total and leak should indicate same amount of bytes, it is a cross check for the script.
BEGIN{ BEGIN{
show_source = 1 show_source = 1
max = 0 max = 0
total = 0 total = 0
malloc = 0 malloc = 0
free = 0 free = 0
realloc = 0 realloc = 0
@ -21,7 +21,7 @@ BEGIN{
} }
# my_malloc(234,): allocating 1a01ff0 , 10 bytes # my_malloc(234,): allocating 1a01ff0 , 10 bytes
/^my_[mc]alloc\(/{ /^my_[mc]alloc\(/{
id = $1 id = $1
sub(/.*\(/,"", id) sub(/.*\(/,"", id)
sub(/,.*/,"",id) sub(/,.*/,"",id)
@ -33,7 +33,7 @@ BEGIN{
} }
# my_free(977,): freeing 198efc0 # my_free(977,): freeing 198efc0
/^my_free\(/{ /^my_free\(/{
if(!($3 in address)) { if(!($3 in address)) {
print "Double free: " $0 " Log file line: " NR print "Double free: " $0 " Log file line: " NR
} else { } else {

View File

@ -38,7 +38,7 @@ function replace_pattern(old, new)
{ {
__a[__lines++] = $0 __a[__lines++] = $0
} }
function beginfile(f) function beginfile(f)
@ -57,5 +57,5 @@ function endfile(f, i)
} }
close(f) close(f)
} }
} }

View File

@ -1,27 +1,27 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
# File: clock.awk # File: clock.awk
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2023 Stefan Frederik Schippers # Copyright (C) 1998-2023 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
# #
# plugin for clock expansion # plugin for clock expansion
# #
# clock <signal> <pulse> <period> [invert] [high value] [low value] # clock <signal> <pulse> <period> [invert] [high value] [low value]
@ -30,7 +30,7 @@
#___________________| |____________| |__________ #___________________| |____________| |__________
# | | | # | | |
# |<pulse>| | # |<pulse>| |
# |<----- period ----->| # |<----- period ----->|
# | # |
# clock_start # clock_start
# Stefan, 04122001 # Stefan, 04122001
@ -41,7 +41,7 @@ BEGIN {
OFMT="%.14g" # better precision OFMT="%.14g" # better precision
CONVFMT="%.14g" CONVFMT="%.14g"
old_event=-1 old_event=-1
} }
## stefan fix 20100630: reset absolute time if multiple beginfile--endfile given ## stefan fix 20100630: reset absolute time if multiple beginfile--endfile given
/^[ \t]*beginfile[ \t]+/{ /^[ \t]*beginfile[ \t]+/{
@ -49,7 +49,7 @@ BEGIN {
} }
/^[ \t]*clock[ \t]+/{ /^[ \t]*clock[ \t]+/{
sub(/[ \t]*;.*/,"") sub(/[ \t]*;.*/,"")
clock_name = $2 clock_name = $2
clock_start[clock_name]=time clock_start[clock_name]=time
@ -67,7 +67,7 @@ BEGIN {
if($6!="") clock_low[clock_name]=$6 if($6!="") clock_low[clock_name]=$6
else clock_low[clock_name]=0 else clock_low[clock_name]=0
} }
print "set " clock_name " " value(clock_name, clock_state[clock_name]) print "set " clock_name " " value(clock_name, clock_state[clock_name])
next next
} }
@ -128,7 +128,7 @@ function next_event( k, i, clock_event1, clock_event2)
{ {
k=0 k=0
for(i in clock_start) for(i in clock_start)
{ {
clock_event1 = int( (time-clock_start[i])/clock_period[i])*clock_period[i] + clock_start[i] clock_event1 = int( (time-clock_start[i])/clock_period[i])*clock_period[i] + clock_start[i]
while(clock_event1 <= time) { while(clock_event1 <= time) {
clock_event1+=clock_period[i] clock_event1+=clock_period[i]
@ -137,14 +137,14 @@ function next_event( k, i, clock_event1, clock_event2)
while(clock_event2 <= time) { while(clock_event2 <= time) {
clock_event2+=clock_period[i] clock_event2+=clock_period[i]
} }
if(clock_event1 < clock_event2) if(clock_event1 < clock_event2)
clock_event = clock_event1+0 clock_event = clock_event1+0
else else
clock_event = clock_event2+0 clock_event = clock_event2+0
if(!k) { event=clock_event ; current_clock=i; k=1} if(!k) { event=clock_event ; current_clock=i; k=1}
else if(clock_event < event) else if(clock_event < event)
{ {
event = clock_event event = clock_event
current_clock=i current_clock=i
} }
else if( abs(clock_event - event)<1e-12 ) else if( abs(clock_event - event)<1e-12 )
@ -163,7 +163,7 @@ function value(clock_name, i) {
else return clock_low[clock_name] else return clock_low[clock_name]
} }
function abs(x) function abs(x)
{ {
return x<0? -x : x return x<0? -x : x
} }

View File

@ -1,21 +1,21 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
# File: expand_alias.awk # File: expand_alias.awk
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2023 Stefan Frederik Schippers # Copyright (C) 1998-2023 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -33,7 +33,7 @@
# sample input: # sample input:
# #
# alias ciclo_we par1 par2 # alias ciclo_we par1 par2
# #
# set apad 0 # set apad 0
# set dqpad 0 # set dqpad 0
# s .1 # s .1
@ -45,9 +45,9 @@
# set dqpad 0 # set dqpad 0
# set wenpad 1 # set wenpad 1
# s .1 # s .1
# #
# endalias # endalias
# #
# ciclo_we aa 55 # ciclo_we aa 55
# ciclo_we 55 aa # ciclo_we 55 aa
@ -82,7 +82,7 @@ function process_line()
alias[name , "l" line++]=$0 alias[name , "l" line++]=$0
if($1 ~ /^endalias *$/) if($1 ~ /^endalias *$/)
{ {
alias[name , "lines"]=line-1 alias[name , "lines"]=line-1
beginalias=0; beginalias=0;
} }
return return
@ -92,7 +92,7 @@ function process_line()
expand_alias($0) expand_alias($0)
} }
else print $0 else print $0
} }
# 20150718 generic replacer of {param} patterns in macro lines # 20150718 generic replacer of {param} patterns in macro lines
@ -117,11 +117,11 @@ function replace(name, s, pre, par, post)
return s return s
} }
# 20110630 # 20110630
function analyze_params_in_expressions(name, s, ss, s_arr, i, o, o_arr, n) function analyze_params_in_expressions(name, s, ss, s_arr, i, o, o_arr, n)
{ {
s=replace(name, s) #20150918 new {par} format to avoid ambiguities in complex patterns s=replace(name, s) #20150918 new {par} format to avoid ambiguities in complex patterns
ss="" ss=""
n = split(s, s_arr, /[=\-\/\+\*]/) # 20150810 added '=' for substituting 'set sig 0 slope=slp' with slp=param n = split(s, s_arr, /[=\-\/\+\*]/) # 20150810 added '=' for substituting 'set sig 0 slope=slp' with slp=param
o = split(s, o_arr, /[^=\-\+\*\/]+/) # 20150810 added '=' o = split(s, o_arr, /[^=\-\+\*\/]+/) # 20150810 added '='

View File

@ -1,28 +1,28 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
# File: param.awk # File: param.awk
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2023 Stefan Frederik Schippers # Copyright (C) 1998-2023 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
# 20200212 added simple expression parsing # 20200212 added simple expression parsing
# 20170830 # 20170830
BEGIN{ BEGIN{
for(i=0;i<=127;i++) for(i=0;i<=127;i++)
{ {
@ -34,7 +34,7 @@ BEGIN{
{ {
gsub (/[ \t]*=[ \t]*/, "=") gsub (/[ \t]*=[ \t]*/, "=")
} }
/^\.*param/{ /^\.*param/{
param[$2]=arith($3) param[$2]=arith($3)
@ -59,9 +59,9 @@ BEGIN{
} }
else { else {
$nf = arith($nf) $nf = arith($nf)
} }
} }
} }
#20171117 ascii string --> hex #20171117 ascii string --> hex
@ -85,7 +85,7 @@ BEGIN{
# 20150718 generic replacer of {param} patterns # 20150718 generic replacer of {param} patterns
# example: set vcc '{param}? 1.2 : {vhigh}' # example: set vcc '{param}? 1.2 : {vhigh}'
function replace(s, pre, par, post) function replace(s, pre, par, post)
{ {
@ -134,7 +134,7 @@ function arith(s, op, n, ss, j, valid_expr, arith_operators)
} }
} }
if(!valid_expr) return sss if(!valid_expr) return sss
# if the result of an arithmetic evaluation is 1 return 1.0 # if the result of an arithmetic evaluation is 1 return 1.0
# otherwise stimuli.awk will translate it to the high logic value # otherwise stimuli.awk will translate it to the high logic value
else if(arith_operators && lab==1) return "1.0" else if(arith_operators && lab==1) return "1.0"
else return lab else return lab

View File

@ -1,26 +1,26 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
# File: preprocess.awk # File: preprocess.awk
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2023 Stefan Frederik Schippers # Copyright (C) 1998-2023 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
# #
function expand_file(file, err) function expand_file(file, err)

View File

@ -1,21 +1,21 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
# File: stimuli.awk # File: stimuli.awk
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2023 Stefan Frederik Schippers # Copyright (C) 1998-2023 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -72,7 +72,7 @@
# - prefixing a bus assignment with the tilde char (~) produces inverted data: # - prefixing a bus assignment with the tilde char (~) produces inverted data:
# ex: set apad ~AA'0101'FF ---> 0101 0101 1010 0000 0000 # ex: set apad ~AA'0101'FF ---> 0101 0101 1010 0000 0000
# - NEW!!!! added relative_powermill format, which generates stimuli files # - NEW!!!! added relative_powermill format, which generates stimuli files
# with no explicit reference to absolute time, usefull for interactive mode # with no explicit reference to absolute time, usefull for interactive mode
# simulations, (generated file can be read with read_cmd_file command) # simulations, (generated file can be read with read_cmd_file command)
# example: # example:
# rel_node_v no=aaa # rel_node_v no=aaa
@ -93,9 +93,9 @@
# By the way, why not padding with "x" chars which mean don't # By the way, why not padding with "x" chars which mean don't
# change? # change?
# 01/01/2000 - tobinary() pads missing bits with "x" chars, removed the test # 01/01/2000 - tobinary() pads missing bits with "x" chars, removed the test
# on space described above. I hope this does not introduce # on space described above. I hope this does not introduce
# side effects/bugs. # side effects/bugs.
# 10/01/2000 - Removed explicit pathnames. this is no more an awk script but a # 10/01/2000 - Removed explicit pathnames. this is no more an awk script but a
# sh script, which in turn runs awk. # sh script, which in turn runs awk.
# 21/01/2000 - bugfix: the last "set whatever_node 1" assigment in stimuli file # 21/01/2000 - bugfix: the last "set whatever_node 1" assigment in stimuli file
# was incorrectly translated to "force_node_v no=whatever_node v=1" # was incorrectly translated to "force_node_v no=whatever_node v=1"
@ -105,21 +105,21 @@
# assignment (relative_powermill only) # assignment (relative_powermill only)
# 01-06-2000 - dump lines are printed in the position they appear, not at end of file. # 01-06-2000 - dump lines are printed in the position they appear, not at end of file.
# eldo and spice keywords work as before # eldo and spice keywords work as before
# 24-10-2001 - fixed a bug in write_pwl_pair.(incorrect eldo stimuli generation in # 24-10-2001 - fixed a bug in write_pwl_pair.(incorrect eldo stimuli generation in
# case of assignment at time=previous time+slope). # case of assignment at time=previous time+slope).
# 21-11-2001 - NEW! ncsim format # 21-11-2001 - NEW! ncsim format
# 03-12-2001 - clock and stop_clock directives, handled by external clock.awk program # 03-12-2001 - clock and stop_clock directives, handled by external clock.awk program
# 04-12-2001 - Improvements in ncsim format (dont cares, single bit and bus slice # 04-12-2001 - Improvements in ncsim format (dont cares, single bit and bus slice
# assignments # assignments
# 12-07-2002 - Improvements in the clock keyword, now high and low voltage levels can # 12-07-2002 - Improvements in the clock keyword, now high and low voltage levels can
# be specified too, no backward compatibility issues, see help file # be specified too, no backward compatibility issues, see help file
# When pressing the Translate button the simulated time is printed # When pressing the Translate button the simulated time is printed
# 24-07-2002 - various bug fixes (ncsim bus slice notation using () instead of [] to # 24-07-2002 - various bug fixes (ncsim bus slice notation using () instead of [] to
# avoid confusing the ncsim TCL interpreter,when using the ncsim source # avoid confusing the ncsim TCL interpreter,when using the ncsim source
# command ) # command )
# 23-08-2002 - in ncsim format comments are printed on translated file to indicate the # 23-08-2002 - in ncsim format comments are printed on translated file to indicate the
# beginning of an alias # beginning of an alias
# 28-10-2002 - optional index delimiters in buswidth declaration: ex: buswidth add 4 < > # 28-10-2002 - optional index delimiters in buswidth declaration: ex: buswidth add 4 < >
# --> add<3> add<2> add<1> add<0> # --> add<3> add<2> add<1> add<0>
# 28-10-2002 - create_eldo_bus keyword can be specified to force bus creation for xelga # 28-10-2002 - create_eldo_bus keyword can be specified to force bus creation for xelga
# plots even when the eldo_simple option is used # plots even when the eldo_simple option is used
@ -127,10 +127,10 @@
# set vxp 8.0 20000 ==> 20K resistance # set vxp 8.0 20000 ==> 20K resistance
# 29-10-2003 - New keyword "ground" to specify low voltage level (Vil), similarly to "voltage" for Vih # 29-10-2003 - New keyword "ground" to specify low voltage level (Vil), similarly to "voltage" for Vih
# 08-09-2005 - New ground_node keyword for specifying different gnd node for sources # 08-09-2005 - New ground_node keyword for specifying different gnd node for sources
# 20100301 - new syntax for set instruction, # 20100301 - new syntax for set instruction,
# set <signal> <sigval> [res=<resval>] [vhi=<hival>] [vlo=<lowval>] [slope=<slopeval>] # set <signal> <sigval> [res=<resval>] [vhi=<hival>] [vlo=<lowval>] [slope=<slopeval>]
# all values can be parametrs and simple arithmetic expressions with parameters # all values can be parametrs and simple arithmetic expressions with parameters
# - added simple expression parser on params, supported operators : +, -, *, /, expressions # - added simple expression parser on params, supported operators : +, -, *, /, expressions
# evaluated frol left to right, no parenthesis, and no operator priority.. # evaluated frol left to right, no parenthesis, and no operator priority..
# examples: # examples:
# param tck 2500 # param tck 2500
@ -140,7 +140,7 @@
# set a vx-0.3 # set a vx-0.3
# s tck-tds # s tck-tds
# #
# #
# #
# sample input: # sample input:
# time 0 # time 0
@ -148,7 +148,7 @@
# unit u # unit u
# voltage 1.8 # voltage 1.8
# bus apad apad8 apad7 apad6 apad5 apad4 apad3 apad2 apad1 apad0 # bus apad apad8 apad7 apad6 apad5 apad4 apad3 apad2 apad1 apad0
# #
# set vneg_h 1 ; set initial state # set vneg_h 1 ; set initial state
# set vnegon 1 # set vnegon 1
# set vxws_off 1 # set vxws_off 1
@ -157,9 +157,9 @@
# set sw_to_neg 1 # set sw_to_neg 1
# set vxh 0 # set vxh 0
# set apad 000 # set apad 000
# #
# s 110 # s 110
# #
# set apad 1ff # set apad 1ff
# set arrpwh 0 # set arrpwh 0
# s 8 # s 8
@ -168,7 +168,7 @@
# set vnegon 0 # set vnegon 0
# s 7 # s 7
# #
# usage: # usage:
# expand_alias.awk stimuli3 | clock.awk |stimuli.awk # expand_alias.awk stimuli3 | clock.awk |stimuli.awk
BEGIN{ BEGIN{
@ -197,16 +197,16 @@ BEGIN{
} }
} }
/^[ \t]*beginfile[ \t]+/{ /^[ \t]*beginfile[ \t]+/{
reset_all();file=$2 reset_all();file=$2
next next
} }
/<<<alias>>>/{ /<<<alias>>>/{
if(format != "ncsim") next if(format != "ncsim") next
$0 = $1 " " $2 " " $3 " " $4 # 20100212 $0 = $1 " " $2 " " $3 " " $4 # 20100212
} }
/^[ \t]*(eldo|spice)[ \t]+/{$1="";$0=substr($0,2);dump[++dumpline]=$0;next} /^[ \t]*(eldo|spice)[ \t]+/{$1="";$0=substr($0,2);dump[++dumpline]=$0;next}
# 20170419 added {time} to be replaced with actual time value in dump string # 20170419 added {time} to be replaced with actual time value in dump string
@ -221,7 +221,7 @@ BEGIN{
/^[ \t]*halfvoltage[ \t]+/{ halfvoltage=$2; halfvoltageset=1} # 20160412 /^[ \t]*halfvoltage[ \t]+/{ halfvoltage=$2; halfvoltageset=1} # 20160412
/^[ \t]*unit[ \t]+/{ unit=$2} /^[ \t]*unit[ \t]+/{ unit=$2}
/^[ \t]*ground_node[ \t]+/{ gndnode=$2} /^[ \t]*ground_node[ \t]+/{ gndnode=$2}
/^[ \t]*format[ \t]+/{ /^[ \t]*format[ \t]+/{
if($2=="hspice") { if($2=="hspice") {
format="eldo" format="eldo"
variant="hspice" variant="hspice"
@ -236,7 +236,7 @@ BEGIN{
ground=$2 ground=$2
if(!halfvoltageset) { # 20170405 if(!halfvoltageset) { # 20170405
if(is_number(voltage) && is_number(ground)) { if(is_number(voltage) && is_number(ground)) {
halfvoltage=(voltage+ground) / 2 halfvoltage=(voltage+ground) / 2
} else { } else {
halfvoltage = "'(" voltage "+" ground ")/2)'" halfvoltage = "'(" voltage "+" ground ")/2)'"
} }
@ -246,17 +246,17 @@ BEGIN{
voltage = $2 voltage = $2
if(!halfvoltageset) { # 20170405 if(!halfvoltageset) { # 20170405
if(is_number(voltage) && is_number(ground)) { if(is_number(voltage) && is_number(ground)) {
halfvoltage=(voltage+ground) / 2 halfvoltage=(voltage+ground) / 2
} else { } else {
halfvoltage = "'(" voltage "+" ground ")/2'" halfvoltage = "'(" voltage "+" ground ")/2'"
} }
} }
} }
/^[ \t]*reset_sim[ \t]*/{if(format=="ncsim") print "reset" >file} # usefull in ncsim /^[ \t]*reset_sim[ \t]*/{if(format=="ncsim") print "reset" >file} # usefull in ncsim
/^[ \t]*s[ \t]+/{ /^[ \t]*s[ \t]+/{
time+=$2 time+=$2
if(format=="ncsim" && time >=0 ) if(format=="ncsim" && time >=0 )
{ {
print "run " $2 " " unit "s" >file print "run " $2 " " unit "s" >file
} }
@ -280,8 +280,8 @@ BEGIN{
print "; time= " time > file print "; time= " time > file
powmill_statement++ powmill_statement++
delete set_list delete set_list
} }
} }
/^[ \t]*buswidth[ \t]+/{ /^[ \t]*buswidth[ \t]+/{
@ -291,7 +291,7 @@ BEGIN{
for(i=($3); i>=1;i--) for(i=($3); i>=1;i--)
bus[$2,i]=$2 openbracket $3-i closebracket bus[$2,i]=$2 openbracket $3-i closebracket
} }
/^[ \t]*bus[ \t]+/{ /^[ \t]*bus[ \t]+/{
@ -310,7 +310,7 @@ BEGIN{
/^[ \t]*set[ \t]+/{ /^[ \t]*set[ \t]+/{
# 20100301 # 20100301
res = ron res = ron
vhi = voltage vhi = voltage
vlo = ground vlo = ground
slp=slope slp=slope
@ -318,7 +318,7 @@ BEGIN{
for(i=4; i<=NF; i++) { for(i=4; i<=NF; i++) {
if($i ~ /^;/) break if($i ~ /^;/) break
#20150918 delete $i after using it #20150918 delete $i after using it
if((i==4) && ($i+0>0) && NF==4 ) { res=$i;$i=""; break} if((i==4) && ($i+0>0) && NF==4 ) { res=$i;$i=""; break}
if(tolower($i) ~ /^r(es)?=/) { res=$i; sub(/^.*=/,"",res); $i="" } if(tolower($i) ~ /^r(es)?=/) { res=$i; sub(/^.*=/,"",res); $i="" }
if(tolower($i) ~ /^vhi(gh)?=/) { vhi=$i; sub(/^.*=/,"",vhi); $i="" } if(tolower($i) ~ /^vhi(gh)?=/) { vhi=$i; sub(/^.*=/,"",vhi); $i="" }
if(tolower($i) ~ /^vlow?=/) { vlo=$i; sub(/^.*=/,"",vlo); $i="" } if(tolower($i) ~ /^vlow?=/) { vlo=$i; sub(/^.*=/,"",vlo); $i="" }
@ -333,7 +333,7 @@ BEGIN{
halfvoltage = "'(" vhi "+" vlo ")/2'" halfvoltage = "'(" vhi "+" vlo ")/2'"
} }
} }
if($2 in buswidth) if($2 in buswidth)
{ {
if($3 ~ /^~/) # inversion flag on bus assignment if($3 ~ /^~/) # inversion flag on bus assignment
@ -354,13 +354,13 @@ BEGIN{
w=buswidth[$2] w=buswidth[$2]
low=s_i(bus[$2,w]) # LSB bit of the bus low=s_i(bus[$2,w]) # LSB bit of the bus
high=s_i(bus[$2,w-num+1]) # MSB bit of the bus high=s_i(bus[$2,w-num+1]) # MSB bit of the bus
if(num < w && num >1 ) if(num < w && num >1 )
{
sig=sig "(" high ":" low ")" ; quote="\""
}
if(num < w && num ==1)
{ {
sig=sig "(" low ")" ; quote="'" sig=sig "(" high ":" low ")" ; quote="\""
}
if(num < w && num ==1)
{
sig=sig "(" low ")" ; quote="'"
} }
if($3 !~ /[zZxX]/) if($3 !~ /[zZxX]/)
{ {
@ -370,7 +370,7 @@ BEGIN{
{ {
print "release " sig >file print "release " sig >file
} }
else else
{ {
sig= "." $2 sig= "." $2
gsub(/\./,":",sig) gsub(/\./,":",sig)
@ -395,7 +395,7 @@ BEGIN{
v=substr(binstring,i,1) v=substr(binstring,i,1)
if(v !~ /[xX]/) if(v !~ /[xX]/)
{ {
set_list[s]=v # used to build the set of signals forced between set_list[s]=v # used to build the set of signals forced between
# successive s lines # successive s lines
} }
@ -413,7 +413,7 @@ BEGIN{
{ {
$3=1 $3=1
} }
if($3 !~ /^[xX]$/) if($3 !~ /^[xX]$/)
{ {
$3=$0 $3=$0
@ -467,10 +467,10 @@ function end_file(){
print "**************************************\n" > file print "**************************************\n" > file
for(i in signalname) for(i in signalname)
{ {
use_z = ( (format !~ /_simple/) && signalz[i] ) use_z = ( (format !~ /_simple/) && signalz[i] )
ix=i ix=i
gsub(/\./,"_",ix) gsub(/\./,"_",ix)
if(!use_z) if(!use_z)
printf simplesignalname[i]>file printf simplesignalname[i]>file
else else
printf signalname[i]>file printf signalname[i]>file
@ -483,7 +483,7 @@ function end_file(){
# 20100224 quotes instead of parenthesis used for value=.... # 20100224 quotes instead of parenthesis used for value=....
# as per new eldo syntax. this makes it compatible w eldo and hspice # as per new eldo syntax. this makes it compatible w eldo and hspice
print "R" ix " XX" ix " " i " value='v(VR" ix ")'">file print "R" ix " XX" ix " " i " value='v(VR" ix ")'">file
else else
print "R" ix " XX" ix " " i " 'v(VR" ix ")'">file print "R" ix " XX" ix " " i " 'v(VR" ix ")'">file
printf "%s",signalres[i]>file printf "%s",signalres[i]>file
for(j=1;j<=signal[i,"n"];j++) for(j=1;j<=signal[i,"n"];j++)
@ -509,7 +509,7 @@ function end_file(){
print "; POWERMILL VECTOR FILE">file print "; POWERMILL VECTOR FILE">file
print "type vec">file print "type vec">file
printf "signal ">file printf "signal ">file
for(i=1;i<=signals;i++) for(i=1;i<=signals;i++)
printf signal_list[i] " " >file printf signal_list[i] " " >file
printf "\n" >file printf "\n" >file
print "slope " slope*mult>file print "slope " slope*mult>file
@ -529,7 +529,7 @@ function end_file(){
if(j>1) x-=slp if(j>1) x-=slp
v=signal[i,"value",j] v=signal[i,"value",j]
if(v>halfvoltage) vv="1" if(v>halfvoltage) vv="1"
if(v==halfvoltage) vv="z" if(v==halfvoltage) vv="z"
if(v<halfvoltage) vv="0" if(v<halfvoltage) vv="0"
if(output[x]=="") output[x]=chars(signals,"_") if(output[x]=="") output[x]=chars(signals,"_")
output[x]=setbit(output[x],vv,signals-k) output[x]=setbit(output[x],vv,signals-k)
@ -615,18 +615,18 @@ function write_pwl_pair( name, value,res, vhi, vlo,slope, timex, namex,vv,vv1,
else {v = value; pwlres=res} else {v = value; pwlres=res}
namex=name namex=name
gsub(/\./,"_",namex) gsub(/\./,"_",namex)
if(!(name in signalname) ) if(!(name in signalname) )
{ {
timex=time < 0 ? 0: time timex=time < 0 ? 0: time
signal_list[++signals]=name signal_list[++signals]=name
signalname[name]="V" namex " XX" namex " " gndnode " PWL " signalname[name]="V" namex " XX" namex " " gndnode " PWL "
simplesignalname[name]="V" namex " " name " " gndnode " PWL " simplesignalname[name]="V" namex " " name " " gndnode " PWL "
signal[name,"time",1]= timex signal[name,"time",1]= timex
signal[name,"value",1]= v signal[name,"value",1]= v
signal[name,"n"]= 1 signal[name,"n"]= 1
# 20170810 0 instead of gndnode # 20170810 0 instead of gndnode
# | # |
signalres[name]="VR" namex " VR" namex " " 0 " PWL " signalres[name]="VR" namex " VR" namex " " 0 " PWL "
signalres[name,"value",1]= pwlres signalres[name,"value",1]= pwlres
} }
if(signal[name,"value", signal[name,"n"] ]!=v || signalres[name,"value", signal[name,"n"] ]!=pwlres) if(signal[name,"value", signal[name,"n"] ]!=v || signalres[name,"value", signal[name,"n"] ]!=pwlres)
@ -641,10 +641,10 @@ function write_pwl_pair( name, value,res, vhi, vlo,slope, timex, namex,vv,vv1,
} }
## 20151112 ## 20151112
else if(timex+slope == signal[name,"time",signal[name,"n"]] ) { else if(timex+slope == signal[name,"time",signal[name,"n"]] ) {
n = signal[name,"n"] n = signal[name,"n"]
signal[name,"value",n]= v signal[name,"value",n]= v
signalres[name,"value",n]= pwlres signalres[name,"value",n]= pwlres
} }
else else
{ {
if( timex > signal[name,"time",signal[name,"n"]] ) if( timex > signal[name,"time",signal[name,"n"]] )
@ -657,11 +657,11 @@ function write_pwl_pair( name, value,res, vhi, vlo,slope, timex, namex,vv,vv1,
## 20100302 interpolation if signal change occurs before conpleting previous transaction ## 20100302 interpolation if signal change occurs before conpleting previous transaction
else if(timex < signal[name,"time",signal[name,"n"]] ){ else if(timex < signal[name,"time",signal[name,"n"]] ){
n = signal[name,"n"] n = signal[name,"n"]
vv1 = signal[name,"value",n-1] vv1 = signal[name,"value",n-1]
vv2 = signal[name,"value",n] vv2 = signal[name,"value",n]
tt1 = signal[name,"time",n-1] tt1 = signal[name,"time",n-1]
tt2 = signal[name,"time",n] tt2 = signal[name,"time",n]
vv = vv1 + (vv2-vv1)/(tt2-tt1) * (timex-tt1) vv = vv1 + (vv2-vv1)/(tt2-tt1) * (timex-tt1)
signal[name,"time",n]=timex signal[name,"time",n]=timex
signal[name,"value",n]= vv signal[name,"value",n]= vv
@ -674,7 +674,7 @@ function write_pwl_pair( name, value,res, vhi, vlo,slope, timex, namex,vv,vv1,
signal[name,"time",n]=timex+slope signal[name,"time",n]=timex+slope
signal[name,"value",n]= v signal[name,"value",n]= v
signalres[name,"value",n]= pwlres signalres[name,"value",n]= pwlres
} }
} }
} }
} }
@ -752,7 +752,7 @@ function binary( n, width, a,i,str)
} }
return str return str
} }
function binval(str, i,n) function binval(str, i,n)
# returns the decimal value of the binary number encoded in "str" # returns the decimal value of the binary number encoded in "str"
{ {
@ -803,7 +803,7 @@ function hsort(array,ra,n, rarray,l,j,ir,i,rra)
array[i]=rarray array[i]=rarray
} }
} }
function setbit( string, replace, pos, reversepos,len) function setbit( string, replace, pos, reversepos,len)
# returns <string> with bits starting at position <pos> # returns <string> with bits starting at position <pos>
# set to <replace>, position 0 being relative to the rightmost bit # set to <replace>, position 0 being relative to the rightmost bit
@ -851,7 +851,7 @@ function reset_all()
delete dump delete dump
time=0 time=0
origin=0 origin=0
} }
function break_lines(filename, quote, j, lines, line, l, i, count, style ) function break_lines(filename, quote, j, lines, line, l, i, count, style )
@ -863,7 +863,7 @@ function break_lines(filename, quote, j, lines, line, l, i, count, style )
close(filename) close(filename)
# 20120410 # 20120410
lines = lines + 0 # do NOT remove, solves a problem with gawk 3.0.5 where a variable used as lines = lines + 0 # do NOT remove, solves a problem with gawk 3.0.5 where a variable used as
# array index is "magically" converted to string # array index is "magically" converted to string
@ -871,10 +871,10 @@ function break_lines(filename, quote, j, lines, line, l, i, count, style )
for(l=1;l<=lines;l++) for(l=1;l<=lines;l++)
{ {
$0=line[l] $0=line[l]
if($0 ~ /^\* ELDO/) {style="+"} if($0 ~ /^\* ELDO/) {style="+"}
if($0 ~ /^; POWERMILL/) {style="\\"} if($0 ~ /^; POWERMILL/) {style="\\"}
count=0 count=0
if(NF==0) print "">filename if(NF==0) print "">filename
@ -886,7 +886,7 @@ function break_lines(filename, quote, j, lines, line, l, i, count, style )
if(substr($i,j,1)=="'") quote = !quote if(substr($i,j,1)=="'") quote = !quote
} }
# print "+++ " quote, $i, count # print "+++ " quote, $i, count
printf "%s ", $i>filename printf "%s ", $i>filename
count++ count++
if(( count>=15 && !quote) || i==NF) if(( count>=15 && !quote) || i==NF)

View File

@ -1,22 +1,22 @@
#!/bin/sh #!/bin/sh
# File: utile.tcl # File: utile.tcl
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2023 Stefan Frederik Schippers # Copyright (C) 1998-2023 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -32,13 +32,13 @@ proc text_window {w filename} {
toplevel $w toplevel $w
wm title $w "(IN)UTILE ALIAS FILE" wm title $w "(IN)UTILE ALIAS FILE"
wm iconname $w "ALIAS" wm iconname $w "ALIAS"
frame $w.buttons frame $w.buttons
pack $w.buttons -side bottom -fill x -pady 2m pack $w.buttons -side bottom -fill x -pady 2m
button $w.buttons.dismiss -text Dismiss -command "destroy $w" button $w.buttons.dismiss -text Dismiss -command "destroy $w"
button $w.buttons.code -text "See Code" -command "showCode $w" button $w.buttons.code -text "See Code" -command "showCode $w"
pack $w.buttons.dismiss $w.buttons.code -side left -expand 1 pack $w.buttons.dismiss $w.buttons.code -side left -expand 1
text $w.text -relief sunken -bd 2 -yscrollcommand "$w.scroll set" -setgrid 1 \ text $w.text -relief sunken -bd 2 -yscrollcommand "$w.scroll set" -setgrid 1 \
-height 30 -height 30
scrollbar $w.scroll -command "$w.text yview" scrollbar $w.scroll -command "$w.text yview"
@ -47,7 +47,7 @@ proc text_window {w filename} {
set fileid [open $filename "r"] set fileid [open $filename "r"]
$w.text insert 0.0 [read $fileid] $w.text insert 0.0 [read $fileid]
close $fileid close $fileid
} }
proc entry_line {txtlabel} { proc entry_line {txtlabel} {
global entry1 global entry1
@ -83,10 +83,10 @@ proc entry_line {txtlabel} {
proc write_data {w f} { proc write_data {w f} {
set fid [open $f "w"] set fid [open $f "w"]
set t [$w get 0.0 {end - 1 chars}] set t [$w get 0.0 {end - 1 chars}]
puts -nonewline $fid $t puts -nonewline $fid $t
close $fid close $fid
} }
proc read_data {w f} { proc read_data {w f} {
set fid [open $f "r"] set fid [open $f "r"]
set t [read $fid] set t [read $fid]
@ -120,11 +120,11 @@ proc new_window {w filename} {
translate $filename ; get_time" translate $filename ; get_time"
button $w.buttons.dismiss -text Dismiss -command "destroy $w" button $w.buttons.dismiss -text Dismiss -command "destroy $w"
pack $w.buttons.dismiss $w.buttons.translate -side left -expand 1 pack $w.buttons.dismiss $w.buttons.translate -side left -expand 1
pack $w.scroll -side right -fill y pack $w.scroll -side right -fill y
pack $w.text -expand yes -fill both pack $w.text -expand yes -fill both
} }
proc get_time {} { proc get_time {} {
set fileid [open "inutile.simulationtime" "RDONLY"] set fileid [open "inutile.simulationtime" "RDONLY"]
.buttons.time delete 0 end .buttons.time delete 0 end
@ -132,8 +132,8 @@ proc get_time {} {
close $fileid close $fileid
file delete "inutile.simulationtime" file delete "inutile.simulationtime"
} }
proc alias_window {w filename} { proc alias_window {w filename} {
catch {destroy $w} catch {destroy $w}
toplevel $w toplevel $w
@ -152,24 +152,24 @@ proc alias_window {w filename} {
button $w.buttons.save -text Save -command "write_data $w.text $filename" button $w.buttons.save -text Save -command "write_data $w.text $filename"
button $w.buttons.load -text Reload -command "read_data $w.text $filename" button $w.buttons.load -text Reload -command "read_data $w.text $filename"
pack $w.buttons.dismiss $w.buttons.save $w.buttons.load -side left -expand 1 pack $w.buttons.dismiss $w.buttons.save $w.buttons.load -side left -expand 1
pack $w.scroll -side right -fill y pack $w.scroll -side right -fill y
pack $w.text -expand yes -fill both pack $w.text -expand yes -fill both
$w.text insert 0.0 $testo $w.text insert 0.0 $testo
} }
proc help_window {w filename} { proc help_window {w filename} {
catch {destroy $w} catch {destroy $w}
toplevel $w toplevel $w
wm title $w "(IN)UTILE ALIAS FILE" wm title $w "(IN)UTILE ALIAS FILE"
wm iconname $w "ALIAS" wm iconname $w "ALIAS"
frame $w.buttons frame $w.buttons
pack $w.buttons -side bottom -fill x -pady 2m pack $w.buttons -side bottom -fill x -pady 2m
button $w.buttons.dismiss -text Dismiss -command "destroy $w" button $w.buttons.dismiss -text Dismiss -command "destroy $w"
button $w.buttons.save -text Save -command "write_data $w.text $filename" button $w.buttons.save -text Save -command "write_data $w.text $filename"
pack $w.buttons.dismiss $w.buttons.save -side left -expand 1 pack $w.buttons.dismiss $w.buttons.save -side left -expand 1
text $w.text -relief sunken -bd 2 -yscrollcommand "$w.scroll set" -setgrid 1 \ text $w.text -relief sunken -bd 2 -yscrollcommand "$w.scroll set" -setgrid 1 \
-height 30 -width 90 -height 30 -width 90
scrollbar $w.scroll -command "$w.text yview" scrollbar $w.scroll -command "$w.text yview"
@ -178,7 +178,7 @@ proc help_window {w filename} {
set fileid [open $filename "RDONLY CREAT"] set fileid [open $filename "RDONLY CREAT"]
$w.text insert 0.0 [read $fileid] $w.text insert 0.0 [read $fileid]
close $fileid close $fileid
} }
proc translate {f} { proc translate {f} {
global tcl_platform global tcl_platform
@ -214,15 +214,15 @@ text .text -relief sunken -bd 2 -yscrollcommand ".scroll set" -setgrid 1 \
scrollbar .scroll -command ".text yview" scrollbar .scroll -command ".text yview"
button .buttons.save -text Save -command { button .buttons.save -text Save -command {
set entry1 $filename;set filename [entry_line {Filename}] set entry1 $filename;set filename [entry_line {Filename}]
write_data .text $filename write_data .text $filename
} }
button .buttons.load -text Reload -command { button .buttons.load -text Reload -command {
set entry1 $filename;set filename [entry_line {Filename}] set entry1 $filename;set filename [entry_line {Filename}]
read_data .text $filename read_data .text $filename
} }
button .buttons.send -text "Template" -command { button .buttons.send -text "Template" -command {
if { ![string compare [.text get 0.0 {end - 1 chars}] ""] } then { if { ![string compare [.text get 0.0 {end - 1 chars}] ""] } then {
template .text $env(UTILE3_PATH)/template.stimuli template .text $env(UTILE3_PATH)/template.stimuli
} }
} }
label .buttons.timelab -text "time:" label .buttons.timelab -text "time:"
@ -235,7 +235,7 @@ pack .scroll -side right -fill y
pack .text -expand yes -fill both pack .text -expand yes -fill both
# 20140408 # 20140408
if { [file exists $filename] } { if { [file exists $filename] } {
set fileid [open $filename "RDONLY"] set fileid [open $filename "RDONLY"]
.text insert 0.0 [read $fileid] .text insert 0.0 [read $fileid]
close $fileid close $fileid
@ -248,10 +248,10 @@ regsub {\..*$} $tmp {} lines
for {set i 1} {$i <= $lines} {incr i} { for {set i 1} {$i <= $lines} {incr i} {
set tmp [.text get $i.0 "$i.0 lineend"] set tmp [.text get $i.0 "$i.0 lineend"]
if [regexp {^(include)|(\.include)} $tmp ] { if [regexp {^(include)|(\.include)} $tmp ] {
alias_window .tw$i [lindex $tmp 1] alias_window .tw$i [lindex $tmp 1]
} }
} }

View File

@ -1,22 +1,22 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
# #
# File: verilog.awk # File: verilog.awk
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers # Copyright (C) 1998-2024 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -77,13 +77,13 @@ BEGIN{
sub(/----pin\(/,"",prim_field) sub(/----pin\(/,"",prim_field)
sub(/\)$/,"",prim_field) sub(/\)$/,"",prim_field)
pport_mult = split(prim_field, prim_field_array,/,/) pport_mult = split(prim_field, prim_field_array,/,/)
# 20060919 BEGIN # 20060919 BEGIN
# if bussed port connected to primitive and primitive mult==1 print only basename of bus # if bussed port connected to primitive and primitive mult==1 print only basename of bus
if(primitive_mult==1 && pport_mult>1) { if(primitive_mult==1 && pport_mult>1) {
if(check2(prim_field_array, pport_mult)) if(check2(prim_field_array, pport_mult))
printf "%s[%s:%s] ", prefix s_b(prim_field_array[1]), printf "%s[%s:%s] ", prefix s_b(prim_field_array[1]),
s_i(prim_field_array[1]), s_i(prim_field_array[pport_mult]) s_i(prim_field_array[1]), s_i(prim_field_array[pport_mult])
else { else {
printf " { " printf " { "
for(s=1;s<= pport_mult; s++) { for(s=1;s<= pport_mult; s++) {
@ -92,8 +92,8 @@ BEGIN{
} }
printf "}%s", primitive_line_sep[i+1] printf "}%s", primitive_line_sep[i+1]
} }
} }
else else
# 20060919 end # 20060919 end
printf "%s", prim_field_array[1+(j-1) % pport_mult] # 20140401 1+(j-1) % pport_mult instead of j printf "%s", prim_field_array[1+(j-1) % pport_mult] # 20140401 1+(j-1) % pport_mult instead of j
@ -130,7 +130,7 @@ primitive==1{primitive_line=primitive_line "\n" $0; next }
printf "%s ", signal_type[i] printf "%s ", signal_type[i]
# 20161118 # 20161118
ntypes = split(signal_type[i], sigtype_arr) ntypes = split(signal_type[i], sigtype_arr)
if(ntypes==2) { if(ntypes==2) {
if( i in signal_delay) printf "%s ", signal_delay[i] if( i in signal_delay) printf "%s ", signal_delay[i]
printf "%s", i printf "%s", i
@ -144,7 +144,7 @@ primitive==1{primitive_line=primitive_line "\n" $0; next }
printf " ;\n" printf " ;\n"
} else { } else {
if( i in signal_delay) printf "%s ", signal_delay[i] if( i in signal_delay) printf "%s ", signal_delay[i]
if(signal_index[i] !~ /no_index/) if(signal_index[i] !~ /no_index/)
{ {
if(tmp[1] ~ /:/) printf "[%s] ",tmp[1] if(tmp[1] ~ /:/) printf "[%s] ",tmp[1]
else if(n==1) printf "[%s:%s] ",tmp[1], tmp[1] else if(n==1) printf "[%s:%s] ",tmp[1], tmp[1]
@ -156,7 +156,7 @@ primitive==1{primitive_line=primitive_line "\n" $0; next }
} }
} }
# /20161118 # /20161118
siglist=0; siglist=0;
print "" print ""
netlist=1 netlist=1
@ -165,7 +165,7 @@ primitive==1{primitive_line=primitive_line "\n" $0; next }
# store signals # store signals
siglist==1 && ($1 in net_types) { siglist==1 && ($1 in net_types) {
# 20070525 recognize "reg real", "wire signed" types and similar # 20070525 recognize "reg real", "wire signed" types and similar
if($2 in net_types) { if($2 in net_types) {
if($3 ~ /^#/) basename=s_b($4) if($3 ~ /^#/) basename=s_b($4)
else basename=s_b($3) else basename=s_b($3)
@ -199,7 +199,7 @@ siglist==1 && ($1 in net_types) {
if($3=="="){ if($3=="="){
val=$0 val=$0
sub(/.*=/,"",val) sub(/.*=/,"",val)
sub(/;.*/,"",val) sub(/;.*/,"",val)
signal_value[basename]=val signal_value[basename]=val
} }
if(!(basename in signal_basename)) signal_num[signal_n++] = basename # used to preserve order of signals if(!(basename in signal_basename)) signal_num[signal_n++] = basename # used to preserve order of signals
@ -211,7 +211,7 @@ siglist==1 && ($1 in net_types) {
} }
next next
} }
/---- begin signal list/{ /---- begin signal list/{
siglist=1; siglist=1;
next next
@ -301,7 +301,7 @@ begin_module && $1 ~/^\);$/ {
printf "\n);\n\n" printf "\n);\n\n"
} }
previous="" previous=""
next next
} }
# types of in/out/inout ports of module # types of in/out/inout ports of module
@ -335,7 +335,7 @@ NF==3 && netlist==0 && architecture==0 && ($1 in direction) {
next next
} }
/^---- end parameters/{ /^---- end parameters/{
parameters=0 parameters=0
next next
} }
@ -412,7 +412,7 @@ function hsort(ra,n, l,j,ir,i,rra)
ra[i]=rra ra[i]=rra
} }
} }
# check if an array of indexes (sig[3]) arr[1],arr[2]..... # check if an array of indexes (sig[3]) arr[1],arr[2].....
# is contigous and decreeasing # is contigous and decreeasing
# 20140409 handle ascending order as well as descending # 20140409 handle ascending order as well as descending
function check2(arr,n ,decreasing,a,name,i,start,ok) function check2(arr,n ,decreasing,a,name,i,start,ok)

View File

@ -108,7 +108,7 @@ int global_verilog_netlist(int global, int alert) /* netlister driver */
/* top sch properties used for library use declarations and type definitions */ /* top sch properties used for library use declarations and type definitions */
/* to be printed before any entity declarations */ /* to be printed before any entity declarations */
my_snprintf(netl_filename, S(netl_filename), "%s/.%s_%d", my_snprintf(netl_filename, S(netl_filename), "%s/.%s_%d",
tclgetvar("netlist_dir"), get_cell(xctx->sch[xctx->currsch], 0),getpid()); tclgetvar("netlist_dir"), get_cell(xctx->sch[xctx->currsch], 0),getpid());
fd=fopen(netl_filename, "w"); fd=fopen(netl_filename, "w");
if(fd==NULL){ if(fd==NULL){
@ -136,7 +136,7 @@ int global_verilog_netlist(int global, int alert) /* netlister driver */
if( type && (strcmp(type,"timescale")==0 || strcmp(type,"verilog_preprocessor")==0) ) if( type && (strcmp(type,"timescale")==0 || strcmp(type,"verilog_preprocessor")==0) )
{ {
str_tmp = get_tok_value(xctx->sym[xctx->inst[i].ptr].prop_ptr , fmt_attr, 2); str_tmp = get_tok_value(xctx->sym[xctx->inst[i].ptr].prop_ptr , fmt_attr, 2);
if(!xctx->tok_size && strcmp(fmt_attr, "verilog_format")) if(!xctx->tok_size && strcmp(fmt_attr, "verilog_format"))
str_tmp = get_tok_value(xctx->sym[xctx->inst[i].ptr].prop_ptr, "verilog_format", 2); str_tmp = get_tok_value(xctx->sym[xctx->inst[i].ptr].prop_ptr, "verilog_format", 2);
my_strdup(_ALLOC_ID_, &tmp_string, str_tmp); my_strdup(_ALLOC_ID_, &tmp_string, str_tmp);
@ -487,15 +487,15 @@ int verilog_block_netlist(FILE *fd, int i, int alert)
if( type && ( strcmp(type,"timescale")==0 || strcmp(type,"verilog_preprocessor")==0) ) if( type && ( strcmp(type,"timescale")==0 || strcmp(type,"verilog_preprocessor")==0) )
{ {
str_tmp = get_tok_value(xctx->sym[xctx->inst[j].ptr].prop_ptr, fmt_attr, 2); str_tmp = get_tok_value(xctx->sym[xctx->inst[j].ptr].prop_ptr, fmt_attr, 2);
if(!xctx->tok_size && strcmp(fmt_attr, "verilog_format")) if(!xctx->tok_size && strcmp(fmt_attr, "verilog_format"))
str_tmp = get_tok_value(xctx->sym[xctx->inst[j].ptr].prop_ptr, "verilog_format", 2); str_tmp = get_tok_value(xctx->sym[xctx->inst[j].ptr].prop_ptr, "verilog_format", 2);
my_strdup(_ALLOC_ID_, &tmp_string, str_tmp); my_strdup(_ALLOC_ID_, &tmp_string, str_tmp);
fprintf(fd, "%s\n", str_tmp ? translate(j, tmp_string) : "<NULL>"); fprintf(fd, "%s\n", str_tmp ? translate(j, tmp_string) : "<NULL>");
} }
} }
my_strdup(_ALLOC_ID_, &verilogprefix,
my_strdup(_ALLOC_ID_, &verilogprefix,
get_tok_value(xctx->sym[i].prop_ptr, "verilogprefix", 0)); get_tok_value(xctx->sym[i].prop_ptr, "verilogprefix", 0));
if(verilogprefix) { if(verilogprefix) {
my_strdup(_ALLOC_ID_, &symname, verilogprefix); my_strdup(_ALLOC_ID_, &symname, verilogprefix);
@ -506,13 +506,13 @@ int verilog_block_netlist(FILE *fd, int i, int alert)
my_free(_ALLOC_ID_, &verilogprefix); my_free(_ALLOC_ID_, &verilogprefix);
fprintf(fd, "module %s (\n", sanitize(symname)); fprintf(fd, "module %s (\n", sanitize(symname));
my_free(_ALLOC_ID_, &symname); my_free(_ALLOC_ID_, &symname);
/*print_generic(fd, "entity", i); */ /*print_generic(fd, "entity", i); */
dbg(1, "verilog_block_netlist(): entity ports\n"); dbg(1, "verilog_block_netlist(): entity ports\n");
/* print port list */ /* print port list */
tmp=0; tmp=0;
for(j=0;j<xctx->sym[i].rects[PINLAYER]; ++j) for(j=0;j<xctx->sym[i].rects[PINLAYER]; ++j)
@ -527,7 +527,7 @@ int verilog_block_netlist(FILE *fd, int i, int alert)
} }
} }
int_hash_free(&table); int_hash_free(&table);
if(extra) { if(extra) {
for(extra_ptr = extra; ; extra_ptr=NULL) { for(extra_ptr = extra; ; extra_ptr=NULL) {
extra_token=my_strtok_r(extra_ptr, " ", "", 0, &saveptr1); extra_token=my_strtok_r(extra_ptr, " ", "", 0, &saveptr1);
@ -549,7 +549,7 @@ int verilog_block_netlist(FILE *fd, int i, int alert)
if(strboolcmp(get_tok_value(xctx->sym[i].rect[PINLAYER][j].prop_ptr,"verilog_ignore",0), "true")) { if(strboolcmp(get_tok_value(xctx->sym[i].rect[PINLAYER][j].prop_ptr,"verilog_ignore",0), "true")) {
my_strdup(_ALLOC_ID_, &sig_type,get_tok_value( my_strdup(_ALLOC_ID_, &sig_type,get_tok_value(
xctx->sym[i].rect[PINLAYER][j].prop_ptr,"verilog_type",0)); xctx->sym[i].rect[PINLAYER][j].prop_ptr,"verilog_type",0));
my_strdup(_ALLOC_ID_, &port_value, my_strdup(_ALLOC_ID_, &port_value,
get_tok_value(xctx->sym[i].rect[PINLAYER][j].prop_ptr,"value", 0) ); get_tok_value(xctx->sym[i].rect[PINLAYER][j].prop_ptr,"value", 0) );
my_strdup(_ALLOC_ID_, &dir_tmp, get_tok_value(xctx->sym[i].rect[PINLAYER][j].prop_ptr,"dir",0) ); my_strdup(_ALLOC_ID_, &dir_tmp, get_tok_value(xctx->sym[i].rect[PINLAYER][j].prop_ptr,"dir",0) );
if(strcmp(dir_tmp,"in")){ if(strcmp(dir_tmp,"in")){
@ -594,13 +594,13 @@ int verilog_block_netlist(FILE *fd, int i, int alert)
if(skip_instance(l, 1, lvs_ignore)) continue; if(skip_instance(l, 1, lvs_ignore)) continue;
if(xctx->netlist_count && if(xctx->netlist_count &&
!strboolcmp(get_tok_value(xctx->inst[l].prop_ptr, "only_toplevel", 0), "true")) continue; !strboolcmp(get_tok_value(xctx->inst[l].prop_ptr, "only_toplevel", 0), "true")) continue;
my_strdup(_ALLOC_ID_, &type,(xctx->inst[l].ptr+ xctx->sym)->type); my_strdup(_ALLOC_ID_, &type,(xctx->inst[l].ptr+ xctx->sym)->type);
if(type && !strcmp(type,"netlist_commands")) { if(type && !strcmp(type,"netlist_commands")) {
fprintf(fd, "%s\n", get_tok_value(xctx->inst[l].prop_ptr,"value", 0)); fprintf(fd, "%s\n", get_tok_value(xctx->inst[l].prop_ptr,"value", 0));
} }
} }
if(xctx->schverilogprop && xctx->schverilogprop[0]) { if(xctx->schverilogprop && xctx->schverilogprop[0]) {
fprintf(fd, "%s\n", xctx->schverilogprop); fprintf(fd, "%s\n", xctx->schverilogprop);
} }

View File

@ -1,22 +1,22 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
# #
# File: vhdl.awk # File: vhdl.awk
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2024 Stefan Frederik Schippers # Copyright (C) 1998-2024 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -130,14 +130,14 @@ primitive==1{primitive_line=primitive_line " " $0; next } # 20071217
component_name=$2 component_name=$2
no_print=1 no_print=1
} }
(component==1){ (component==1){
if($4==":=") $5=get_number($5) if($4==":=") $5=get_number($5)
if($5==":=") $6=get_number($6) if($5==":=") $6=get_number($6)
if($1 ~ /\[.*:.*\]/) if($1 ~ /\[.*:.*\]/)
{ {
arch_sig_name[component_name,$1]=s_b($1) # array used to compare arch_sig_name[component_name,$1]=s_b($1) # array used to compare
# actual ports in instances, if they match # actual ports in instances, if they match
# avoid indexes (to/downto) # avoid indexes (to/downto)
xx=s_i($1) xx=s_i($1)
@ -155,7 +155,7 @@ primitive==1{primitive_line=primitive_line " " $0; next } # 20071217
$4=vector_type xxx[1] " downto " xxx[2] ")" $4=vector_type xxx[1] " downto " xxx[2] ")"
else else
$4=vector_type xxx[1] " to " xxx[2] ")" $4=vector_type xxx[1] " to " xxx[2] ")"
$1=s_b($1) $1=s_b($1)
print " " $0 print " " $0
} }
else print $0 else print $0
@ -195,12 +195,12 @@ primitive==1{primitive_line=primitive_line " " $0; next } # 20071217
$1=s_b($1) $1=s_b($1)
print " " $0 print " " $0
} }
else print $0 else print $0
entity_ports[$1]=1 entity_ports[$1]=1
if($1=="end" && $2==entity_name) entity=0 if($1=="end" && $2==entity_name) entity=0
no_print=1 no_print=1
} }
#### BEGIN RESOLVE SIGNALS #### BEGIN RESOLVE SIGNALS
@ -216,10 +216,10 @@ primitive==1{primitive_line=primitive_line " " $0; next } # 20071217
# omit bit ranges ( CNT => CNT(3 downto 0) --> CNT => CNT ) # omit bit ranges ( CNT => CNT(3 downto 0) --> CNT => CNT )
print $0 print $0
no_print=1 no_print=1
} }
/^[ \t]*(signal|constant|variable)[ \t]+/{ ### dangerous <<< 07062002 added "variable" /^[ \t]*(signal|constant|variable)[ \t]+/{ ### dangerous <<< 07062002 added "variable"
if( $NF ~ /\[[^:,]+:[^:,]+\]$/) # 09112003, corrected to recognize only XXX[3:1] and not XXX[3:1],AA[3] if( $NF ~ /\[[^:,]+:[^:,]+\]$/) # 09112003, corrected to recognize only XXX[3:1] and not XXX[3:1],AA[3]
{ {
up=$NF up=$NF
@ -285,7 +285,7 @@ primitive==1{primitive_line=primitive_line " " $0; next } # 20071217
{ {
i = arch_signal_num[ii] i = arch_signal_num[ii]
## 04062002 don't add _vector if user defined type ## 04062002 don't add _vector if user defined type
if(arch_sig_type_array[i] ~ /^(boolean|bit|real|std_logic|integer)$/) if(arch_sig_type_array[i] ~ /^(boolean|bit|real|std_logic|integer)$/)
vector_type=arch_sig_type_array[i] "_vector (" vector_type=arch_sig_type_array[i] "_vector ("
else else
vector_type=arch_sig_type_array[i] " (" vector_type=arch_sig_type_array[i] " ("
@ -294,22 +294,22 @@ primitive==1{primitive_line=primitive_line " " $0; next } # 20071217
hsort(tmp, n) hsort(tmp, n)
if(n>1 || (arch_index_array[i] !~ /no_index/) ) #11092003 if not no_index treat as a bus if(n>1 || (arch_index_array[i] !~ /no_index/) ) #11092003 if not no_index treat as a bus
{ {
if(check(tmp,n)) if(check(tmp,n))
{ {
if(arch_signal_dir[i] == " downto ") if(arch_signal_dir[i] == " downto ")
{ {
arch_sig_name[entity_name, i "[" tmp[1] ":" tmp[n] "]"]=i arch_sig_name[entity_name, i "[" tmp[1] ":" tmp[n] "]"]=i
printf "%s",arch_signal_class[i] " " i " : " vector_type tmp[1] " downto " tmp[n] ")" #04062002 printf "%s",arch_signal_class[i] " " i " : " vector_type tmp[1] " downto " tmp[n] ")" #04062002
} }
else else
{ {
arch_sig_name[entity_name, i "[" tmp[n] ":" tmp[1] "]"]=i arch_sig_name[entity_name, i "[" tmp[n] ":" tmp[1] "]"]=i
printf "%s",arch_signal_class[i] " " i " : " vector_type tmp[n] " to " tmp[1] ")" #04062002 printf "%s",arch_signal_class[i] " " i " : " vector_type tmp[n] " to " tmp[1] ")" #04062002
} }
} }
else print "\n**** ERROR >>>> " i " non contigous bus ->" n, "|" arch_index_array[i] "|" else print "\n**** ERROR >>>> " i " non contigous bus ->" n, "|" arch_index_array[i] "|"
} }
else else
{ {
# we do not declare parametrized subranges as normally will result in redeclaration # we do not declare parametrized subranges as normally will result in redeclaration
# of a port signal # of a port signal
@ -328,7 +328,7 @@ primitive==1{primitive_line=primitive_line " " $0; next } # 20071217
printf "%s",arch_signal_class[i] " " basename " : " vector_type range #04062002 printf "%s",arch_signal_class[i] " " basename " : " vector_type range #04062002
} }
else continue else continue
} }
else else
printf "%s",arch_signal_class[i] " " i " : " arch_sig_type_array[i] printf "%s",arch_signal_class[i] " " i " : " arch_sig_type_array[i]
} }
@ -339,7 +339,7 @@ primitive==1{primitive_line=primitive_line " " $0; next } # 20071217
# if(tolower(arch_sig_type_array[i]) ~ /vector/) sep="\"" # if(tolower(arch_sig_type_array[i]) ~ /vector/) sep="\""
if(n>1 || (arch_index_array[i] !~ /no_index/) ) sep="\"" if(n>1 || (arch_index_array[i] !~ /no_index/) ) sep="\""
else sep = "'" else sep = "'"
if( arch_value_array[i] !~ sep) if( arch_value_array[i] !~ sep)
arch_value_array[i] = sep arch_value_array[i] sep arch_value_array[i] = sep arch_value_array[i] sep
} }
printf "%s"," := " arch_value_array[i] printf "%s"," := " arch_value_array[i]
@ -373,7 +373,7 @@ primitive==1{primitive_line=primitive_line " " $0; next } # 20071217
actual_port_mult=split(inst_actual_port[j],actual_port_array,",") actual_port_mult=split(inst_actual_port[j],actual_port_array,",")
} }
else { else {
actual_port_mult=1 actual_port_mult=1
actual_port_array[1]=inst_actual_port[j] actual_port_array[1]=inst_actual_port[j]
} }
ck2[j] = check2(actual_port_array,actual_port_mult) ck2[j] = check2(actual_port_array,actual_port_mult)
@ -392,21 +392,21 @@ primitive==1{primitive_line=primitive_line " " $0; next } # 20071217
actual_port_mult=split(inst_actual_port[j],actual_port_array,",") actual_port_mult=split(inst_actual_port[j],actual_port_array,",")
} }
else { else {
actual_port_mult=1 actual_port_mult=1
actual_port_array[1]=inst_actual_port[j] actual_port_array[1]=inst_actual_port[j]
} }
# force to actual multiplicty unresolved (due to params) symbol pin multiplicity # force to actual multiplicty unresolved (due to params) symbol pin multiplicity
parametrized_formal_range=0 # 20100408 parametrized_formal_range=0 # 20100408
if(inst_formal_port_mult[j]<0) { if(inst_formal_port_mult[j]<0) {
parametrized_formal_range=1 # 20100408 parametrized_formal_range=1 # 20100408
inst_formal_port_mult[j] = actual_port_mult inst_formal_port_mult[j] = actual_port_mult
inst_formal_up[j] = actual_port_mult -1 #assume inst_formal_low=0 in case of parametrized vector port... inst_formal_up[j] = actual_port_mult -1 #assume inst_formal_low=0 in case of parametrized vector port...
} }
a=((i-1)*inst_formal_port_mult[j]) % actual_port_mult+1 a=((i-1)*inst_formal_port_mult[j]) % actual_port_mult+1
b=(-1+i*inst_formal_port_mult[j]) % actual_port_mult+1 b=(-1+i*inst_formal_port_mult[j]) % actual_port_mult+1
#print "\n-- a=" a " b=" b " formal port mult=" inst_formal_port_mult[j] #print "\n-- a=" a " b=" b " formal port mult=" inst_formal_port_mult[j]
if(j>0 && j!=g) printf " ,\n" if(j>0 && j!=g) printf " ,\n"
else if(j>0) printf "\n" else if(j>0) printf "\n"
if(inst_formal_port_mult[j]>1 && actual_port_mult>1 && ck2[j]) { if(inst_formal_port_mult[j]>1 && actual_port_mult>1 && ck2[j]) {
@ -438,13 +438,13 @@ primitive==1{primitive_line=primitive_line " " $0; next } # 20071217
# 20100408 if formal range contains generic and actual port width is 1 specify formal bit index in assignment # 20100408 if formal range contains generic and actual port width is 1 specify formal bit index in assignment
if( (parametrized_formal_range || (inst_formal_port_mult[j]>1)) && actual_port_mult==1) { if( (parametrized_formal_range || (inst_formal_port_mult[j]>1)) && actual_port_mult==1) {
# patch for single bit actual port # patch for single bit actual port
# assigned on vector formal port 23112002 # assigned on vector formal port 23112002
# 20170920 # 20170920
if( parametrized_formal_range && inst_actual_port[j] ~/\[.*:.*\]/) { if( parametrized_formal_range && inst_actual_port[j] ~/\[.*:.*\]/) {
printf "%s"," " inst_formal_port[j] " => " get_number(actual_port) printf "%s"," " inst_formal_port[j] " => " get_number(actual_port)
} else } else
# /20170920 # /20170920
for(num=inst_formal_low[j]; ; num+=sign(inst_formal_up[j] - inst_formal_low[j])) { for(num=inst_formal_low[j]; ; num+=sign(inst_formal_up[j] - inst_formal_low[j])) {
if(num !=inst_formal_low[j]) printf " ,\n" if(num !=inst_formal_low[j]) printf " ,\n"
@ -459,7 +459,7 @@ primitive==1{primitive_line=primitive_line " " $0; next } # 20071217
formal_index= (inst_formal_up[j] >= inst_formal_low[j]) ? \ formal_index= (inst_formal_up[j] >= inst_formal_low[j]) ? \
remainder(inst_formal_up[j]-num+1+inst_formal_low[j], inst_formal_port_mult[j]) + inst_formal_low[j]: \ remainder(inst_formal_up[j]-num+1+inst_formal_low[j], inst_formal_port_mult[j]) + inst_formal_low[j]: \
remainder(inst_formal_up[j]+num-1+inst_formal_up[j] , inst_formal_port_mult[j]) + inst_formal_up[j] remainder(inst_formal_up[j]+num-1+inst_formal_up[j] , inst_formal_port_mult[j]) + inst_formal_up[j]
if(num !=a) printf " ,\n" if(num !=a) printf " ,\n"
#07062002 aggiunto get_number x generici #07062002 aggiunto get_number x generici
printf "%s"," " inst_formal_port[j] "(" formal_index ") => " to_round_brackets(get_number(actual_port_array[num])) printf "%s"," " inst_formal_port[j] "(" formal_index ") => " to_round_brackets(get_number(actual_port_array[num]))
@ -487,7 +487,7 @@ primitive==1{primitive_line=primitive_line " " $0; next } # 20071217
sub(/^.*:/,"",index_low) sub(/^.*:/,"",index_low)
sub(/\].*$/,"",index_low) sub(/\].*$/,"",index_low)
if( (index_up !~/^[0-9]+$/) || (index_low !~/^[0-9]+$/) ) { if( (index_up !~/^[0-9]+$/) || (index_low !~/^[0-9]+$/) ) {
inst_formal_port_mult[p]=-1 # component port index contains parameter, multiplicity cant be resolved inst_formal_port_mult[p]=-1 # component port index contains parameter, multiplicity cant be resolved
inst_formal_up[p]=0 inst_formal_up[p]=0
inst_formal_low[p]=0 inst_formal_low[p]=0
} }
@ -495,7 +495,7 @@ primitive==1{primitive_line=primitive_line " " $0; next } # 20071217
inst_formal_port_mult[p] = abs(index_up - index_low) + 1 inst_formal_port_mult[p] = abs(index_up - index_low) + 1
inst_formal_up[p]=index_up inst_formal_up[p]=index_up
inst_formal_low[p]=index_low inst_formal_low[p]=index_low
#print "--port assignment: port " s_b($1) " formal idx hi=" index_up " lo=" index_low #print "--port assignment: port " s_b($1) " formal idx hi=" index_up " lo=" index_low
} }
} }
else { else {
@ -503,7 +503,7 @@ primitive==1{primitive_line=primitive_line " " $0; next } # 20071217
inst_formal_up[p]=0 inst_formal_up[p]=0
inst_formal_low[p]=0 inst_formal_low[p]=0
} }
# if formal port = a[2:2] translate as a(2) # if formal port = a[2:2] translate as a(2)
if(index_up == index_low && $1 ~ /\[.*:.*\]/) if(index_up == index_low && $1 ~ /\[.*:.*\]/)
inst_formal_port[p] = s_b($1) "(" index_up ")" inst_formal_port[p] = s_b($1) "(" index_up ")"
else else
@ -522,7 +522,7 @@ primitive==1{primitive_line=primitive_line " " $0; next } # 20071217
port_map=1 port_map=1
no_print=1 no_print=1
} }
/^port map/{ /^port map/{
if(!port_map){ if(!port_map){
@ -553,9 +553,9 @@ function remainder(n,div, x) {
x=n%div x=n%div
if(x<o) return x+div if(x<o) return x+div
return x return x
} }
function abs(x) function abs(x)
{ {
if(x+0<0) return -x if(x+0<0) return -x
else return x else return x
@ -618,13 +618,13 @@ function check(arr,n ,i,start,ok)
return 1 return 1
} }
# check if an array of indexes (sig[3]) arr[1],arr[2]..... # check if an array of indexes (sig[3]) arr[1],arr[2].....
# is contigous and decreeasing # is contigous and decreeasing
function check2(arr,n ,a,name,i,start,ok) function check2(arr,n ,a,name,i,start,ok)
{ {
name=s_b(arr[1]) name=s_b(arr[1])
start=s_i(arr[1]) start=s_i(arr[1])
if(arr[1] !~ /[0-9]+/) if(arr[1] !~ /[0-9]+/)
{ {
if(n>1) return 0 if(n>1) return 0
else return 1 else return 1
@ -645,7 +645,7 @@ function check2(arr,n ,a,name,i,start,ok)
} }
return 1 return 1
} }
function s_i(a) function s_i(a)
{ {
sub(/.*\[/,"",a) sub(/.*\[/,"",a)
@ -701,24 +701,24 @@ function compact_pinlist(pin, dir ,i,ii,base,curr,curr_n,np)
delete pin_ret delete pin_ret
delete net_ret delete net_ret
delete dir_ret delete dir_ret
np=pin["n"] np=pin["n"]
if(np) { if(np) {
ii=1 ii=1
for(i=1;i<=np;i++) { for(i=1;i<=np;i++) {
base =s_b( pin[i] ) base =s_b( pin[i] )
if(i==1) {curr=base; curr_n=i} if(i==1) {curr=base; curr_n=i}
else { else {
if(base != curr) { if(base != curr) {
pin_ret[ii] = compact_label(pin,curr_n,i-1) pin_ret[ii] = compact_label(pin,curr_n,i-1)
dir_ret[ii] = dir[i-1] dir_ret[ii] = dir[i-1]
ii++ ii++
curr=base;curr_n=i curr=base;curr_n=i
} }
} }
} }
pin_ret[ii] = compact_label(pin,curr_n,np) pin_ret[ii] = compact_label(pin,curr_n,np)
dir_ret[ii] = dir[np] dir_ret[ii] = dir[np]
pin_ret["n"] = dir_ret["n"] = ii pin_ret["n"] = dir_ret["n"] = ii
} }
} }
@ -737,10 +737,10 @@ function compact_label(ar,a,b, ret,start,i)
else {ret = ret ar[i-1] ","; start=i } else {ret = ret ar[i-1] ","; start=i }
} }
} }
else if(s_b(ar[i])!=s_b(ar[i-1]) || else if(s_b(ar[i])!=s_b(ar[i-1]) ||
( lab_index(ar[i]) != lab_index(ar[i-1])-1 && ( lab_index(ar[i]) != lab_index(ar[i-1])-1 &&
lab_index(ar[i]) != lab_index(ar[i-1])+1) ) { lab_index(ar[i]) != lab_index(ar[i-1])+1) ) {
if(start<i-1) if(start<i-1)
ret = ret s_b(ar[start]) "[" lab_index(ar[start]) ":" lab_index(ar[i-1]) "]," ret = ret s_b(ar[start]) "[" lab_index(ar[start]) ":" lab_index(ar[i-1]) "],"
else else
ret = ret s_b(ar[start]) "[" lab_index(ar[start]) "]," ret = ret s_b(ar[start]) "[" lab_index(ar[start]) "],"
@ -752,7 +752,7 @@ function compact_label(ar,a,b, ret,start,i)
if(start < b) ret = ret (b-start+1) "*" ar[b] if(start < b) ret = ret (b-start+1) "*" ar[b]
else ret = ret ar[b] else ret = ret ar[b]
} }
else if(start<b) else if(start<b)
ret = ret s_b(ar[start]) "[" lab_index(ar[start]) ":" lab_index(ar[b]) "]" ret = ret s_b(ar[start]) "[" lab_index(ar[start]) ":" lab_index(ar[b]) "]"
else else
ret = ret s_b(ar[b]) "[" lab_index(ar[b]) "]" ret = ret s_b(ar[b]) "[" lab_index(ar[b]) "]"

View File

@ -134,7 +134,7 @@ int global_vhdl_netlist(int global, int alert) /* netlister driver */
xctx->netlist_count=0; xctx->netlist_count=0;
str_hash_init(&subckt_table, HASHSIZE); str_hash_init(&subckt_table, HASHSIZE);
my_snprintf(netl_filename, S(netl_filename), "%s/.%s_%d", my_snprintf(netl_filename, S(netl_filename), "%s/.%s_%d",
tclgetvar("netlist_dir"), get_cell(xctx->sch[xctx->currsch], 0), getpid()); tclgetvar("netlist_dir"), get_cell(xctx->sch[xctx->currsch], 0), getpid());
fd=fopen(netl_filename, "w"); fd=fopen(netl_filename, "w");
@ -569,7 +569,7 @@ int vhdl_block_netlist(FILE *fd, int i, int alert)
if( !strcmp((xctx->inst[l].ptr+ xctx->sym)->type, "package") ) if( !strcmp((xctx->inst[l].ptr+ xctx->sym)->type, "package") )
fprintf(fd, "%s\n", xctx->inst[l].prop_ptr); fprintf(fd, "%s\n", xctx->inst[l].prop_ptr);
} }
dbg(1, "vhdl_block_netlist(): use statements\n"); dbg(1, "vhdl_block_netlist(): use statements\n");
for(l=0;l<xctx->instances; ++l) for(l=0;l<xctx->instances; ++l)
{ {
@ -578,11 +578,11 @@ int vhdl_block_netlist(FILE *fd, int i, int alert)
if( !strcmp((xctx->inst[l].ptr+ xctx->sym)->type, "use") ) if( !strcmp((xctx->inst[l].ptr+ xctx->sym)->type, "use") )
fprintf(fd, "%s\n", xctx->inst[l].prop_ptr); fprintf(fd, "%s\n", xctx->inst[l].prop_ptr);
} }
dbg(1, "vhdl_block_netlist(): entity generics\n"); dbg(1, "vhdl_block_netlist(): entity generics\n");
/* print entity generics */ /* print entity generics */
print_generic(fd, "entity", i); print_generic(fd, "entity", i);
dbg(1, "vhdl_block_netlist(): entity ports\n"); dbg(1, "vhdl_block_netlist(): entity ports\n");
/* print entity ports */ /* print entity ports */
tmp=0; tmp=0;
@ -611,7 +611,7 @@ int vhdl_block_netlist(FILE *fd, int i, int alert)
} }
int_hash_free(&table); int_hash_free(&table);
if(tmp) fprintf(fd, "\n);\n"); if(tmp) fprintf(fd, "\n);\n");
dbg(1, "vhdl_block_netlist(): port attributes\n"); dbg(1, "vhdl_block_netlist(): port attributes\n");
for(l=0;l<xctx->instances; ++l) for(l=0;l<xctx->instances; ++l)
{ {
@ -623,14 +623,14 @@ int vhdl_block_netlist(FILE *fd, int i, int alert)
} }
} }
fprintf(fd,"end %s ;\n\n", get_cell(sanitize(xctx->sym[i].name), 0) ); fprintf(fd,"end %s ;\n\n", get_cell(sanitize(xctx->sym[i].name), 0) );
dbg(1, "vhdl_block_netlist(): architecture\n"); dbg(1, "vhdl_block_netlist(): architecture\n");
fprintf(fd,"architecture arch_%s of %s is\n\n", fprintf(fd,"architecture arch_%s of %s is\n\n",
get_cell(sanitize(xctx->sym[i].name), 0), get_cell(sanitize(xctx->sym[i].name), 0),
get_cell(sanitize(xctx->sym[i].name), 0) ); get_cell(sanitize(xctx->sym[i].name), 0) );
/* get_cell( xctx->sch[xctx->currsch], 0), get_cell( xctx->sch[xctx->currsch], 0)); */ /* get_cell( xctx->sch[xctx->currsch], 0), get_cell( xctx->sch[xctx->currsch], 0)); */
/* load current schematic to print used components */ /* load current schematic to print used components */
dbg(1, "vhdl_block_netlist(): used components\n"); dbg(1, "vhdl_block_netlist(): used components\n");
/* print all components */ /* print all components */
if(!vhdl_stop) { if(!vhdl_stop) {
@ -642,14 +642,14 @@ int vhdl_block_netlist(FILE *fd, int i, int alert)
default_schematic = get_tok_value(xctx->sym[i].prop_ptr, "default_schematic", 0); default_schematic = get_tok_value(xctx->sym[i].prop_ptr, "default_schematic", 0);
if(!strcmp(default_schematic, "ignore")) continue; if(!strcmp(default_schematic, "ignore")) continue;
if(!xctx->sym[j].type || (strcmp(xctx->sym[j].type,"primitive")!=0 && if(!xctx->sym[j].type || (strcmp(xctx->sym[j].type,"primitive")!=0 &&
strcmp(xctx->sym[j].type,"subcircuit")!=0)) strcmp(xctx->sym[j].type,"subcircuit")!=0))
continue; continue;
my_strdup2(_ALLOC_ID_, &abs_path, abs_sym_path(xctx->sym[i].name, "")); my_strdup2(_ALLOC_ID_, &abs_path, abs_sym_path(xctx->sym[i].name, ""));
if(( strcmp(xctx->sym[j].type,"subcircuit")==0 || strcmp(xctx->sym[j].type,"primitive")==0) && if(( strcmp(xctx->sym[j].type,"subcircuit")==0 || strcmp(xctx->sym[j].type,"primitive")==0) &&
check_lib(1, abs_path) check_lib(1, abs_path)
) { ) {
/* only print component declaration if used in current subcircuit */ /* only print component declaration if used in current subcircuit */
found=0; found=0;
for(l=0;l<xctx->instances; ++l) for(l=0;l<xctx->instances; ++l)
@ -673,7 +673,7 @@ int vhdl_block_netlist(FILE *fd, int i, int alert)
get_tok_value( xctx->sym[j].rect[PINLAYER][k].prop_ptr,"sig_type",0)); get_tok_value( xctx->sym[j].rect[PINLAYER][k].prop_ptr,"sig_type",0));
my_strdup(_ALLOC_ID_, &port_value, my_strdup(_ALLOC_ID_, &port_value,
get_tok_value(xctx->sym[j].rect[PINLAYER][k].prop_ptr,"value", 0) ); get_tok_value(xctx->sym[j].rect[PINLAYER][k].prop_ptr,"value", 0) );
if(!sig_type || sig_type[0]=='\0') my_strdup(_ALLOC_ID_, &sig_type,"std_logic"); if(!sig_type || sig_type[0]=='\0') my_strdup(_ALLOC_ID_, &sig_type,"std_logic");
my_strdup(_ALLOC_ID_, &dir_tmp, get_tok_value(xctx->sym[j].rect[PINLAYER][k].prop_ptr,"dir",0) ); my_strdup(_ALLOC_ID_, &dir_tmp, get_tok_value(xctx->sym[j].rect[PINLAYER][k].prop_ptr,"dir",0) );
str_tmp = get_tok_value(xctx->sym[j].rect[PINLAYER][k].prop_ptr,"name",0); str_tmp = get_tok_value(xctx->sym[j].rect[PINLAYER][k].prop_ptr,"name",0);
@ -698,18 +698,18 @@ int vhdl_block_netlist(FILE *fd, int i, int alert)
dbg(1, "vhdl_block_netlist(): netlisting %s\n", get_cell( xctx->sch[xctx->currsch], 0)); dbg(1, "vhdl_block_netlist(): netlisting %s\n", get_cell( xctx->sch[xctx->currsch], 0));
err |= vhdl_netlist(fd, vhdl_stop); err |= vhdl_netlist(fd, vhdl_stop);
fprintf(fd,"//// begin user architecture code\n"); fprintf(fd,"//// begin user architecture code\n");
for(l=0;l<xctx->instances; ++l) { for(l=0;l<xctx->instances; ++l) {
if(skip_instance(l, 1, lvs_ignore)) continue; if(skip_instance(l, 1, lvs_ignore)) continue;
if(xctx->netlist_count && if(xctx->netlist_count &&
!strboolcmp(get_tok_value(xctx->inst[l].prop_ptr, "only_toplevel", 0), "true")) continue; !strboolcmp(get_tok_value(xctx->inst[l].prop_ptr, "only_toplevel", 0), "true")) continue;
my_strdup(_ALLOC_ID_, &type,(xctx->inst[l].ptr+ xctx->sym)->type); my_strdup(_ALLOC_ID_, &type,(xctx->inst[l].ptr+ xctx->sym)->type);
if(type && !strcmp(type,"netlist_commands")) { if(type && !strcmp(type,"netlist_commands")) {
fprintf(fd, "%s\n", get_tok_value(xctx->inst[l].prop_ptr,"value", 0)); fprintf(fd, "%s\n", get_tok_value(xctx->inst[l].prop_ptr,"value", 0));
} }
} }
if(xctx->schvhdlprop && xctx->schvhdlprop[0]) fprintf(fd, "%s\n", xctx->schvhdlprop); if(xctx->schvhdlprop && xctx->schvhdlprop[0]) fprintf(fd, "%s\n", xctx->schvhdlprop);
fprintf(fd, "end arch_%s ;\n\n", get_cell(sanitize(xctx->sym[i].name), 0) ); fprintf(fd, "end arch_%s ;\n\n", get_cell(sanitize(xctx->sym[i].name), 0) );
my_free(_ALLOC_ID_, &sig_type); my_free(_ALLOC_ID_, &sig_type);

View File

@ -91,16 +91,16 @@ Xschem_ctx **get_save_xctx(void)
* window_path[1] = .x3.drw * window_path[1] = .x3.drw
* window_path[2] = .x4.drw * window_path[2] = .x4.drw
* ... * ...
*/ */
char *get_window_path(int i) char *get_window_path(int i)
{ {
return window_path[i]; return window_path[i];
} }
Xschem_ctx *get_old_xctx(void) Xschem_ctx *get_old_xctx(void)
{ {
return old_xctx; return old_xctx;
} }
int get_last_created_window(void) int get_last_created_window(void)
@ -344,7 +344,7 @@ void init_pixdata()/* populate xctx->fill_type array that is used in create_gc()
const char *tclpixdata; const char *tclpixdata;
const char *tclword; const char *tclword;
int found_data; int found_data;
for(i=0;i<cadlayers; ++i) { for(i=0;i<cadlayers; ++i) {
tclpixdata = Tcl_GetVar2(interp, "pixdata", my_itoa(i), TCL_GLOBAL_ONLY); tclpixdata = Tcl_GetVar2(interp, "pixdata", my_itoa(i), TCL_GLOBAL_ONLY);
dbg(1, "pixdata(%d)=%s\n", i, tclpixdata); dbg(1, "pixdata(%d)=%s\n", i, tclpixdata);
@ -423,7 +423,7 @@ static void free_xschem_data()
if(xctx->hier_attr[i].symname) my_free(_ALLOC_ID_, &xctx->hier_attr[i].symname); if(xctx->hier_attr[i].symname) my_free(_ALLOC_ID_, &xctx->hier_attr[i].symname);
if(xctx->hier_attr[i].sym_extra) my_free(_ALLOC_ID_, &xctx->hier_attr[i].sym_extra); if(xctx->hier_attr[i].sym_extra) my_free(_ALLOC_ID_, &xctx->hier_attr[i].sym_extra);
} }
my_free(_ALLOC_ID_, &xctx->gridpoint); my_free(_ALLOC_ID_, &xctx->gridpoint);
my_free(_ALLOC_ID_, &xctx->biggridpoint); my_free(_ALLOC_ID_, &xctx->biggridpoint);
my_free(_ALLOC_ID_, &xctx->gc); my_free(_ALLOC_ID_, &xctx->gc);
@ -725,7 +725,7 @@ static void delete_schematic_data(int delete_pixmap)
{ {
dbg(1, "delete_schematic_data()\n"); dbg(1, "delete_schematic_data()\n");
unselect_all(1); unselect_all(1);
/* clear static data in get_tok_value() must be done after unselect_all(1) /* clear static data in get_tok_value() must be done after unselect_all(1)
* as this functions re-uses get_tok_value() */ * as this functions re-uses get_tok_value() */
parse_cmd_string(NULL, NULL); /* clear static data in function */ parse_cmd_string(NULL, NULL); /* clear static data in function */
get_tok_value(NULL, NULL, 0); /* clear static data in function */ get_tok_value(NULL, NULL, 0); /* clear static data in function */
@ -738,7 +738,7 @@ static void delete_schematic_data(int delete_pixmap)
resetwin(0, 1, 1, 0, 0); /* delete preview pixmap, delete cairo surfaces */ resetwin(0, 1, 1, 0, 0); /* delete preview pixmap, delete cairo surfaces */
if(has_x) free_gc(); if(has_x) free_gc();
} }
/* delete instances, wires, lines, rects, arcs, polys, texts, hash_inst, hash_wire, /* delete instances, wires, lines, rects, arcs, polys, texts, hash_inst, hash_wire,
* inst & wire .node fields, instance name hash */ * inst & wire .node fields, instance name hash */
remove_symbols(); remove_symbols();
str_replace(NULL, NULL, NULL, 0, -1); str_replace(NULL, NULL, NULL, 0, -1);
@ -784,7 +784,7 @@ int compare_schematics(const char *f)
l = 1024 + strlen(xctx->inst[i].prop_ptr ? xctx->inst[i].prop_ptr : ""); l = 1024 + strlen(xctx->inst[i].prop_ptr ? xctx->inst[i].prop_ptr : "");
my_realloc(_ALLOC_ID_, &s, l); my_realloc(_ALLOC_ID_, &s, l);
my_snprintf(s, l, "C %s %g %g %d %d %s", tcl_hook2(xctx->inst[i].name), my_snprintf(s, l, "C %s %g %g %d %d %s", tcl_hook2(xctx->inst[i].name),
xctx->inst[i].x0, xctx->inst[i].y0, xctx->inst[i].rot, xctx->inst[i].flip, xctx->inst[i].x0, xctx->inst[i].y0, xctx->inst[i].rot, xctx->inst[i].flip,
xctx->inst[i].prop_ptr ? xctx->inst[i].prop_ptr : ""); xctx->inst[i].prop_ptr ? xctx->inst[i].prop_ptr : "");
int_hash_lookup(&table1, s, i, XINSERT_NOREPLACE); int_hash_lookup(&table1, s, i, XINSERT_NOREPLACE);
} }
@ -800,10 +800,10 @@ int compare_schematics(const char *f)
/* save old xctx and create new xctx for compare schematic */ /* save old xctx and create new xctx for compare schematic */
save_xctx = xctx; save_xctx = xctx;
xctx = NULL; xctx = NULL;
alloc_xschem_data("", ".drw"); alloc_xschem_data("", ".drw");
xctx->netlist_type = CAD_SPICE_NETLIST; xctx->netlist_type = CAD_SPICE_NETLIST;
tclsetvar("netlist_type","spice"); tclsetvar("netlist_type","spice");
init_pixdata(); /* populate xctx->fill_type array that is used in create_gc() to set fill styles */ init_pixdata(); /* populate xctx->fill_type array that is used in create_gc() to set fill styles */
/* draw in same window */ /* draw in same window */
xctx->window = save_xctx->window; xctx->window = save_xctx->window;
@ -846,7 +846,7 @@ int compare_schematics(const char *f)
l = 1024 + strlen(xctx->inst[i].prop_ptr ? xctx->inst[i].prop_ptr : ""); l = 1024 + strlen(xctx->inst[i].prop_ptr ? xctx->inst[i].prop_ptr : "");
my_realloc(_ALLOC_ID_, &s, l); my_realloc(_ALLOC_ID_, &s, l);
my_snprintf(s, l, "C %s %g %g %d %d %s", tcl_hook2(xctx->inst[i].name), my_snprintf(s, l, "C %s %g %g %d %d %s", tcl_hook2(xctx->inst[i].name),
xctx->inst[i].x0, xctx->inst[i].y0, xctx->inst[i].rot, xctx->inst[i].flip, xctx->inst[i].x0, xctx->inst[i].y0, xctx->inst[i].rot, xctx->inst[i].flip,
xctx->inst[i].prop_ptr ? xctx->inst[i].prop_ptr : ""); xctx->inst[i].prop_ptr ? xctx->inst[i].prop_ptr : "");
int_hash_lookup(&table2, s, i, XINSERT_NOREPLACE); int_hash_lookup(&table2, s, i, XINSERT_NOREPLACE);
found = int_hash_lookup(&table1, s, i, XLOOKUP); found = int_hash_lookup(&table1, s, i, XLOOKUP);
@ -1002,21 +1002,21 @@ static void xwin_exit(void)
} }
/* /*
* color structures in xschem: * color structures in xschem:
* - char *xctx->color_array[]: * - char *xctx->color_array[]:
* array of color character names ("#xxxxxx" hex) indexed by xschem layer number. * array of color character names ("#xxxxxx" hex) indexed by xschem layer number.
* these are set from tcl 'color' list variable in init_color_array() * these are set from tcl 'color' list variable in init_color_array()
* - unsigned int xctx->color_index[]: * - unsigned int xctx->color_index[]:
* array of integers, pixel values, color lookup table, indexed by xschem layer num. * array of integers, pixel values, color lookup table, indexed by xschem layer num.
* this array is initialized in build_colors() by calling find_best_color() * this array is initialized in build_colors() by calling find_best_color()
* indexes are returned from XAllocNamedColor() * indexes are returned from XAllocNamedColor()
* these are used in XSetForeground and XSetBackground calls: * these are used in XSetForeground and XSetBackground calls:
* XSetForeground(display, gc, xctx->color_index[i]) * XSetForeground(display, gc, xctx->color_index[i])
* - XColor xctx->xcolor_array[]: * - XColor xctx->xcolor_array[]:
* array of 256 XColor structures: * array of 256 XColor structures:
* typedef struct { * typedef struct {
* unsigned long pixel; // pixel value * unsigned long pixel; // pixel value
* unsigned short red, green, blue; // rgb values * unsigned short red, green, blue; // rgb values
* char flags; // DoRed, DoGreen, DoBlue * char flags; // DoRed, DoGreen, DoBlue
* char pad; * char pad;
@ -1184,7 +1184,7 @@ void toggle_fullscreen(const char *topwin)
} else { } else {
xctx->pending_fullzoom=1; xctx->pending_fullzoom=1;
window_state(display , parent_id,normal); /* normal view */ window_state(display , parent_id,normal); /* normal view */
/* when switching back from fullscreen multiple ConfigureNotify events are generated. /* when switching back from fullscreen multiple ConfigureNotify events are generated.
* pending_fullzoom does not work on the last correct ConfigureNotify event, * pending_fullzoom does not work on the last correct ConfigureNotify event,
* so we zoom_full() again */ * so we zoom_full() again */
} }
@ -1202,7 +1202,7 @@ static int source_tcl_file(char *s)
{ {
char tmp[1024]; char tmp[1024];
if(Tcl_EvalFile(interp, s)==TCL_ERROR) { if(Tcl_EvalFile(interp, s)==TCL_ERROR) {
fprintf(errfp, "Tcl_AppInit() error: can not execute %s, please fix:\n", s); fprintf(errfp, "Tcl_AppInit() error: can not execute %s, please fix:\n", s);
fprintf(errfp, "%s", tclresult()); fprintf(errfp, "%s", tclresult());
#if TCL_MAJOR_VERSION >= 8 && TCL_MINOR_VERSION >=6 #if TCL_MAJOR_VERSION >= 8 && TCL_MINOR_VERSION >=6
@ -1244,7 +1244,7 @@ int preview_window(const char *what, const char *win_path, const char *fname)
* and an Expose event calls another preview draw */ * and an Expose event calls another preview draw */
if(semaphore) return 0; if(semaphore) return 0;
++semaphore; ++semaphore;
dbg(1, "preview_window(): what=%s, win_path=%s, fname=%s\n", dbg(1, "preview_window(): what=%s, win_path=%s, fname=%s\n",
what, win_path ? win_path : "<NULL>", fname ? fname : "<NULL>"); what, win_path ? win_path : "<NULL>", fname ? fname : "<NULL>");
dbg(1, "------\n"); dbg(1, "------\n");
if(!strcmp(what, "create") && last_preview < 4) { if(!strcmp(what, "create") && last_preview < 4) {
@ -1274,7 +1274,7 @@ int preview_window(const char *what, const char *win_path, const char *fname)
if(i < 10) { if(i < 10) {
save_xctx = xctx; /* save current schematic */ save_xctx = xctx; /* save current schematic */
xctx = preview_xctx[i]; xctx = preview_xctx[i];
if(fname && fname[0] && (!current_file[i] || strcmp(fname, current_file[i])) ) { if(fname && fname[0] && (!current_file[i] || strcmp(fname, current_file[i])) ) {
if(current_file[i]) { if(current_file[i]) {
delete_schematic_data(1); delete_schematic_data(1);
} }
@ -1395,7 +1395,7 @@ void swap_tabs(void)
ctx = save_xctx[i]; ctx = save_xctx[i];
save_xctx[i] = save_xctx[j]; save_xctx[i] = save_xctx[j];
save_xctx[j] = ctx; save_xctx[j] = ctx;
/* update filenames on tab buttons */ /* update filenames on tab buttons */
ctx = xctx; ctx = xctx;
xctx = save_xctx[i]; xctx = save_xctx[i];
@ -1410,7 +1410,7 @@ void swap_tabs(void)
} }
/* swap primary view (.drw) with first valid window (x1.drw, x2.drw, ...) /* swap primary view (.drw) with first valid window (x1.drw, x2.drw, ...)
* used for window close ('xschem exit' command) * used for window close ('xschem exit' command)
* if dr == 1 do draw and don't move following window onto first. This is used if * if dr == 1 do draw and don't move following window onto first. This is used if
* primary windows is about to be deleted */ * primary windows is about to be deleted */
void swap_windows(int dr) void swap_windows(int dr)
@ -1472,7 +1472,7 @@ void swap_windows(int dr)
if(!dr) tclvareval("wm withdraw .; update; wm geometry . ", geometry, "; wm deiconify .", NULL); if(!dr) tclvareval("wm withdraw .; update; wm geometry . ", geometry, "; wm deiconify .", NULL);
resetwin(1, 1, 1, 0, 0); resetwin(1, 1, 1, 0, 0);
if(dr) draw(); if(dr) draw();
new_schematic("switch", wp_j, "", 0); new_schematic("switch", wp_j, "", 0);
resetwin(1, 1, 1, 0, 0); resetwin(1, 1, 1, 0, 0);
@ -1489,7 +1489,7 @@ void swap_windows(int dr)
/* window_path[1] == ".x1.drw" */ /* window_path[1] == ".x1.drw" */
/* .... */ /* .... */
int check_loaded(const char *f, char *win_path) int check_loaded(const char *f, char *win_path)
{ {
int i; int i;
Xschem_ctx *ctx; Xschem_ctx *ctx;
int found = 0; int found = 0;
@ -1553,7 +1553,7 @@ static int switch_window(int *window_count, const char *win_path, int tcl_ctx)
} }
/* if window was closed then tkwin == 0 --> do nothing */ /* if window was closed then tkwin == 0 --> do nothing */
if((!has_x || (tkwin && has_x)) && n >= 0 && n < MAX_NEW_WINDOWS) { if((!has_x || (tkwin && has_x)) && n >= 0 && n < MAX_NEW_WINDOWS) {
if(tcl_ctx) tclvareval("save_ctx ", xctx->current_win_path, NULL); if(tcl_ctx) tclvareval("save_ctx ", xctx->current_win_path, NULL);
xctx = save_xctx[n]; xctx = save_xctx[n];
if(tcl_ctx) { if(tcl_ctx) {
@ -1571,7 +1571,7 @@ static int switch_window(int *window_count, const char *win_path, int tcl_ctx)
/* win_path: .drw for main (first) tab, .x1.drw, ... for additional tabs */ /* win_path: .drw for main (first) tab, .x1.drw, ... for additional tabs */
static int switch_tab(int *window_count, const char *win_path, int dr) static int switch_tab(int *window_count, const char *win_path, int dr)
{ {
int n; int n;
int save_menu_removed, save_fullscreen, save_toolbar_visible; int save_menu_removed, save_fullscreen, save_toolbar_visible;
const char *new_path = win_path; const char *new_path = win_path;
@ -1588,7 +1588,7 @@ static int switch_tab(int *window_count, const char *win_path, int dr)
} }
else return 1; else return 1;
} }
if(!strcmp(new_path, xctx->current_win_path)) return 0; /* already there */ if(!strcmp(new_path, xctx->current_win_path)) return 0; /* already there */
n = get_tab_or_window_number(new_path); n = get_tab_or_window_number(new_path);
if(n == -1) { if(n == -1) {
@ -1640,7 +1640,7 @@ static void create_new_window(int *window_count, const char *win_path, const cha
int i, n, confirm = 1; int i, n, confirm = 1;
dbg(1, "new_schematic() create: fname=%s *window_count = %d\n", fname, *window_count); dbg(1, "new_schematic() create: fname=%s *window_count = %d\n", fname, *window_count);
if(win_path && win_path[0]) confirm = 0; if(win_path && win_path[0]) confirm = 0;
my_strncpy(prev_window, xctx->current_win_path, S(prev_window)); my_strncpy(prev_window, xctx->current_win_path, S(prev_window));
if(confirm && fname && fname[0] && check_loaded(fname, toppath)) { if(confirm && fname && fname[0] && check_loaded(fname, toppath)) {
@ -1733,8 +1733,8 @@ static void create_new_window(int *window_count, const char *win_path, const cha
tclvareval("save_ctx ", window_path[n], NULL); tclvareval("save_ctx ", window_path[n], NULL);
tcleval("eval_user_startup_commands"); tcleval("eval_user_startup_commands");
/* restore previous context, /* restore previous context,
* because the Expose event after new window creation does a context switch prev win -> new win * because the Expose event after new window creation does a context switch prev win -> new win
* *
* tclvareval("restore_ctx ", prev_window, NULL); * tclvareval("restore_ctx ", prev_window, NULL);
* new_schematic("switch", prev_window, "", 1); * new_schematic("switch", prev_window, "", 1);
*/ */
@ -1811,7 +1811,7 @@ static void create_new_tab(int *window_count, const char *noconfirm, const char
tclvareval( tclvareval(
"if {![info exists tctx::tab_bg] } {set tctx::tab_bg [", "if {![info exists tctx::tab_bg] } {set tctx::tab_bg [",
".tabs.x", nn, " cget -bg]}", NULL); ".tabs.x", nn, " cget -bg]}", NULL);
tclvareval("pack ", ".tabs.x", nn, tclvareval("pack ", ".tabs.x", nn,
" -before ", ".tabs.add -side left", NULL); " -before ", ".tabs.add -side left", NULL);
} }
/* */ /* */
@ -1977,7 +1977,7 @@ static void destroy_tab(int *window_count, const char *win_path)
/* seems unnecessary; previous tab save_pixmap was not deleted */ /* seems unnecessary; previous tab save_pixmap was not deleted */
/* resetwin(1, 0, 0, 0, 0); */ /* create pixmap. resetwin(create_pixmap, clear_pixmap, force, w, h) */ /* resetwin(1, 0, 0, 0, 0); */ /* create pixmap. resetwin(create_pixmap, clear_pixmap, force, w, h) */
if(xctx->current_win_path) if(xctx->current_win_path)
tclvareval("restore_ctx ", xctx->current_win_path, " ; housekeeping_ctx", NULL); tclvareval("restore_ctx ", xctx->current_win_path, " ; housekeeping_ctx", NULL);
resetwin(1, 1, 1, 0, 0); resetwin(1, 1, 1, 0, 0);
@ -2004,7 +2004,7 @@ static void destroy_all_windows(int *window_count, int force)
tkwin = Tk_NameToWindow(interp, window_path[i], mainwindow); /* NULL if win_path not existing */ tkwin = Tk_NameToWindow(interp, window_path[i], mainwindow); /* NULL if win_path not existing */
} }
if(has_x && !tkwin) dbg(0, "new_schematic(\"switch\",...): Warning: %s has been destroyed\n", window_path[i]); if(has_x && !tkwin) dbg(0, "new_schematic(\"switch\",...): Warning: %s has been destroyed\n", window_path[i]);
else { else {
xctx = save_xctx[i]; xctx = save_xctx[i];
close = 0; close = 0;
xctx->semaphore++; /* to avoid context switches when dialog below is shown */ xctx->semaphore++; /* to avoid context switches when dialog below is shown */
@ -2163,7 +2163,7 @@ void change_linewidth(double w)
dbg(1, "Line width = %d\n", linew); dbg(1, "Line width = %d\n", linew);
for(i=0;i<cadlayers; ++i) { for(i=0;i<cadlayers; ++i) {
XSetLineAttributes(display, xctx->gc[i], linew, LineSolid, LINECAP , LINEJOIN); XSetLineAttributes(display, xctx->gc[i], linew, LineSolid, LINECAP , LINEJOIN);
} }
XSetLineAttributes (display, xctx->gctiled, linew, LineSolid, LINECAP , LINEJOIN); XSetLineAttributes (display, xctx->gctiled, linew, LineSolid, LINECAP , LINEJOIN);
} }
if(!xctx->only_probes) { if(!xctx->only_probes) {
@ -2207,11 +2207,11 @@ void create_memory_cairo_ctx(int what)
/* clears and creates cairo_sfc, cairo_ctx, cairo_save_sfc, cairo_save_ctx /* clears and creates cairo_sfc, cairo_ctx, cairo_save_sfc, cairo_save_ctx
* and sets some graphical attributes */ * and sets some graphical attributes */
static void resetcairo(int create, int clear, int force_or_resize) static void resetcairo(int create, int clear, int force_or_resize)
{ {
#if HAS_CAIRO==1 #if HAS_CAIRO==1
dbg(1, "resetcairo() %d, %d, %d\n", create, clear, force_or_resize); dbg(1, "resetcairo() %d, %d, %d\n", create, clear, force_or_resize);
if(clear && force_or_resize) { if(clear && force_or_resize) {
/* xctx->cairo_save_sfc is based on pixmap and pixmaps are not resizeable, so on resize /* xctx->cairo_save_sfc is based on pixmap and pixmaps are not resizeable, so on resize
* we must destroy & recreate everything. xctx->cairo_sfc can be resized using cairo_*_surface_set_size * we must destroy & recreate everything. xctx->cairo_sfc can be resized using cairo_*_surface_set_size
* being based on window */ * being based on window */
cairo_destroy(xctx->cairo_save_ctx); cairo_destroy(xctx->cairo_save_ctx);
@ -2288,7 +2288,7 @@ void resetwin(int create_pixmap, int clear_pixmap, int force, int w, int h)
#else #else
XWindowAttributes wattr; XWindowAttributes wattr;
#endif #endif
dbg(1, "\nresetwin(): %s create=%d, clear=%d, force=%d, w=%d, h=%d\n", dbg(1, "\nresetwin(): %s create=%d, clear=%d, force=%d, w=%d, h=%d\n",
xctx->current_win_path, create_pixmap, clear_pixmap, force, w, h); xctx->current_win_path, create_pixmap, clear_pixmap, force, w, h);
if(w && h) { if(w && h) {
width = w; width = w;
@ -2361,7 +2361,7 @@ void resetwin(int create_pixmap, int clear_pixmap, int force, int w, int h)
XSetTile(display,xctx->gctiled, xctx->save_pixmap); XSetTile(display,xctx->gctiled, xctx->save_pixmap);
XSetFillStyle(display,xctx->gctiled,FillTiled); XSetFillStyle(display,xctx->gctiled,FillTiled);
} }
/* whenever a pixmap is recreated all GC attributes must be reissued */ /* whenever a pixmap is recreated all GC attributes must be reissued */
resetcairo(1, 0, 1); /* create, clear, force */ resetcairo(1, 0, 1); /* create, clear, force */
change_linewidth(-1.0); change_linewidth(-1.0);
@ -2370,7 +2370,7 @@ void resetwin(int create_pixmap, int clear_pixmap, int force, int w, int h)
} }
if(xctx->pending_fullzoom > 0 && create_pixmap) { if(xctx->pending_fullzoom > 0 && create_pixmap) {
tcleval("winfo ismapped ."); tcleval("winfo ismapped .");
/* if window unmapped or size has not been set by wm (width == 1 // height == 1) do not /* if window unmapped or size has not been set by wm (width == 1 // height == 1) do not
* perform the pending full_zoom */ * perform the pending full_zoom */
if(tclresult()[0] == '1' && (width > 1 || height > 1) ) { if(tclresult()[0] == '1' && (width > 1 || height > 1) ) {
dbg(1, "resetwin(): window mapped, pending_fulzoom: doing zoom_full()\n"); dbg(1, "resetwin(): window mapped, pending_fulzoom: doing zoom_full()\n");
@ -2452,7 +2452,7 @@ int Tcl_AppInit(Tcl_Interp *inter)
found_sharedir = 1; found_sharedir = 1;
dbg(1, "Using environment XSCHEM_SHAREDIR = %s\n", xschem_sharedir); dbg(1, "Using environment XSCHEM_SHAREDIR = %s\n", xschem_sharedir);
} }
/* Priority 2: Executable-relative detection using argv[0] */ /* Priority 2: Executable-relative detection using argv[0] */
if(!found_sharedir && xschem_executable) { if(!found_sharedir && xschem_executable) {
/* Use argv[0] for C89 compatibility - more portable than /proc/self/exe */ /* Use argv[0] for C89 compatibility - more portable than /proc/self/exe */
@ -2467,14 +2467,14 @@ int Tcl_AppInit(Tcl_Interp *inter)
last_slash = strrchr(exe_path, '/'); last_slash = strrchr(exe_path, '/');
if(last_slash) { if(last_slash) {
*last_slash = '\0'; /* exe_path now contains directory */ *last_slash = '\0'; /* exe_path now contains directory */
/* Convert relative path to absolute if needed */ /* Convert relative path to absolute if needed */
if(exe_path[0] != '/') { /* 'path/to/xschem' was called */ if(exe_path[0] != '/') { /* 'path/to/xschem' was called */
char abs_path[PATH_MAX]; char abs_path[PATH_MAX];
my_snprintf(abs_path, sizeof(abs_path), "%s/%s", pwd_dir, exe_path); my_snprintf(abs_path, sizeof(abs_path), "%s/%s", pwd_dir, exe_path);
my_strncpy(exe_path, abs_path, sizeof(exe_path)); my_strncpy(exe_path, abs_path, sizeof(exe_path));
} }
/* Check if running from source directory */ /* Check if running from source directory */
my_snprintf(tmp, S(tmp), "%s/xschem.tcl", exe_path); my_snprintf(tmp, S(tmp), "%s/xschem.tcl", exe_path);
if(!stat(tmp, &buf)) { if(!stat(tmp, &buf)) {
@ -2485,7 +2485,7 @@ int Tcl_AppInit(Tcl_Interp *inter)
dbg(1, "Detected source XSCHEM_SHAREDIR = %s\n", exe_path); dbg(1, "Detected source XSCHEM_SHAREDIR = %s\n", exe_path);
} }
} }
/* Check installed location (bin/../share/xschem) */ /* Check installed location (bin/../share/xschem) */
if(!found_sharedir) { if(!found_sharedir) {
last_slash = strrchr(exe_path, '/'); last_slash = strrchr(exe_path, '/');
@ -2506,20 +2506,20 @@ int Tcl_AppInit(Tcl_Interp *inter)
} }
} }
} }
/* Priority 3: Legacy current directory check */ /* Priority 3: Legacy current directory check */
if(!found_sharedir && !stat("./xschem.tcl", &buf) && !stat("./systemlib", &buf) && !stat("./xschem", &buf)) { if(!found_sharedir && !stat("./xschem.tcl", &buf) && !stat("./systemlib", &buf) && !stat("./xschem", &buf)) {
tclsetvar("XSCHEM_SHAREDIR",pwd_dir); tclsetvar("XSCHEM_SHAREDIR",pwd_dir);
found_sharedir = 1; found_sharedir = 1;
dbg(1, "Using current directory XSCHEM_SHAREDIR = %s\n", pwd_dir); dbg(1, "Using current directory XSCHEM_SHAREDIR = %s\n", pwd_dir);
} }
/* Priority 4: Compile-time fallback */ /* Priority 4: Compile-time fallback */
if(!found_sharedir) { if(!found_sharedir) {
tclsetvar("XSCHEM_SHAREDIR", XSCHEM_SHAREDIR); tclsetvar("XSCHEM_SHAREDIR", XSCHEM_SHAREDIR);
dbg(1, "Using compile-time XSCHEM_SHAREDIR = %s\n", XSCHEM_SHAREDIR); dbg(1, "Using compile-time XSCHEM_SHAREDIR = %s\n", XSCHEM_SHAREDIR);
} }
/* build TCL XSCHEM_LIBRARY_PATH from const array of strings xschem_library_path */ /* build TCL XSCHEM_LIBRARY_PATH from const array of strings xschem_library_path */
tcleval("set XSCHEM_LIBRARY_PATH {}"); tcleval("set XSCHEM_LIBRARY_PATH {}");
for(i = 0;; i++) { for(i = 0;; i++) {
@ -2543,54 +2543,54 @@ int Tcl_AppInit(Tcl_Interp *inter)
running_in_src_dir = 1; running_in_src_dir = 1;
/* set builtin library path if running in src/ */ /* set builtin library path if running in src/ */
my_snprintf(tmp, S(tmp), my_snprintf(tmp, S(tmp),
"set XSCHEM_LIBRARY_PATH %s/xschem_library", user_conf_dir); "set XSCHEM_LIBRARY_PATH %s/xschem_library", user_conf_dir);
tcleval(tmp); tcleval(tmp);
my_snprintf(tmp, S(tmp), my_snprintf(tmp, S(tmp),
"append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/devices", "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/devices",
tclgetvar("XSCHEM_SHAREDIR")); tclgetvar("XSCHEM_SHAREDIR"));
tcleval(tmp); tcleval(tmp);
my_snprintf(tmp, S(tmp), my_snprintf(tmp, S(tmp),
"append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/examples", "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/examples",
tclgetvar("XSCHEM_SHAREDIR")); tclgetvar("XSCHEM_SHAREDIR"));
tcleval(tmp); tcleval(tmp);
my_snprintf(tmp, S(tmp), my_snprintf(tmp, S(tmp),
"append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/ngspice", "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/ngspice",
tclgetvar("XSCHEM_SHAREDIR")); tclgetvar("XSCHEM_SHAREDIR"));
tcleval(tmp); tcleval(tmp);
my_snprintf(tmp, S(tmp), my_snprintf(tmp, S(tmp),
"append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/ngspice_verilog_cosim", "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/ngspice_verilog_cosim",
tclgetvar("XSCHEM_SHAREDIR")); tclgetvar("XSCHEM_SHAREDIR"));
tcleval(tmp); tcleval(tmp);
my_snprintf(tmp, S(tmp), my_snprintf(tmp, S(tmp),
"append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/logic", "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/logic",
tclgetvar("XSCHEM_SHAREDIR")); tclgetvar("XSCHEM_SHAREDIR"));
tcleval(tmp); tcleval(tmp);
my_snprintf(tmp, S(tmp), my_snprintf(tmp, S(tmp),
"append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/xschem_simulator", "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/xschem_simulator",
tclgetvar("XSCHEM_SHAREDIR")); tclgetvar("XSCHEM_SHAREDIR"));
tcleval(tmp); tcleval(tmp);
my_snprintf(tmp, S(tmp), my_snprintf(tmp, S(tmp),
"append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/generators", "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/generators",
tclgetvar("XSCHEM_SHAREDIR")); tclgetvar("XSCHEM_SHAREDIR"));
tcleval(tmp); tcleval(tmp);
my_snprintf(tmp, S(tmp), my_snprintf(tmp, S(tmp),
"append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/inst_sch_select", "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/inst_sch_select",
tclgetvar("XSCHEM_SHAREDIR")); tclgetvar("XSCHEM_SHAREDIR"));
tcleval(tmp); tcleval(tmp);
my_snprintf(tmp, S(tmp), my_snprintf(tmp, S(tmp),
"append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/binto7seg", "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/binto7seg",
tclgetvar("XSCHEM_SHAREDIR")); tclgetvar("XSCHEM_SHAREDIR"));
tcleval(tmp); tcleval(tmp);
my_snprintf(tmp, S(tmp), my_snprintf(tmp, S(tmp),
"append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/pcb", "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/pcb",
tclgetvar("XSCHEM_SHAREDIR")); tclgetvar("XSCHEM_SHAREDIR"));
tcleval(tmp); tcleval(tmp);
my_snprintf(tmp, S(tmp), my_snprintf(tmp, S(tmp),
"append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/rom8k", "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/rom8k",
tclgetvar("XSCHEM_SHAREDIR")); tclgetvar("XSCHEM_SHAREDIR"));
tcleval(tmp); tcleval(tmp);
my_snprintf(tmp, S(tmp), my_snprintf(tmp, S(tmp),
"append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/analyses", "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/analyses",
tclgetvar("XSCHEM_SHAREDIR")); tclgetvar("XSCHEM_SHAREDIR"));
tcleval(tmp); tcleval(tmp);
@ -2601,16 +2601,16 @@ int Tcl_AppInit(Tcl_Interp *inter)
#define WIN_XSCHEM_LIBRARY_PATH_NUM 12 #define WIN_XSCHEM_LIBRARY_PATH_NUM 12
const char *WIN_XSCHEM_LIBRARY_PATH[WIN_XSCHEM_LIBRARY_PATH_NUM] = { const char *WIN_XSCHEM_LIBRARY_PATH[WIN_XSCHEM_LIBRARY_PATH_NUM] = {
/*1*/ "xschem_library", /*1*/ "xschem_library",
/*2*/ "xschem_library/devices", /*2*/ "xschem_library/devices",
/*3*/ "examples", /* See i==2 with WIN_XSCHEM_LIBRARY_PATH_NUM below */ /*3*/ "examples", /* See i==2 with WIN_XSCHEM_LIBRARY_PATH_NUM below */
/*4*/ "ngspice", /*4*/ "ngspice",
/*5*/ "ngspice_verilog_cosim", /*5*/ "ngspice_verilog_cosim",
/*6*/ "logic", /*6*/ "logic",
/*7*/ "xschem_simulator", /*7*/ "xschem_simulator",
/*8*/ "generators", /*8*/ "generators",
/*9*/ "inst_sch_select", /*9*/ "inst_sch_select",
/*10*/ "binto7seg", /*10*/ "binto7seg",
/*11*/ "pcb", /*11*/ "pcb",
/*12*/ "rom8k" }; /*12*/ "rom8k" };
GetModuleFileNameA(NULL, install_dir, MAX_PATH); GetModuleFileNameA(NULL, install_dir, MAX_PATH);
change_to_unix_fn(install_dir); change_to_unix_fn(install_dir);
@ -2634,16 +2634,16 @@ int Tcl_AppInit(Tcl_Interp *inter)
{ {
my_free(_ALLOC_ID_, &up_hier); my_free(_ALLOC_ID_, &up_hier);
if (running_in_src_dir==0) if (running_in_src_dir==0)
my_strdup(_ALLOC_ID_, &up_hier, "../share/doc/xschem"); my_strdup(_ALLOC_ID_, &up_hier, "../share/doc/xschem");
else else
my_strdup(_ALLOC_ID_, &up_hier, "../../../xschem_library"); my_strdup(_ALLOC_ID_, &up_hier, "../../../xschem_library");
} }
my_snprintf(tmp, S(tmp),"%s/%s/%s", install_dir, up_hier, WIN_XSCHEM_LIBRARY_PATH[i]); my_snprintf(tmp, S(tmp),"%s/%s/%s", install_dir, up_hier, WIN_XSCHEM_LIBRARY_PATH[i]);
if (i > 0) my_strcat(_ALLOC_ID_, &win_xschem_library_path, "\;"); if (i > 0) my_strcat(_ALLOC_ID_, &win_xschem_library_path, "\;");
my_strcat(_ALLOC_ID_, &win_xschem_library_path, tmp); my_strcat(_ALLOC_ID_, &win_xschem_library_path, tmp);
} }
my_snprintf(tmp, S(tmp), "set tmp2 {%s}; " my_snprintf(tmp, S(tmp), "set tmp2 {%s}; "
"while {[regsub {([^/]*\\.*[^./]+[^/]*)/\\.\\./?} $tmp2 {} tmp2]} {}; ", win_xschem_library_path); "while {[regsub {([^/]*\\.*[^./]+[^/]*)/\\.\\./?} $tmp2 {} tmp2]} {}; ", win_xschem_library_path);
const char *result2 = tcleval(tmp); const char *result2 = tcleval(tmp);
const char *win_xschem_library_path_clean = tclgetvar("tmp2"); const char *win_xschem_library_path_clean = tclgetvar("tmp2");
tclsetvar("XSCHEM_LIBRARY_PATH", win_xschem_library_path_clean); tclsetvar("XSCHEM_LIBRARY_PATH", win_xschem_library_path_clean);
@ -2692,14 +2692,14 @@ int Tcl_AppInit(Tcl_Interp *inter)
fprintf(errfp, "Tcl_AppInit(): failure creating %s\n", user_conf_dir); fprintf(errfp, "Tcl_AppInit(): failure creating %s\n", user_conf_dir);
Tcl_Exit(EXIT_FAILURE); Tcl_Exit(EXIT_FAILURE);
} }
} }
fprintf(errfp, "Using run time directory XSCHEM_SHAREDIR = %s\n", tclgetvar("XSCHEM_SHAREDIR")); fprintf(errfp, "Using run time directory XSCHEM_SHAREDIR = %s\n", tclgetvar("XSCHEM_SHAREDIR"));
/* Execute tcl script given on command line with --preinit, before sourcing xschemrc */ /* Execute tcl script given on command line with --preinit, before sourcing xschemrc */
if(cli_opt_preinit_command) { if(cli_opt_preinit_command) {
tcleval(cli_opt_preinit_command); tcleval(cli_opt_preinit_command);
} }
/* */ /* */
/* SOURCE xschemrc file */ /* SOURCE xschemrc file */
/* */ /* */
@ -2968,7 +2968,7 @@ int Tcl_AppInit(Tcl_Interp *inter)
} else { } else {
my_strncpy(xctx->current_dirname, pwd_dir, S(xctx->current_dirname)); my_strncpy(xctx->current_dirname, pwd_dir, S(xctx->current_dirname));
} }
/* */ /* */
/* X INITIALIZATION */ /* X INITIALIZATION */
@ -3113,9 +3113,9 @@ int Tcl_AppInit(Tcl_Interp *inter)
if(cli_opt_diff[0]) { if(cli_opt_diff[0]) {
my_strncpy(xctx->sch_to_compare, abs_sym_path(cli_opt_diff, ""), S(xctx->sch_to_compare)); my_strncpy(xctx->sch_to_compare, abs_sym_path(cli_opt_diff, ""), S(xctx->sch_to_compare));
tclsetvar("compare_sch", "1"); tclsetvar("compare_sch", "1");
} }
/* must be before source_user_tcl_files, so event bindings defined there /* must be before source_user_tcl_files, so event bindings defined there
* will be correctly appended to default bindings */ * will be correctly appended to default bindings */
tcleval("set_bindings .drw"); tcleval("set_bindings .drw");
@ -3140,7 +3140,7 @@ int Tcl_AppInit(Tcl_Interp *inter)
if(cli_opt_filename[0]) { if(cli_opt_filename[0]) {
int file_loaded = 1; int file_loaded = 1;
/* check if local_netlist_dir is set and set netlist_dir accordingly /* check if local_netlist_dir is set and set netlist_dir accordingly
* following call is needed since load_schematic() may be called with * following call is needed since load_schematic() may be called with
* reset_undo=0 and will not call set_netlist_dir */ * reset_undo=0 and will not call set_netlist_dir */
set_netlist_dir(2, NULL); set_netlist_dir(2, NULL);
#ifdef __unix__ #ifdef __unix__
@ -3158,7 +3158,7 @@ int Tcl_AppInit(Tcl_Interp *inter)
#endif #endif
dbg(1, "Tcl_AppInit(): cli_opt_filename %s given, removing symbols\n", cli_opt_filename); dbg(1, "Tcl_AppInit(): cli_opt_filename %s given, removing symbols\n", cli_opt_filename);
remove_symbols(); remove_symbols();
/* if cli_opt_do_netlist=1 call load_schematic with 'reset_undo=0' avoiding call /* if cli_opt_do_netlist=1 call load_schematic with 'reset_undo=0' avoiding call
to tcl is_xschem_file that could change xctx->netlist_type to symbol */ to tcl is_xschem_file that could change xctx->netlist_type to symbol */
file_loaded = load_schematic(1, fname, !cli_opt_do_netlist, 1); file_loaded = load_schematic(1, fname, !cli_opt_do_netlist, 1);
if(cli_opt_do_netlist) if(!file_loaded) tcleval("exit 1"); if(cli_opt_do_netlist) if(!file_loaded) tcleval("exit 1");
@ -3174,7 +3174,7 @@ int Tcl_AppInit(Tcl_Interp *inter)
#endif #endif
dbg(1, "Tcl_AppInit(): tmp=%s\n", tmp? tmp: "<NULL>"); dbg(1, "Tcl_AppInit(): tmp=%s\n", tmp? tmp: "<NULL>");
my_strncpy(fname, abs_sym_path(tmp, ""), S(fname)); my_strncpy(fname, abs_sym_path(tmp, ""), S(fname));
/* if cli_opt_do_netlist=1 call load_schematic with 'reset_undo=0' avoiding call /* if cli_opt_do_netlist=1 call load_schematic with 'reset_undo=0' avoiding call
to tcl is_xschem_file that could change xctx->netlist_type to symbol */ to tcl is_xschem_file that could change xctx->netlist_type to symbol */
file_loaded = load_schematic(1, fname, !cli_opt_do_netlist, 1); file_loaded = load_schematic(1, fname, !cli_opt_do_netlist, 1);
if(!file_loaded) tcleval("exit 1"); if(!file_loaded) tcleval("exit 1");
@ -3307,7 +3307,7 @@ int Tcl_AppInit(Tcl_Interp *inter)
"::tclreadline::readline builtincompleter 0; " "::tclreadline::readline builtincompleter 0; "
"::tclreadline::readline customcompleter completer; " "::tclreadline::readline customcompleter completer; "
"::tclreadline::Loop" "::tclreadline::Loop"
"}" "}"
); );
} }
/* set up a tcl event handler to serve events (tcp connections) if no other /* set up a tcl event handler to serve events (tcp connections) if no other

File diff suppressed because it is too large Load Diff

View File

@ -76,5 +76,5 @@ function endfile(f, i)
} }
close(f) close(f)
} }
} }

View File

@ -1,21 +1,21 @@
# #
# File: create_save.tcl # File: create_save.tcl
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2022 Stefan Frederik Schippers # Copyright (C) 1998-2022 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -55,7 +55,7 @@ proc create_save {} {
lappend pathlist "${filename}.sch" lappend pathlist "${filename}.sch"
cleanup_debug_file ${results_dir}/$output cleanup_debug_file ${results_dir}/$output
cleanup_debug_file ${results_dir}/$fn_sch cleanup_debug_file ${results_dir}/$fn_sch
} }
} }
} }
} }

View File

@ -1,11 +1,11 @@
xschem line 910 -560 960 -540 xschem line 910 -560 960 -540
xschem line 880 -680 1200 -680 xschem line 880 -680 1200 -680
xschem line 900 -540 950 -560 xschem line 900 -540 950 -560
xschem line 900 -550 950 -530 xschem line 900 -550 950 -530
xschem line 910 -530 960 -550 xschem line 910 -530 960 -550
xschem rect 940 -510 960 -450 xschem rect 940 -510 960 -450
xschem rect 900 -490 970 -470 xschem rect 900 -490 970 -470
xschem rect 910 -510 930 -450 xschem rect 910 -510 930 -450
xschem wire 870 -300 990 -300 {lab=#net1} xschem wire 870 -300 990 -300 {lab=#net1}
xschem wire 910 -340 910 -250 {lab=#net2} xschem wire 910 -340 910 -250 {lab=#net2}
xschem wire 910 -270 970 -270 {lab=#net2} xschem wire 910 -270 970 -270 {lab=#net2}

View File

@ -37,20 +37,20 @@ vvss vss 0 dc 0
* .tran 5u 7m uic * .tran 5u 7m uic
** models are generally not free: you must download ** models are generally not free: you must download
** SPICE models for active devices and put them into the below ** SPICE models for active devices and put them into the below
** referenced file in netlist/simulation directory. ** referenced file in netlist/simulation directory.
.include \\"models_pcb_voltage_protection.txt\\" .include \\"models_pcb_voltage_protection.txt\\"
.dc VVCC 0 8 0.004 .dc VVCC 0 8 0.004
.save all .save all
"} "}
xschem instance ../xschem_library/devices/pnp.sym 580 -390 0 0 {name=Q6 xschem instance ../xschem_library/devices/pnp.sym 580 -390 0 0 {name=Q6
model=BC857 model=BC857
device=BC857 device=BC857
footprint=SOT23 footprint=SOT23
url="https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=2ahUKEwijlfagu4zfAhUN0xoKHTPBAb0QFjAAegQIAhAC&url=http%3A%2F%2Fwww.onsemi.com%2Fpub%2FCollateral%2FPN2907-D.PDF&usg=AOvVaw2wgr87fGZgGfBRhXzHGwZM"} url="https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=2ahUKEwijlfagu4zfAhUN0xoKHTPBAb0QFjAAegQIAhAC&url=http%3A%2F%2Fwww.onsemi.com%2Fpub%2FCollateral%2FPN2907-D.PDF&usg=AOvVaw2wgr87fGZgGfBRhXzHGwZM"}
xschem instance ../xschem_library/devices/zener.sym 330 -190 2 0 {name=x3 xschem instance ../xschem_library/devices/zener.sym 330 -190 2 0 {name=x3
model=BZX5V1 model=BZX5V1
device=BZX5V1 device=BZX5V1
footprint=acy(300) footprint=acy(300)
xxxspiceprefix="#D#"} xxxspiceprefix="#D#"}
xschem instance ../xschem_library/devices/gnd.sym 330 -130 0 0 {name=l13 lab=VSS} xschem instance ../xschem_library/devices/gnd.sym 330 -130 0 0 {name=l13 lab=VSS}
@ -61,9 +61,9 @@ xschem instance ../xschem_library/devices/res.sym 600 -190 0 0 {name=R5 m=1 valu
xschem instance ../xschem_library/devices/gnd.sym 600 -130 0 0 {name=l16 lab=VSS} xschem instance ../xschem_library/devices/gnd.sym 600 -130 0 0 {name=l16 lab=VSS}
xschem instance ../xschem_library/devices/lab_wire.sym 360 -390 0 0 {name=l0 lab=B} xschem instance ../xschem_library/devices/lab_wire.sym 360 -390 0 0 {name=l0 lab=B}
xschem instance ../xschem_library/devices/res.sym 330 -340 0 0 {name=R2 m=1 value=510 footprint=1206 device=resistor} xschem instance ../xschem_library/devices/res.sym 330 -340 0 0 {name=R2 m=1 value=510 footprint=1206 device=resistor}
xschem instance ../xschem_library/devices/pmos.sym 750 -360 0 0 {name=M2 xschem instance ../xschem_library/devices/pmos.sym 750 -360 0 0 {name=M2
model=IRLML6402 model=IRLML6402
device=IRLML6402 device=IRLML6402
footprint=SOT23 footprint=SOT23
spiceprefix=X spiceprefix=X
m=1 m=1
@ -72,11 +72,11 @@ xschem instance ../xschem_library/devices/led.sym 650 -290 0 0 {name=x1 model=D1
xschem instance ../xschem_library/devices/lab_pin.sym 170 -340 0 1 {name=p6 lab=VOUT} xschem instance ../xschem_library/devices/lab_pin.sym 170 -340 0 1 {name=p6 lab=VOUT}
xschem instance ../xschem_library/devices/lab_pin.sym 170 -360 0 1 {name=p7 lab=VSS} xschem instance ../xschem_library/devices/lab_pin.sym 170 -360 0 1 {name=p7 lab=VSS}
xschem instance ../xschem_library/devices/lab_pin.sym 170 -380 0 1 {name=p8 lab=VCC} xschem instance ../xschem_library/devices/lab_pin.sym 170 -380 0 1 {name=p8 lab=VCC}
xschem instance ../xschem_library/devices/zener.sym 250 -190 2 0 {name=x4 xschem instance ../xschem_library/devices/zener.sym 250 -190 2 0 {name=x4
model=BZX5V1 model=BZX5V1
device=BZX5V1 device=BZX5V1
area=1 area=1
footprint=minimelf footprint=minimelf
spice_ignore=true} spice_ignore=true}
xschem instance ../xschem_library/devices/gnd.sym 250 -130 0 0 {name=l1 lab=VSS} xschem instance ../xschem_library/devices/gnd.sym 250 -130 0 0 {name=l1 lab=VSS}
xschem instance ../xschem_library/devices/res.sym 550 -290 0 0 {name=R1 m=1 value=47K footprint=1206 device=resistor} xschem instance ../xschem_library/devices/res.sym 550 -290 0 0 {name=R1 m=1 value=47K footprint=1206 device=resistor}

View File

@ -1,33 +1,33 @@
xschem set rectcolor 3 xschem set rectcolor 3
xschem line 850 -270 850 -60 xschem line 850 -270 850 -60
xschem line 1050 -270 1050 -60 xschem line 1050 -270 1050 -60
xschem line 1250 -270 1250 -60 xschem line 1250 -270 1250 -60
xschem set rectcolor 8 xschem set rectcolor 8
xschem line 820 -220 850 -220 xschem line 820 -220 850 -220
xschem line 850 -220 850 -180 xschem line 850 -220 850 -180
xschem line 850 -180 950 -180 xschem line 850 -180 950 -180
xschem line 950 -220 950 -180 xschem line 950 -220 950 -180
xschem line 950 -220 1050 -220 xschem line 950 -220 1050 -220
xschem line 1050 -220 1050 -180 xschem line 1050 -220 1050 -180
xschem line 1050 -180 1150 -180 xschem line 1050 -180 1150 -180
xschem line 1150 -220 1150 -180 xschem line 1150 -220 1150 -180
xschem line 1150 -220 1250 -220 xschem line 1150 -220 1250 -220
xschem line 1250 -220 1250 -180 xschem line 1250 -220 1250 -180
xschem line 1250 -180 1300 -180 xschem line 1250 -180 1300 -180
xschem line 950 -160 950 -120 xschem line 950 -160 950 -120
xschem line 950 -160 980 -160 xschem line 950 -160 980 -160
xschem line 980 -160 980 -120 xschem line 980 -160 980 -120
xschem line 980 -120 1150 -120 xschem line 980 -120 1150 -120
xschem line 1150 -160 1150 -120 xschem line 1150 -160 1150 -120
xschem line 1150 -160 1180 -160 xschem line 1150 -160 1180 -160
xschem line 1180 -160 1180 -120 xschem line 1180 -160 1180 -120
xschem line 1180 -120 1300 -120 xschem line 1180 -120 1300 -120
xschem line 820 -120 950 -120 xschem line 820 -120 950 -120
xschem set rectcolor 7 xschem set rectcolor 7
xschem rect 950 -250 980 -80 xschem rect 950 -250 980 -80
xschem rect 1150 -250 1180 -80 xschem rect 1150 -250 1180 -80
xschem set rectcolor 21 xschem set rectcolor 21
xschem rect 10 -970 240 -750 xschem rect 10 -970 240 -750
xschem wire 150 -580 150 -560 {lab=vss} xschem wire 150 -580 150 -560 {lab=vss}
xschem wire 150 -420 150 -400 {lab=vss} xschem wire 150 -420 150 -400 {lab=vss}
xschem wire 10 -270 10 -250 {lab=vss} xschem wire 10 -270 10 -250 {lab=vss}
@ -53,7 +53,7 @@ vvss vss 0 0
*.dc vvcc 0 2 0.1 *.dc vvcc 0 2 0.1
.tran 0.2n 480n uic .tran 0.2n 480n uic
** download models from here: ** download models from here:
** http://www.amarketplaceofideas.com/wp-content/uploads/2014/11/180nm-V1.7z ** http://www.amarketplaceofideas.com/wp-content/uploads/2014/11/180nm-V1.7z
** and save to 'models_rom8k.txt' in simulation directory ** and save to 'models_rom8k.txt' in simulation directory
.include models_rom8k.txt .include models_rom8k.txt

View File

@ -1,21 +1,21 @@
# #
# File: netlisting.tcl # File: netlisting.tcl
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2022 Stefan Frederik Schippers # Copyright (C) 1998-2022 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -37,7 +37,7 @@ set xschem_library_path "../xschem_library"
proc netlisting {dir fn} { proc netlisting {dir fn} {
global xschem_library_path testname pathlist xschem_cmd global xschem_library_path testname pathlist xschem_cmd
if { [regexp {\.sch$} $fn ] } { if { [regexp {\.sch$} $fn ] } {
puts "Testing ($testname) $dir/$fn" puts "Testing ($testname) $dir/$fn"
set output_dir $dir set output_dir $dir
regsub -all $xschem_library_path $output_dir {} output_dir regsub -all $xschem_library_path $output_dir {} output_dir
regsub {^/} $output_dir {} output_dir regsub {^/} $output_dir {} output_dir
@ -80,13 +80,13 @@ proc run_xschem_netlist {type output_dir dir fn} {
if {$type eq "tdx"} {set opt t} if {$type eq "tdx"} {set opt t}
set netlist_failed 0 ;# not used here but might be used in the future. set netlist_failed 0 ;# not used here but might be used in the future.
set general_failure 0 set general_failure 0
cd $dir cd $dir
set catch_status [catch {eval exec {$xschem_cmd $fn -q -x -r -$opt -o $netlist_output_dir -n 2> $output}} msg opt] set catch_status [catch {eval exec {$xschem_cmd $fn -q -x -r -$opt -o $netlist_output_dir -n 2> $output}} msg opt]
cd $cwd cd $cwd
if {$catch_status} { if {$catch_status} {
set error_code [dict get $opt -errorcode] set error_code [dict get $opt -errorcode]
# in case of child process error $error_code will be {CHILDSTATUS 11731 10}, second item is processID, # in case of child process error $error_code will be {CHILDSTATUS 11731 10}, second item is processID,
# 3rd item is child process exit code. In case of netlisting error xschem exit code is 10 # 3rd item is child process exit code. In case of netlisting error xschem exit code is 10
if {[regexp {^CHILDSTATUS.* 10$} $error_code]} { if {[regexp {^CHILDSTATUS.* 10$} $error_code]} {
set netlist_failed 1 set netlist_failed 1
@ -96,7 +96,7 @@ proc run_xschem_netlist {type output_dir dir fn} {
} }
if {$general_failure} { if {$general_failure} {
puts "FATAL: $xschem_cmd $fn -q -x -r -$opt -o $netlist_output_dir -n 2> $output : $msg" puts "FATAL: $xschem_cmd $fn -q -x -r -$opt -o $netlist_output_dir -n 2> $output : $msg"
incr num_fatals incr num_fatals
} else { } else {
lappend pathlist $fn_debug lappend pathlist $fn_debug
lappend pathlist $fn_netlist lappend pathlist $fn_netlist

View File

@ -1,21 +1,21 @@
# #
# File: open_close.tcl # File: open_close.tcl
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2022 Stefan Frederik Schippers # Copyright (C) 1998-2022 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -38,7 +38,7 @@ proc open_close {dir fn} {
global xschem_library_path testname pathlist xschem_cmd global xschem_library_path testname pathlist xschem_cmd
set fpath "$dir/$fn" set fpath "$dir/$fn"
if { [regexp {\.(sym|sch)$} $fn ] } { if { [regexp {\.(sym|sch)$} $fn ] } {
puts "Testing (open_close) $fpath" puts "Testing (open_close) $fpath"
set output_dir $dir set output_dir $dir
regsub -all $xschem_library_path $output_dir {} output_dir regsub -all $xschem_library_path $output_dir {} output_dir
regsub {^/} $output_dir {} output_dir regsub {^/} $output_dir {} output_dir

View File

@ -1,21 +1,21 @@
# #
# File: run_regression.tcl # File: run_regression.tcl
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2023 Stefan Frederik Schippers # Copyright (C) 1998-2023 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -29,11 +29,11 @@ proc summarize_all {fn fd} {
set num_fail 0 set num_fail 0
if (!$b) { if (!$b) {
while {[gets $fdread line] >=0} { while {[gets $fdread line] >=0} {
if { [regexp {[FAIL]$} $line] || [regexp {[GOLD\?]$} $line] || [regexp {^[FATAL]} $line]} { if { [regexp {[FAIL]$} $line] || [regexp {[GOLD\?]$} $line] || [regexp {^[FATAL]} $line]} {
puts $fd $line puts $fd $line
incr num_fail incr num_fail
} }
} }
puts $fd "Total num fail: $num_fail" puts $fd "Total num fail: $num_fail"
close $fdread close $fdread
} else { } else {

View File

@ -1,21 +1,21 @@
# #
# File: xschem_test_utility.tcl # File: xschem_test_utility.tcl
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2022 Stefan Frederik Schippers # Copyright (C) 1998-2022 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -38,7 +38,7 @@ proc comp_file {file1 file2} {
} }
proc print_results {testname pathlist num_fatals} { proc print_results {testname pathlist num_fatals} {
if {[file exists ${testname}/gold]} { if {[file exists ${testname}/gold]} {
set a [catch "open \"$testname.log\" w" fd] set a [catch "open \"$testname.log\" w" fd]
if {$a} { if {$a} {
@ -50,24 +50,24 @@ proc print_results {testname pathlist num_fatals} {
foreach f $pathlist { foreach f $pathlist {
incr i incr i
if {![file exists $testname/gold/$f]} { if {![file exists $testname/gold/$f]} {
puts $fd "$i. $f: GOLD?" puts $fd "$i. $f: GOLD?"
incr num_gold incr num_gold
continue continue
} }
if {![file exists $testname/results/$f]} { if {![file exists $testname/results/$f]} {
puts $fd "$i. $f: RESULT?" puts $fd "$i. $f: RESULT?"
continue continue
} }
if ([comp_file $testname/gold/$f $testname/results/$f]) { if ([comp_file $testname/gold/$f $testname/results/$f]) {
puts $fd "$i. $f: PASS" puts $fd "$i. $f: PASS"
} else { } else {
puts $fd "$i. $f: FAIL" puts $fd "$i. $f: FAIL"
incr num_fail incr num_fail
} }
} }
puts $fd "Summary:" puts $fd "Summary:"
puts $fd "Num failed: $num_fail Num missing gold: $num_gold Num passed: [expr $i-$num_fail-$num_gold]" puts $fd "Num failed: $num_fail Num missing gold: $num_gold Num passed: [expr $i-$num_fail-$num_gold]"
if {$num_fatals} { if {$num_fatals} {
puts $fd "FATAL: $num_fatals. Please search for FATAL in its output file for more detail" puts $fd "FATAL: $num_fatals. Please search for FATAL in its output file for more detail"
} }
close $fd close $fd

View File

@ -13,7 +13,7 @@
## optionally with logging to catch memory leaks: ## optionally with logging to catch memory leaks:
# xschem -d 3 -l log --script /path/to/xschemtest.tcl # xschem -d 3 -l log --script /path/to/xschemtest.tcl
## and then running: xschemtest ## and then running: xschemtest
## running this test with different xschem versions with profiling enabled (-pg) ## running this test with different xschem versions with profiling enabled (-pg)
## allows to see differences in number of function calls / time spent. ## allows to see differences in number of function calls / time spent.
## move schematic and redraw in a loop. ## move schematic and redraw in a loop.
@ -172,7 +172,7 @@ proc print_test {{view 0}} {
proc test_xschem_simulation {{f simulate_ff.sch}} { proc test_xschem_simulation {{f simulate_ff.sch}} {
global tclstop OS global tclstop OS
xschem load [abs_sym_path $f] xschem load [abs_sym_path $f]
## search element with tclcommand attribute ## search element with tclcommand attribute
if {$OS ne {Windows}} { if {$OS ne {Windows}} {
xschem search regex 1 tclcommand {} xschem search regex 1 tclcommand {}
} else { } else {

View File

@ -1,4 +1,4 @@
# Analyses library for visual circuit analysis setup. # Analyses library for visual circuit analysis setup.
# Copyright (C) 2025 Arpad Buermen # Copyright (C) 2025 Arpad Buermen
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
@ -226,8 +226,8 @@ proc netlister {netlist_type} {
try { try {
# Format analysis and post analysis script # Format analysis and post analysis script
set retval [$func $name] set retval [$func $name]
# retval has 2 members: # retval has 2 members:
# - command and # - command and
# - post-command (for writing results in ngpice, empty string for spectre) # - post-command (for writing results in ngpice, empty string for spectre)
lassign $retval cmd postcmd lassign $retval cmd postcmd
# Format sweep and add it to analysis # Format sweep and add it to analysis
@ -564,7 +564,7 @@ proc format_signal_output_spice {name} {
set outn [string range $outn 1 end-1] set outn [string range $outn 1 end-1]
} }
# Is outn empty # Is outn empty
if {[string length $outn] == 0} { if {[string length $outn] == 0} {
return "v($outp)" return "v($outp)"
} else { } else {
return "v($outp,$outn)" return "v($outp,$outn)"

View File

@ -28,8 +28,8 @@ E {}
L 3 860 -680 910 -660 {} L 3 860 -680 910 -660 {}
L 3 830 -800 1150 -800 {} L 3 830 -800 1150 -800 {}
L 3 1190 -800 1510 -800 {} L 3 1190 -800 1510 -800 {}
L 8 850 -660 900 -680 {} L 8 850 -660 900 -680 {bus=8}
L 11 850 -670 900 -650 {dash=4} L 11 850 -670 900 -650 {dash=4 bus=3}
L 16 860 -650 910 -670 {} L 16 860 -650 910 -670 {}
B 2 1200 -780 1489 -574 {flags=image B 2 1200 -780 1489 -574 {flags=image
alpha=0.9 alpha=0.9
@ -60,13 +60,13 @@ B 4 890 -630 910 -570 {}
B 6 810 -630 830 -570 {ellipse=0,360} B 6 810 -630 830 -570 {ellipse=0,360}
B 7 850 -610 920 -590 {dash=4} B 7 850 -610 920 -590 {dash=4}
B 7 850 -580 920 -560 {dash=4 fill=full} B 7 850 -580 920 -560 {dash=4 fill=full}
B 8 860 -630 880 -570 {} B 8 860 -630 880 -570 {bus=6}
A 4 875 -215 35.35533905932738 8.13010235415598 360 {} A 4 875 -215 35.35533905932738 8.13010235415598 360 {}
A 6 940 -270 70.71067811865476 188.130102354156 89.99999999999997 {} A 6 940 -270 70.71067811865476 188.130102354156 89.99999999999997 {}
A 7 884.1666666666666 -210 39.58991173406564 210.3432488842396 198.9246444160511 {} A 7 884.1666666666666 -210 39.58991173406564 210.3432488842396 198.9246444160511 {bus=4}
P 1 10 880 -480 870 -540 950 -520 910 -500 940 -470 920 -470 910 -450 890 -490 880 -470 880 -480 {dash=3} P 1 10 880 -480 870 -540 950 -520 910 -500 940 -470 920 -470 910 -450 890 -490 880 -470 880 -480 {dash=3}
P 4 6 830 -460 830 -550 820 -500 780 -560 770 -520 810 -480 {bezier=1} P 4 6 830 -460 830 -550 820 -500 780 -560 770 -520 810 -480 {bezier=1}
P 15 11 870 -510 880 -550 900 -520 910 -540 920 -510 940 -520 920 -480 890 -490 860 -470 840 -520 870 -510 {fill=true} P 15 11 870 -510 880 -550 900 -520 910 -540 920 -510 940 -520 920 -480 890 -490 860 -470 840 -520 870 -510 {fill=true bus=5}
T {Welcome to XSCHEM!} 90 -1180 0 0 1 1 {layer=5} T {Welcome to XSCHEM!} 90 -1180 0 0 1 1 {layer=5}
T {This is a test schematic window T {This is a test schematic window
@ -84,7 +84,7 @@ T {XSCHEM OBJECTS} 860 -840 0 0 0.6 0.6 {layer=7}
T {Components} 960 -330 0 0 0.6 0.6 {layer=4} T {Components} 960 -330 0 0 0.6 0.6 {layer=4}
T {TEXT} 840 -740 0 0 0.5 0.5 {layer=8} T {TEXT} 840 -740 0 0 0.5 0.5 {layer=8}
T {TEXT} 840 -790 1 0 0.7 0.7 {layer=6 font=Monospace} T {TEXT} 840 -790 1 0 0.7 0.7 {layer=6 font=Monospace}
T {Text} 850 -780 0 0 0.5 0.5 {layer=7 font="serif"} T {Text} 850 -780 0 0 0.5 0.5 {layer=7 font="serif" slant=oblique}
T {TEXT} 940 -780 1 0 0.5 0.5 {weight=bold} T {TEXT} 940 -780 1 0 0.5 0.5 {weight=bold}
T {Text} 960 -770 0 0 0.6 0.6 {layer=4} T {Text} 960 -770 0 0 0.6 0.6 {layer=4}
T {Arcs/Circles} 960 -240 0 0 0.6 0.6 {layer=4} T {Arcs/Circles} 960 -240 0 0 0.6 0.6 {layer=4}

View File

@ -13,16 +13,16 @@ K {type=nmos
lvs_format="@spiceprefix@name @pinlist sky130_fd_pr__@model L=@L W=@W nf=@nf m=@mult" lvs_format="@spiceprefix@name @pinlist sky130_fd_pr__@model L=@L W=@W nf=@nf m=@mult"
format="@spiceprefix@name @pinlist sky130_fd_pr__@model L=@L W=@W format="@spiceprefix@name @pinlist sky130_fd_pr__@model L=@L W=@W
+ nf=@nf ad=@ad as=@as pd=@pd ps=@ps + nf=@nf ad=@ad as=@as pd=@pd ps=@ps
+ nrd=@nrd nrs=@nrs sa=@sa sb=@sb sd=@sd + nrd=@nrd nrs=@nrs sa=@sa sb=@sb sd=@sd
+ mult=@mult m=@mult" + mult=@mult m=@mult"
template="name=M1 template="name=M1
L=0.5 L=0.5
W=1 W=1
nf=1 nf=1
mult=1 mult=1
ad=\\"'int((nf+1)/2) * W/nf * 0.29'\\" ad=\\"'int((nf+1)/2) * W/nf * 0.29'\\"
pd=\\"'2*int((nf+1)/2) * (W/nf + 0.29)'\\" pd=\\"'2*int((nf+1)/2) * (W/nf + 0.29)'\\"
as=\\"'int((nf+2)/2) * W/nf * 0.29'\\" as=\\"'int((nf+2)/2) * W/nf * 0.29'\\"
ps=\\"'2*int((nf+2)/2) * (W/nf + 0.29)'\\" ps=\\"'2*int((nf+2)/2) * (W/nf + 0.29)'\\"
nrd=\\"'0.29 / W'\\" nrs=\\"'0.29 / W'\\" nrd=\\"'0.29 / W'\\" nrs=\\"'0.29 / W'\\"
sa=0 sb=0 sd=0 sa=0 sb=0 sd=0
@ -65,16 +65,16 @@ K {type=pmos
lvs_format="@spiceprefix@name @pinlist sky130_fd_pr__@model L=@L W=@W nf=@nf m=@mult" lvs_format="@spiceprefix@name @pinlist sky130_fd_pr__@model L=@L W=@W nf=@nf m=@mult"
format="@spiceprefix@name @pinlist sky130_fd_pr__@model L=@L W=@W format="@spiceprefix@name @pinlist sky130_fd_pr__@model L=@L W=@W
+ nf=@nf ad=@ad as=@as pd=@pd ps=@ps + nf=@nf ad=@ad as=@as pd=@pd ps=@ps
+ nrd=@nrd nrs=@nrs sa=@sa sb=@sb sd=@sd + nrd=@nrd nrs=@nrs sa=@sa sb=@sb sd=@sd
+ mult=@mult m=@mult" + mult=@mult m=@mult"
template="name=M1 template="name=M1
L=0.5 L=0.5
W=1 W=1
nf=1 nf=1
mult=1 mult=1
ad=\\"'int((nf+1)/2) * W/nf * 0.29'\\" ad=\\"'int((nf+1)/2) * W/nf * 0.29'\\"
pd=\\"'2*int((nf+1)/2) * (W/nf + 0.29)'\\" pd=\\"'2*int((nf+1)/2) * (W/nf + 0.29)'\\"
as=\\"'int((nf+2)/2) * W/nf * 0.29'\\" as=\\"'int((nf+2)/2) * W/nf * 0.29'\\"
ps=\\"'2*int((nf+2)/2) * (W/nf + 0.29)'\\" ps=\\"'2*int((nf+2)/2) * (W/nf + 0.29)'\\"
nrd=\\"'0.29 / W'\\" nrs=\\"'0.29 / W'\\" nrd=\\"'0.29 / W'\\" nrs=\\"'0.29 / W'\\"
sa=0 sb=0 sd=0 sa=0 sb=0 sd=0
@ -118,16 +118,16 @@ K {type=pmos
lvs_format="@spiceprefix@name @pinlist sky130_fd_pr__@model L=@L W=@W nf=@nf m=@mult" lvs_format="@spiceprefix@name @pinlist sky130_fd_pr__@model L=@L W=@W nf=@nf m=@mult"
format="@spiceprefix@name @pinlist sky130_fd_pr__@model L=@L W=@W format="@spiceprefix@name @pinlist sky130_fd_pr__@model L=@L W=@W
+ nf=@nf ad=@ad as=@as pd=@pd ps=@ps + nf=@nf ad=@ad as=@as pd=@pd ps=@ps
+ nrd=@nrd nrs=@nrs sa=@sa sb=@sb sd=@sd + nrd=@nrd nrs=@nrs sa=@sa sb=@sb sd=@sd
+ mult=@mult m=@mult" + mult=@mult m=@mult"
template="name=M1 template="name=M1
L=0.15 L=0.15
W=1 W=1
nf=1 nf=1
mult=1 mult=1
ad=\\"'int((nf+1)/2) * W/nf * 0.29'\\" ad=\\"'int((nf+1)/2) * W/nf * 0.29'\\"
pd=\\"'2*int((nf+1)/2) * (W/nf + 0.29)'\\" pd=\\"'2*int((nf+1)/2) * (W/nf + 0.29)'\\"
as=\\"'int((nf+2)/2) * W/nf * 0.29'\\" as=\\"'int((nf+2)/2) * W/nf * 0.29'\\"
ps=\\"'2*int((nf+2)/2) * (W/nf + 0.29)'\\" ps=\\"'2*int((nf+2)/2) * (W/nf + 0.29)'\\"
nrd=\\"'0.29 / W'\\" nrs=\\"'0.29 / W'\\" nrd=\\"'0.29 / W'\\" nrs=\\"'0.29 / W'\\"
sa=0 sb=0 sd=0 sa=0 sb=0 sd=0
@ -173,16 +173,16 @@ K {type=nmos
lvs_format="@spiceprefix@name @pinlist sky130_fd_pr__@model L=@L W=@W nf=@nf m=@mult" lvs_format="@spiceprefix@name @pinlist sky130_fd_pr__@model L=@L W=@W nf=@nf m=@mult"
format="@spiceprefix@name @pinlist sky130_fd_pr__@model L=@L W=@W format="@spiceprefix@name @pinlist sky130_fd_pr__@model L=@L W=@W
+ nf=@nf ad=@ad as=@as pd=@pd ps=@ps + nf=@nf ad=@ad as=@as pd=@pd ps=@ps
+ nrd=@nrd nrs=@nrs sa=@sa sb=@sb sd=@sd + nrd=@nrd nrs=@nrs sa=@sa sb=@sb sd=@sd
+ mult=@mult m=@mult" + mult=@mult m=@mult"
template="name=M1 template="name=M1
L=0.15 L=0.15
W=1 W=1
nf=1 nf=1
mult=1 mult=1
ad=\\"'int((nf+1)/2) * W/nf * 0.29'\\" ad=\\"'int((nf+1)/2) * W/nf * 0.29'\\"
pd=\\"'2*int((nf+1)/2) * (W/nf + 0.29)'\\" pd=\\"'2*int((nf+1)/2) * (W/nf + 0.29)'\\"
as=\\"'int((nf+2)/2) * W/nf * 0.29'\\" as=\\"'int((nf+2)/2) * W/nf * 0.29'\\"
ps=\\"'2*int((nf+2)/2) * (W/nf + 0.29)'\\" ps=\\"'2*int((nf+2)/2) * (W/nf + 0.29)'\\"
nrd=\\"'0.29 / W'\\" nrs=\\"'0.29 / W'\\" nrd=\\"'0.29 / W'\\" nrs=\\"'0.29 / W'\\"
sa=0 sb=0 sd=0 sa=0 sb=0 sd=0

View File

@ -8,22 +8,22 @@ proc from_eng {i} {
set str [string tolower $str] set str [string tolower $str]
if { [regexp {^meg} $str] } { set str {meg} } else { if { [regexp {^meg} $str] } { set str {meg} } else {
set suffix [string index $str 0] set suffix [string index $str 0]
} }
set mult [switch $suffix { set mult [switch $suffix {
a { expr {1e-18}} a { expr {1e-18}}
f { expr {1e-15}} f { expr {1e-15}}
p { expr {1e-12}} p { expr {1e-12}}
n { expr { 1e-9}} n { expr { 1e-9}}
u { expr {1e-6}} u { expr {1e-6}}
m { expr {1e-3}} m { expr {1e-3}}
k { expr {1e3}} k { expr {1e3}}
meg { expr {1e6}} meg { expr {1e6}}
g { expr {1e9}} g { expr {1e9}}
t { expr {1e12}} t { expr {1e12}}
default { expr {1.0}} default { expr {1.0}}
}] }]
return [expr {$n * $mult}] return [expr {$n * $mult}]
} }
set arg1 [lindex $argv 0] set arg1 [lindex $argv 0]
if {$arg1 eq {}} { puts stderr "empty arg"; set arg1 1K} if {$arg1 eq {}} { puts stderr "empty arg"; set arg1 1K}

View File

@ -18,7 +18,7 @@ BEGIN{
print "C {" a "} " x*2000,y*2000, 0, 0, "{}" print "C {" a "} " x*2000,y*2000, 0, 0, "{}"
} }
close(command) close(command)

View File

@ -1,22 +1,22 @@
#!/usr/bin/awk -f #!/usr/bin/awk -f
# #
# File: viewdraw_import.awk # File: viewdraw_import.awk
# #
# This file is part of XSCHEM, # This file is part of XSCHEM,
# a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit # a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
# simulation. # simulation.
# Copyright (C) 1998-2021 Stefan Frederik Schippers # Copyright (C) 1998-2021 Stefan Frederik Schippers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@ -61,7 +61,7 @@ BEGIN{
# read viewdraw file, remove DOS cr characters # read viewdraw file, remove DOS cr characters
{ {
gsub(/\r/, "") gsub(/\r/, "")
line[lines++] = $0 line[lines++] = $0
} }
@ -390,7 +390,7 @@ function yscale(y)
return -y return -y
} }
# distance transformations (like circle radius) # distance transformations (like circle radius)
function lenscale(len) function lenscale(len)
{ {
return len return len
@ -420,7 +420,7 @@ function get_fields_after(n, str, nf, i, a, arr)
#used to poke what's next wihout advancing read to next line #used to poke what's next wihout advancing read to next line
function next_line() function next_line()
{ {
return line[lineno + 1] return line[lineno + 1]
} }
# xschem rectangle coordinates are ordered for efficiency reasons # xschem rectangle coordinates are ordered for efficiency reasons