object iterator, object spatial hash table for all objects. tbu in the future maybe. Fix crashing bug when copying ngspice_probe.sym if annotation is enabled

This commit is contained in:
stefan schippers 2023-11-09 13:57:58 +01:00
parent 35359aed20
commit 584f88fba1
9 changed files with 400 additions and 76 deletions

View File

@ -218,9 +218,6 @@ static void backannotate_at_cursor_b_pos(xRect *r, Graph_ctx *gr)
double xx, cursor2; /* xx is the p-th sweep variable value, cursor2 is cursor 'b' x position */
Raw *raw = xctx->raw;
int save_datasets = -1, save_npoints = -1;
/* transform multiple OP points into a dc sweep */
if(raw && raw->sim_type && !strcmp(raw->sim_type, "op") && raw->datasets > 1 && raw->npoints[0] == 1) {
save_datasets = raw->datasets;
@ -228,9 +225,6 @@ static void backannotate_at_cursor_b_pos(xRect *r, Graph_ctx *gr)
save_npoints = raw->npoints[0];
raw->npoints[0] = raw->allpoints;
}
sweep_idx = get_raw_index(find_nth(get_tok_value(r->prop_ptr, "sweep", 0), ", ", "\"", 0, 1));
if(sweep_idx < 0) sweep_idx = 0;
cursor2 = xctx->graph_cursor2_x;

View File

@ -134,3 +134,58 @@ Wireentry *wire_iterator_next(Iterator_ctx *ctx)
}
void init_object_iterator(Iterator_ctx *ctx, double x1, double y1, double x2, double y2)
{
ctx->objectflag = NULL;
dbg(3, "init_object_iterator(): objects=%d\n", xctx->n_hash_objects);
if(xctx->n_hash_objects) {
my_realloc(_ALLOC_ID_, &ctx->objectflag, xctx->n_hash_objects * sizeof(unsigned short));
memset(ctx->objectflag, 0, xctx->n_hash_objects * sizeof(unsigned short));
}
/* calculate square 4 1st corner of drawing area */
ctx->x1a = (int)floor(x1 / BOXSIZE) ;
ctx->y1a = (int)floor(y1 / BOXSIZE) ;
/* calculate square 4 2nd corner of drawing area */
ctx->x2a = (int)floor(x2 / BOXSIZE);
ctx->y2a = (int)floor(y2 / BOXSIZE);
ctx->i = ctx->x1a;
ctx->j = ctx->y1a;
ctx->tmpi = ctx->i % NBOXES; if(ctx->tmpi < 0) ctx->tmpi += NBOXES;
ctx->tmpj = ctx->j % NBOXES; if(ctx->tmpj < 0) ctx->tmpj += NBOXES;
ctx->counti = 0;
ctx->objectptr = xctx->object_spatial_table[ctx->tmpi][ctx->tmpj];
ctx->countj = 0;
}
Objectentry *object_iterator_next(Iterator_ctx *ctx)
{
Objectentry *ptr;
/* dbg(3, "object_iterator_next(): obhjects=%d\n", xctx->n_hash_objects); */
while(1) {
while(ctx->objectptr) {
ptr = ctx->objectptr;
ctx->objectptr = ctx->objectptr->next;
if(!ctx->objectflag[ptr->n]) {
ctx->objectflag[ptr->n] = 1;
return ptr;
}
}
if(ctx->j < ctx->y2a && ctx->countj++ < NBOXES) {
ctx->j++;
ctx->tmpj = ctx->j % NBOXES; if(ctx->tmpj < 0) ctx->tmpj += NBOXES;
ctx->objectptr = xctx->object_spatial_table[ctx->tmpi][ctx->tmpj];
} else if(ctx->i < ctx->x2a && ctx->counti++ < NBOXES) {
ctx->i++;
ctx->j = ctx->y1a;
ctx->countj = 0;
ctx->tmpi = ctx->i % NBOXES; if(ctx->tmpi < 0) ctx->tmpi += NBOXES;
ctx->tmpj = ctx->j % NBOXES; if(ctx->tmpj < 0) ctx->tmpj += NBOXES;
ctx->objectptr = xctx->object_spatial_table[ctx->tmpi][ctx->tmpj];
} else {
my_free(_ALLOC_ID_, &ctx->objectflag);
return NULL;
}
}
}

View File

@ -112,6 +112,7 @@ void hash_inst(int what, int n) /* 20171203 insert object bbox in spatial hash t
}
}
}
void hash_instances(void) /* 20171203 insert object bbox in spatial hash table */
{
int n;
@ -124,6 +125,185 @@ void hash_instances(void) /* 20171203 insert object bbox in spatial hash table *
xctx->prep_hash_inst=1;
}
/* START HASH ALL OBJECTS */
static Objectentry *delobjectentry(Objectentry *t)
{
Objectentry *tmp;
while( t ) {
tmp = t->next;
my_free(_ALLOC_ID_, &t);
t = tmp;
}
return NULL;
}
void del_object_table(void)
{
int i,j;
for(i=0;i<NBOXES; ++i)
for(j=0;j<NBOXES; ++j)
xctx->object_spatial_table[i][j] = delobjectentry(xctx->object_spatial_table[i][j]);
xctx->prep_hash_object=0;
xctx->n_hash_objects = 0;
dbg(1, "del_object_table(): cleared object hash table\n");
}
static void objectdelete(int type, int n, int c, int x, int y)
{
Objectentry *saveptr, **prevptr;
prevptr = &xctx->object_spatial_table[x][y];
while( (*prevptr)->type != type || (*prevptr)->n != n || (*prevptr)->c != c) prevptr = &(*prevptr)->next;
saveptr = (*prevptr)->next;
my_free(_ALLOC_ID_, prevptr);
*prevptr = saveptr;
}
static void objectinsert(int type, int n, int c, int x, int y)
{
Objectentry *ptr, *newptr;
ptr=xctx->object_spatial_table[x][y];
newptr=my_malloc(_ALLOC_ID_, sizeof(Instentry));
newptr->next=ptr;
newptr->type=type;
newptr->n=n;
newptr->c=c;
xctx->object_spatial_table[x][y]=newptr;
dbg(2, "objectnsert(): inserting object %d %d %d at %d,%d\n",type, n, c, x, y);
}
/* what:
* 0, XINSERT : add to hash
* 1, XDELETE : remove from hash
*/
void hash_object(int what, int type, int n, int c)
{
int tmpi,tmpj, counti,countj,i,j;
double tmpd;
double x1, y1, x2, y2;
int x1a, x2a, y1a, y2a;
int skip = 0;
switch(type) {
case ELEMENT:
x1=xctx->inst[n].x1;
x2=xctx->inst[n].x2;
y1=xctx->inst[n].y1;
y2=xctx->inst[n].y2;
break;
case xRECT:
x1 = xctx->rect[c][n].x1;
y1 = xctx->rect[c][n].y1;
x2 = xctx->rect[c][n].x2;
y2 = xctx->rect[c][n].y2;
break;
case WIRE:
x1 = xctx->wire[n].x1;
y1 = xctx->wire[n].y1;
x2 = xctx->wire[n].x2;
y2 = xctx->wire[n].y2;
break;
case LINE:
x1 = xctx->line[c][n].x1;
y1 = xctx->line[c][n].y1;
x2 = xctx->line[c][n].x2;
y2 = xctx->line[c][n].y2;
break;
case POLYGON:
polygon_bbox(xctx->poly[c][n].x, xctx->poly[c][n].y, xctx->poly[c][n].points, &x1, &y1, &x2, &y2);
break;
case ARC:
arc_bbox(xctx->arc[c][n].x, xctx->arc[c][n].y, xctx->arc[c][n].r,
xctx->arc[c][n].a, xctx->arc[c][n].b, &x1, &y1, &x2, &y2);
break;
case xTEXT:
text_bbox(get_text_floater(n),
xctx->text[n].xscale, xctx->text[n].yscale, xctx->text[n].rot, xctx->text[n].flip,
xctx->text[n].hcenter, xctx->text[n].vcenter,
xctx->text[n].x0, xctx->text[n].y0,
&x1,&y1, &x2,&y2, &tmpi, &tmpd);
break;
default:
skip = 1;
x1 = 0.0;
y1 = 0.0;
x2 = 0.0;
y2 = 0.0;
break;
}
if(skip) return;
xctx->n_hash_objects++; /* total number of objects in spatial hash table */
/* ordered bbox */
if( x2 < x1) { tmpd=x2;x2=x1;x1=tmpd;}
if( y2 < y1) { tmpd=y2;y2=y1;y1=tmpd;}
/* calculate square 4 1st bbox point of object[k] */
x1a=(int)floor(x1/BOXSIZE);
y1a=(int)floor(y1/BOXSIZE);
/* calculate square 4 2nd bbox point of object[k] */
x2a=(int)floor(x2/BOXSIZE);
y2a=(int)floor(y2/BOXSIZE);
/*loop thru all squares that intersect bbox of object[k] */
counti=0;
for(i=x1a; i<=x2a && counti < NBOXES; ++i)
{
++counti;
tmpi=i%NBOXES; if(tmpi<0) tmpi+=NBOXES;
countj=0;
for(j=y1a; j<=y2a && countj < NBOXES; ++j)
{
++countj;
tmpj=j%NBOXES; if(tmpj<0) tmpj+=NBOXES;
/* insert object_ptr[n] in region [tmpi, tmpj] */
if(what == XINSERT) objectinsert(type, n, c, tmpi, tmpj);
else objectdelete(type, n, c, tmpi, tmpj);
}
}
}
void hash_objects(void) /* 20171203 insert object bbox in spatial hash table */
{
int n, c;
if(xctx->prep_hash_object) return;
del_object_table();
for(n=0; n<xctx->instances; ++n) {
hash_object(XINSERT, ELEMENT, n, 0);
}
for(n=0; n<xctx->wires; ++n) {
hash_object(XINSERT, WIRE, n, 0);
}
for(n=0; n<xctx->texts; ++n) {
hash_object(XINSERT, xTEXT, n, 0);
}
for(c=0;c<cadlayers; ++c)
{
for(n=0; n<xctx->rects[c]; n++) {
hash_object(XINSERT, xRECT, n, c);
}
for(n=0; n<xctx->lines[c]; n++) {
hash_object(XINSERT, LINE, n, c);
}
for(n=0; n<xctx->arcs[c]; n++) {
hash_object(XINSERT, ARC, n, c);
}
for(n=0; n<xctx->polygons[c]; n++) {
hash_object(XINSERT, POLYGON, n, c);
}
}
xctx->prep_hash_object=1;
}
/* END HASH ALL OBJECTS */
static void instpindelete(int n,int pin, int x, int y)
{
Instpinentry *saveptr, **prevptr, *ptr;

View File

@ -4643,9 +4643,49 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
/* test
* Testmode ... */
else if(!strcmp(argv[1], "test") )
else if(0 && !strcmp(argv[1], "test") )
{
Iterator_ctx ctx;
Objectentry *objectptr;
int type, n, c;
if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
hash_objects();
dbg(0, "n_hash_objects=%d\n", xctx->n_hash_objects);
for(init_object_iterator(&ctx, 1000., -1000., 2000., -400.); (objectptr = object_iterator_next(&ctx)) ;) {
type = objectptr->type;
n = objectptr->n;
c = objectptr->c;
dbg(0, "type=%d, n=%d c=%d\n", type, n, c);
switch(type) {
case ELEMENT:
select_element(n, SELECTED, 1, 1);
break;
case WIRE:
select_wire(n, SELECTED, 1);
break;
case xTEXT:
select_text(n, SELECTED, 1);
break;
case xRECT:
select_box(c, n, SELECTED, 1, 0);
break;
case LINE:
select_line(c, n, SELECTED, 1);
break;
case POLYGON:
select_polygon(c, n, SELECTED, 1);
break;
case ARC:
select_arc(c, n, SELECTED, 1);
break;
}
}
rebuild_selected_array();
draw();
del_object_table();
Tcl_ResetResult(interp);
}

View File

@ -1260,21 +1260,29 @@ void select_inside(double x1,double y1, double x2, double y2, int sel) /*added u
en_s = tclgetboolvar("enable_stretch");
for(i=0;i<xctx->wires; ++i)
{
if(RECT_INSIDE(xctx->wire[i].x1,xctx->wire[i].y1,xctx->wire[i].x2,xctx->wire[i].y2, x1,y1,x2,y2))
{
xctx->ui_state |= SELECTION; /* set xctx->ui_state to SELECTION also if unselecting by area ???? */
sel ? select_wire(i,SELECTED, 1): select_wire(i,0, 1);
}
else if( sel && en_s && POINTINSIDE(xctx->wire[i].x1,xctx->wire[i].y1, x1,y1,x2,y2) )
{
xctx->ui_state |= SELECTION;
select_wire(i,SELECTED1, 1);
}
else if( sel && en_s && POINTINSIDE(xctx->wire[i].x2,xctx->wire[i].y2, x1,y1,x2,y2) )
{
xctx->ui_state |= SELECTION;
select_wire(i,SELECTED2, 1);
}
if(sel) {
if(RECT_INSIDE(xctx->wire[i].x1,xctx->wire[i].y1,xctx->wire[i].x2,xctx->wire[i].y2, x1,y1,x2,y2))
{
xctx->ui_state |= SELECTION; /* set xctx->ui_state to SELECTION also if unselecting by area ???? */
select_wire(i, SELECTED, 1);
}
else if(en_s && POINTINSIDE(xctx->wire[i].x1,xctx->wire[i].y1, x1,y1,x2,y2) )
{
xctx->ui_state |= SELECTION;
select_wire(i, SELECTED1, 1);
}
else if(en_s && POINTINSIDE(xctx->wire[i].x2,xctx->wire[i].y2, x1,y1,x2,y2) )
{
xctx->ui_state |= SELECTION;
select_wire(i, SELECTED2, 1);
}
} else {
if(RECT_INSIDE(xctx->wire[i].x1,xctx->wire[i].y1,xctx->wire[i].x2,xctx->wire[i].y2, x1,y1,x2,y2))
{
xctx->ui_state |= SELECTION; /* set xctx->ui_state to SELECTION also if unselecting by area ???? */
select_wire(i, 0, 1);
}
}
}
for(i=0;i<xctx->texts; ++i)
{
@ -1302,17 +1310,25 @@ void select_inside(double x1,double y1, double x2, double y2, int sel) /*added u
}
for(i=0;i<xctx->instances; ++i)
{
if(RECT_INSIDE(xctx->inst[i].xx1, xctx->inst[i].yy1, xctx->inst[i].xx2, xctx->inst[i].yy2, x1,y1,x2,y2))
{
xctx->ui_state |= SELECTION; /* set xctx->ui_state to SELECTION also if unselecting by area ???? */
if(sel) {
if(strboolcmp(get_tok_value(xctx->inst[i].prop_ptr, "lock", 0), "true")) {
select_element(i, SELECTED, 1, 1);
if(RECT_INSIDE(xctx->inst[i].xx1, xctx->inst[i].yy1, xctx->inst[i].xx2, xctx->inst[i].yy2, x1,y1,x2,y2))
{
xctx->ui_state |= SELECTION; /* set xctx->ui_state to SELECTION also if unselecting by area ???? */
if(sel) {
if(strboolcmp(get_tok_value(xctx->inst[i].prop_ptr, "lock", 0), "true")) {
select_element(i, SELECTED, 1, 1);
}
} else {
select_element(i, 0, 1, 0);
}
} else {
select_element(i, 0, 1, 0);
}
}
#if 0
else {
xctx->ui_state |= SELECTION; /* set xctx->ui_state to SELECTION also if unselecting by area ???? */
if(sel) {
select_element(i, 0, 1, 0);
}
}
#endif
}
for(c=0;c<cadlayers; ++c)
{
@ -1348,21 +1364,29 @@ void select_inside(double x1,double y1, double x2, double y2, int sel) /*added u
}
for(i=0;i<xctx->lines[c]; ++i)
{
if(RECT_INSIDE(xctx->line[c][i].x1,xctx->line[c][i].y1,xctx->line[c][i].x2,xctx->line[c][i].y2, x1,y1,x2,y2))
{
xctx->ui_state |= SELECTION;
sel? select_line(c,i,SELECTED,1): select_line(c,i,0,1);
}
else if( sel && en_s && POINTINSIDE(xctx->line[c][i].x1,xctx->line[c][i].y1, x1,y1,x2,y2) )
{
xctx->ui_state |= SELECTION; /* set xctx->ui_state to SELECTION also if unselecting by area ???? */
select_line(c, i,SELECTED1,1);
}
else if( sel && en_s && POINTINSIDE(xctx->line[c][i].x2,xctx->line[c][i].y2, x1,y1,x2,y2) )
{
xctx->ui_state |= SELECTION;
select_line(c, i,SELECTED2,1);
}
if(sel) {
if(RECT_INSIDE(xctx->line[c][i].x1,xctx->line[c][i].y1,xctx->line[c][i].x2,xctx->line[c][i].y2, x1,y1,x2,y2))
{
xctx->ui_state |= SELECTION;
select_line(c,i,SELECTED,1);
}
else if(en_s && POINTINSIDE(xctx->line[c][i].x1,xctx->line[c][i].y1, x1,y1,x2,y2) )
{
xctx->ui_state |= SELECTION; /* set xctx->ui_state to SELECTION also if unselecting by area ???? */
select_line(c, i,SELECTED1,1);
}
else if(en_s && POINTINSIDE(xctx->line[c][i].x2,xctx->line[c][i].y2, x1,y1,x2,y2) )
{
xctx->ui_state |= SELECTION;
select_line(c, i,SELECTED2,1);
}
} else {
if(RECT_INSIDE(xctx->line[c][i].x1,xctx->line[c][i].y1,xctx->line[c][i].x2,xctx->line[c][i].y2, x1,y1,x2,y2))
{
xctx->ui_state |= SELECTION;
select_line(c,i,0,1);
}
}
}
for(i=0;i<xctx->arcs[c]; ++i) {
x = xctx->arc[c][i].x;

View File

@ -3618,7 +3618,7 @@ const char *translate(int inst, const char* s)
if(net == NULL || net[0] == '\0') {
my_strdup2(_ALLOC_ID_, &net, net_name(inst, 0, &multip, 0, 0));
}
if(multip == 1) {
if(multip == 1 && net && net[0] && path) {
char *rn;
len = strlen(path) + strlen(net) + 1;
dbg(1, "translate() @spice_get_voltage: inst=%s\n", instname);
@ -3629,31 +3629,33 @@ const char *translate(int inst, const char* s)
*/
rn = resolved_net(net);
my_strdup2(_ALLOC_ID_, &fqnet, rn);
if(rn) my_free(_ALLOC_ID_, &rn);
strtolower(fqnet);
dbg(1, "translate() @spice_get_voltage: fqnet=%s start_level=%d\n", fqnet, start_level);
idx = get_raw_index(fqnet);
if(idx >= 0) {
val = xctx->raw->cursor_b_val[idx];
if(rn) {
my_strdup2(_ALLOC_ID_, &fqnet, rn);
if(rn) my_free(_ALLOC_ID_, &rn);
strtolower(fqnet);
dbg(1, "translate() @spice_get_voltage: fqnet=%s start_level=%d\n", fqnet, start_level);
idx = get_raw_index(fqnet);
if(idx >= 0) {
val = xctx->raw->cursor_b_val[idx];
}
if(idx < 0) {
valstr = "";
xctx->tok_size = 0;
len = 0;
} else {
valstr = dtoa_eng(val);
len = xctx->tok_size;
}
if(len) {
STR_ALLOC(&result, len + result_pos, &size);
memcpy(result+result_pos, valstr, len+1);
result_pos += len;
}
dbg(1, "inst %d, net=%s, fqnet=%s idx=%d valstr=%s\n", inst, net, fqnet, idx, valstr);
if(fqnet) my_free(_ALLOC_ID_, &fqnet);
}
if(idx < 0) {
valstr = "";
xctx->tok_size = 0;
len = 0;
} else {
valstr = dtoa_eng(val);
len = xctx->tok_size;
}
if(len) {
STR_ALLOC(&result, len + result_pos, &size);
memcpy(result+result_pos, valstr, len+1);
result_pos += len;
}
dbg(1, "inst %d, net=%s, fqnet=%s idx=%d valstr=%s\n", inst, net, fqnet, idx, valstr);
my_free(_ALLOC_ID_, &fqnet);
}
my_free(_ALLOC_ID_, &net);
if(net) my_free(_ALLOC_ID_, &net);
}
}
}

View File

@ -483,6 +483,7 @@ static void alloc_xschem_data(const char *top_path, const char *win_path)
xctx->simdata = NULL;
xctx->simdata_ninst = 0;
xctx->prep_hash_inst = 0;
xctx->prep_hash_object = 0;
xctx->prep_hash_wires = 0;
xctx->modified = 0;
xctx->semaphore = 0;
@ -499,8 +500,10 @@ static void alloc_xschem_data(const char *top_path, const char *win_path)
xctx->instpin_spatial_table[i][j] = NULL;
xctx->wire_spatial_table[i][j] = NULL;
xctx->inst_spatial_table[i][j] = NULL;
xctx->object_spatial_table[i][j] = NULL;
}
}
xctx->n_hash_objects = 0;
xctx->node_table = my_calloc(_ALLOC_ID_, HASHSIZE, sizeof(Node_hashentry *));
xctx->inst_name_table.table = NULL;
xctx->inst_name_table.size = 0;

View File

@ -811,6 +811,17 @@ struct instentry
int n;
};
typedef struct objectentry Objectentry;
struct objectentry
{
struct objectentry *next;
int type;
int n;
int c;
};
typedef struct
{
int x1a, x2a;
@ -819,8 +830,10 @@ typedef struct
int tmpi, tmpj;
Instentry *instanceptr;
Wireentry *wireptr;
Objectentry *objectptr;
unsigned short *instflag;
unsigned short *wireflag;
unsigned short *objectflag;
} Iterator_ctx;
@ -920,6 +933,7 @@ typedef struct {
int prep_net_structs;
int prep_hi_structs;
int prep_hash_inst;
int prep_hash_object;
int prep_hash_wires;
Simdata *simdata;
int simdata_ninst;
@ -932,6 +946,8 @@ typedef struct {
Instpinentry *instpin_spatial_table[NBOXES][NBOXES];
Wireentry *wire_spatial_table[NBOXES][NBOXES];
Instentry *inst_spatial_table[NBOXES][NBOXES];
Objectentry *object_spatial_table[NBOXES][NBOXES]; /* spatial hash table for all objects (rect selection) */
int n_hash_objects; /* total number of objects in object_spatial_table */
Window window;
Pixmap save_pixmap;
XRectangle xrect[1];
@ -1291,13 +1307,20 @@ extern int text_bbox(const char * str,double xscale, double yscale,
extern int get_color(int value);
extern void incr_hilight_color(void);
extern void hash_inst(int what, int n);
extern void get_inst_pin_coord(int i, int j, double *x, double *y);
extern void del_inst_table(void);
extern void hash_wires(void);
extern void hash_wire(int what, int n, int incremental);
extern void hash_inst(int what, int n);
extern void hash_instances(void); /* 20171203 insert instance bbox in spatial hash table */
extern void del_wire_table(void);
extern void hash_wire(int what, int n, int incremental);
extern void hash_wires(void);
extern void del_object_table(void);
extern void hash_object(int what, int type, int n, int c);
extern void hash_objects(void); /* hash all objects */
#if HAS_CAIRO==1
extern cairo_status_t png_reader(void* in_closure, unsigned char* out_data, unsigned int length);
extern int text_bbox_nocairo(const char * str,double xscale, double yscale,
@ -1489,8 +1512,13 @@ extern int create_text(int draw_text, double x, double y, int rot, int flip, con
const char *props, double hsize, double vsize);
extern void init_inst_iterator(Iterator_ctx *ctx, double x1, double y1, double x2, double y2);
extern Instentry *inst_iterator_next(Iterator_ctx *ctx);
extern void init_wire_iterator(Iterator_ctx *ctx, double x1, double y1, double x2, double y2);
extern Wireentry *wire_iterator_next(Iterator_ctx *ctx);
extern void init_object_iterator(Iterator_ctx *ctx, double x1, double y1, double x2, double y2);
extern Objectentry *object_iterator_next(Iterator_ctx *ctx);
extern void check_unique_names(int rename);
extern unsigned int str_hash(const char *tok);
@ -1647,8 +1675,6 @@ extern void set_clip_mask(int what);
extern int pending_events(void);
#endif
extern void get_square(double x, double y, int *xx, int *yy);
extern void del_wire_table(void);
extern void del_object_table(void);
extern const char *create_tmpdir(char *prefix);
extern FILE *open_tmpfile(char *prefix, char **filename);
extern void create_ps(char** psfile, int what, int fullzoom);

View File

@ -2442,7 +2442,7 @@ proc graph_edit_properties {n} {
entry .graphdialog.center.right.rawentry -width 30
button .graphdialog.center.right.rawbut -text {Raw file:} -command {
.graphdialog.center.right.rawentry delete 0 end
.graphdialog.center.right.rawentry insert 0 [select_raw]
.graphdialog.center.right.rawentry insert 0 [string map [list $netlist_dir {$netlist_dir}] [select_raw]]
xschem setprop rect 2 $graph_selected rawfile [.graphdialog.center.right.rawentry get] fast
xschem setprop rect 2 $graph_selected sim_type [.graphdialog.center.right.list get] fast
if {[file_exists [.graphdialog.center.right.rawentry get]]} {