do not perform tcl substitution before displaying netlist_commands text into an editor. Correctly restore xctx->current_dirname after netlisting. get_generator_command(): quote command name (just in case its pathname contains spaces). floater example labels in solar_panel.sch. Various corrections and optimizations in new floater labels code.

This commit is contained in:
stefan schippers 2023-05-14 01:13:18 +02:00
parent ee1979b8b2
commit 9fcde30a52
12 changed files with 233 additions and 195 deletions

View File

@ -92,7 +92,9 @@ int there_are_floaters(void)
}
/* mod=-1 used to force set title
* mod=-2 used to reset floaters cache */
* mod=-2 used to reset floaters cache
* if floaters are present set_modify(1) (after a modify opration) must be done before draw()
* to invalidate cached floater string values before redrawing*/
void set_modify(int mod)
{
int i, floaters = 0;
@ -104,7 +106,7 @@ void set_modify(int mod)
/* hash instance names if there are (many) floaters and many instances for faster lookup */
for(i = 0; i < xctx->texts; i++)
if(xctx->text[i].flags & TEXT_FLOATER) {
floaters++;
floaters++;
my_free(_ALLOC_ID_, &xctx->text[i].floater_ptr); /* clear floater cached value */
my_free(_ALLOC_ID_, &xctx->text[i].floater_instname); /* clear floater cached value */
}
@ -1855,15 +1857,8 @@ void calc_drawing_bbox(xRect *boundbox, int selected)
updatebbox(count,boundbox,&rect);
}
if(has_x && selected != 2) {
int floaters = 0;
/* hash instance names if there are (many) floaters and many instances for faster lookup */
if(xctx->floater_inst_table.table == NULL) {
for(i = 0; i < xctx->texts; i++) {
if(xctx->text[i].flags & TEXT_FLOATER) {
floaters++;
}
}
if(floaters) {
if(there_are_floaters()) {
floater_hash_all_names();
}
}

View File

@ -1477,7 +1477,7 @@ static int edit_symbol_property(int x)
!strcmp( (xctx->inst[*ii].ptr+ xctx->sym)->type, "netlist_commands");
if(xctx->inst[*ii].prop_ptr!=NULL) {
if(*netl_com && x==1) {
tclsetvar("retval",get_tok_value( xctx->inst[*ii].prop_ptr,"value",0));
tclsetvar("retval",get_tok_value( xctx->inst[*ii].prop_ptr,"value",2));
} else {
tclsetvar("retval",xctx->inst[*ii].prop_ptr);
}

View File

@ -552,4 +552,7 @@ void mem_pop_undo(int redo, int set_modify_status)
xctx->prep_net_structs = 0;
xctx->prep_hi_structs = 0;
update_conn_cues(WIRELAYER, 0, 0);
if(there_are_floaters()) {
floater_hash_all_names();
}
}

View File

@ -946,9 +946,6 @@ void copy_objects(int what)
} /* end for(k=0;k<cadlayers; ++k) */
for(i = 0; i < xctx->lastsel; ++i) {
n = xctx->sel_array[i].n;
if(xctx->sel_array[i].type == ELEMENT) {
@ -1016,7 +1013,7 @@ void copy_objects(int what)
xctx->ui_state &= ~STARTCOPY;
xctx->x1 = xctx->y_1 = xctx->x2 = xctx->y_2 = xctx->deltax = xctx->deltay = 0;
xctx->move_rot = xctx->move_flip = 0;
set_modify(1);
set_modify(1); /* must be done before draw() if floaters are present to force cached values update */
if(!floaters) bbox(SET , 0.0 , 0.0 , 0.0 , 0.0);
draw();
if(!floaters) bbox(END , 0.0 , 0.0 , 0.0 , 0.0);
@ -1088,8 +1085,9 @@ void move_objects(int what, int merge, double dx, double dy)
if(what & END) /* move selected objects */
{
int firsti, firstw;
int floaters = there_are_floaters();
bbox(START, 0.0 , 0.0 , 0.0 , 0.0);
if(!floaters) bbox(START, 0.0 , 0.0 , 0.0 , 0.0);
/* no undo push for MERGE ad PLACE, already done before */
if( !xctx->kissing && !(xctx->ui_state & (STARTMERGE | PLACE_SYMBOL | PLACE_TEXT)) ) {
dbg(1, "move_objects(): push undo state\n");
@ -1111,7 +1109,7 @@ void move_objects(int what, int merge, double dx, double dy)
firsti = firstw = 1;
draw_selection(xctx->gctiled,0);
update_symbol_bboxes(0, 0);
find_inst_to_be_redrawn(0); /* build list before moving and recalculating prepare_netlist_structs() */
if(!floaters) find_inst_to_be_redrawn(0); /* build list before moving and recalculating prepare_netlist_structs() */
for(k=0;k<cadlayers; ++k)
{
for(i=0;i<xctx->lastsel; ++i)
@ -1129,13 +1127,13 @@ void move_objects(int what, int merge, double dx, double dy)
ov = INT_BUS_WIDTH(xctx->lw)> cadhalfdotsize ? INT_BUS_WIDTH(xctx->lw) : CADHALFDOTSIZE;
if(wire[n].y1 < wire[n].y2) { y1 = wire[n].y1-ov; y2 = wire[n].y2+ov; }
else { y1 = wire[n].y1+ov; y2 = wire[n].y2-ov; }
bbox(ADD, wire[n].x1-ov, y1 , wire[n].x2+ov , y2 );
if(!floaters) bbox(ADD, wire[n].x1-ov, y1 , wire[n].x2+ov , y2 );
} else {
double ov, y1, y2;
ov = cadhalfdotsize;
if(wire[n].y1 < wire[n].y2) { y1 = wire[n].y1-ov; y2 = wire[n].y2+ov; }
else { y1 = wire[n].y1+ov; y2 = wire[n].y2-ov; }
bbox(ADD, wire[n].x1-ov, y1 , wire[n].x2+ov , y2 );
if(!floaters) bbox(ADD, wire[n].x1-ov, y1 , wire[n].x2+ov , y2 );
}
if(xctx->rotatelocal) {
@ -1177,13 +1175,13 @@ void move_objects(int what, int merge, double dx, double dy)
ov = INT_BUS_WIDTH(xctx->lw)> cadhalfdotsize ? INT_BUS_WIDTH(xctx->lw) : CADHALFDOTSIZE;
if(wire[n].y1 < wire[n].y2) { y1 = wire[n].y1-ov; y2 = wire[n].y2+ov; }
else { y1 = wire[n].y1+ov; y2 = wire[n].y2-ov; }
bbox(ADD, wire[n].x1-ov, y1 , wire[n].x2+ov , y2 );
if(!floaters) bbox(ADD, wire[n].x1-ov, y1 , wire[n].x2+ov , y2 );
} else {
double ov, y1, y2;
ov = cadhalfdotsize;
if(wire[n].y1 < wire[n].y2) { y1 = wire[n].y1-ov; y2 = wire[n].y2+ov; }
else { y1 = wire[n].y1+ov; y2 = wire[n].y2-ov; }
bbox(ADD, wire[n].x1-ov, y1 , wire[n].x2+ov , y2 );
if(!floaters) bbox(ADD, wire[n].x1-ov, y1 , wire[n].x2+ov , y2 );
}
}
break;
@ -1196,14 +1194,14 @@ void move_objects(int what, int merge, double dx, double dy)
if(xctx->line[c][n].y1 < xctx->line[c][n].y2)
{ y1 = xctx->line[c][n].y1-ov; y2 = xctx->line[c][n].y2+ov; }
else { y1 = xctx->line[c][n].y1+ov; y2 = xctx->line[c][n].y2-ov; }
bbox(ADD, xctx->line[c][n].x1-ov, y1 , xctx->line[c][n].x2+ov , y2 );
if(!floaters) bbox(ADD, xctx->line[c][n].x1-ov, y1 , xctx->line[c][n].x2+ov , y2 );
} else {
double ov, y1, y2;
ov = cadhalfdotsize;
if(xctx->line[c][n].y1 < xctx->line[c][n].y2)
{ y1 = xctx->line[c][n].y1-ov; y2 = xctx->line[c][n].y2+ov; }
else { y1 = xctx->line[c][n].y1+ov; y2 = xctx->line[c][n].y2-ov; }
bbox(ADD, xctx->line[c][n].x1-ov, y1 , xctx->line[c][n].x2+ov , y2 );
if(!floaters) bbox(ADD, xctx->line[c][n].x1-ov, y1 , xctx->line[c][n].x2+ov , y2 );
}
if(xctx->rotatelocal) {
@ -1247,14 +1245,14 @@ void move_objects(int what, int merge, double dx, double dy)
if(xctx->line[c][n].y1 < xctx->line[c][n].y2)
{ y1 = xctx->line[c][n].y1-ov; y2 = xctx->line[c][n].y2+ov; }
else { y1 = xctx->line[c][n].y1+ov; y2 = xctx->line[c][n].y2-ov; }
bbox(ADD, xctx->line[c][n].x1-ov, y1 , xctx->line[c][n].x2+ov , y2 );
if(!floaters) bbox(ADD, xctx->line[c][n].x1-ov, y1 , xctx->line[c][n].x2+ov , y2 );
} else {
double ov, y1, y2;
ov = cadhalfdotsize;
if(xctx->line[c][n].y1 < xctx->line[c][n].y2)
{ y1 = xctx->line[c][n].y1-ov; y2 = xctx->line[c][n].y2+ov; }
else { y1 = xctx->line[c][n].y1+ov; y2 = xctx->line[c][n].y2-ov; }
bbox(ADD, xctx->line[c][n].x1-ov, y1 , xctx->line[c][n].x2+ov , y2 );
if(!floaters) bbox(ADD, xctx->line[c][n].x1-ov, y1 , xctx->line[c][n].x2+ov , y2 );
}
break;
@ -1287,7 +1285,7 @@ void move_objects(int what, int merge, double dx, double dy)
}
}
bbox(ADD, bx1, by1, bx2, by2); /* bbox before move */
if(!floaters) bbox(ADD, bx1, by1, bx2, by2); /* bbox before move */
for(j=0; j<p->points; ++j) {
if(j==0 || p->x[j] < bx1) bx1 = p->x[j];
@ -1295,21 +1293,23 @@ void move_objects(int what, int merge, double dx, double dy)
if(j==0 || p->x[j] > bx2) bx2 = p->x[j];
if(j==0 || p->y[j] > by2) by2 = p->y[j];
}
bbox(ADD, bx1, by1, bx2, by2); /* bbox after move */
if(!floaters) bbox(ADD, bx1, by1, bx2, by2); /* bbox after move */
}
break;
case ARC:
if(c!=k) break;
if(xctx->arc[c][n].fill) /* bbox before move */
arc_bbox(xctx->arc[c][n].x, xctx->arc[c][n].y, xctx->arc[c][n].r, 0, 360,
&tmp.x1, &tmp.y1, &tmp.x2, &tmp.y2);
else
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,
&tmp.x1, &tmp.y1, &tmp.x2, &tmp.y2);
bbox(ADD, tmp.x1, tmp.y1, tmp.x2, tmp.y2);
if(!floaters) {
if(xctx->arc[c][n].fill) {/* bbox before move */
arc_bbox(xctx->arc[c][n].x, xctx->arc[c][n].y, xctx->arc[c][n].r,
0, 360, &tmp.x1, &tmp.y1, &tmp.x2, &tmp.y2);
} else {
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, &tmp.x1, &tmp.y1, &tmp.x2, &tmp.y2);
}
bbox(ADD, tmp.x1, tmp.y1, tmp.x2, tmp.y2);
}
if(xctx->rotatelocal) {
/* rotate center wrt itself: do nothing */
@ -1352,21 +1352,23 @@ void move_objects(int what, int merge, double dx, double dy)
xctx->arc[c][n].b = angle;
}
if(xctx->arc[c][n].fill) /* bbox after move */
arc_bbox(xctx->arc[c][n].x, xctx->arc[c][n].y, xctx->arc[c][n].r, 0, 360,
&tmp.x1, &tmp.y1, &tmp.x2, &tmp.y2);
else
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,
&tmp.x1, &tmp.y1, &tmp.x2, &tmp.y2);
bbox(ADD, tmp.x1, tmp.y1, tmp.x2, tmp.y2);
if(!floaters) {
if(xctx->arc[c][n].fill) {/* bbox after move */
arc_bbox(xctx->arc[c][n].x, xctx->arc[c][n].y, xctx->arc[c][n].r,
0, 360, &tmp.x1, &tmp.y1, &tmp.x2, &tmp.y2);
} else {
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, &tmp.x1, &tmp.y1, &tmp.x2, &tmp.y2);
}
bbox(ADD, tmp.x1, tmp.y1, tmp.x2, tmp.y2);
}
break;
case xRECT:
if(c!=k) break;
/* bbox before move */
bbox(ADD, xctx->rect[c][n].x1, xctx->rect[c][n].y1, xctx->rect[c][n].x2, xctx->rect[c][n].y2);
if(!floaters) bbox(ADD, xctx->rect[c][n].x1, xctx->rect[c][n].y1, xctx->rect[c][n].x2, xctx->rect[c][n].y2);
if(xctx->rotatelocal) {
ROTATION(xctx->move_rot, xctx->move_flip, xctx->rect[c][n].x1, xctx->rect[c][n].y1,
xctx->rect[c][n].x1, xctx->rect[c][n].y1, xctx->rx1,xctx->ry1);
@ -1441,7 +1443,7 @@ void move_objects(int what, int merge, double dx, double dy)
xctx->rect[c][n].y2 = xctx->ry2;
/* bbox after move */
bbox(ADD, xctx->rect[c][n].x1, xctx->rect[c][n].y1, xctx->rect[c][n].x2, xctx->rect[c][n].y2);
if(!floaters) bbox(ADD, xctx->rect[c][n].x1, xctx->rect[c][n].y1, xctx->rect[c][n].x2, xctx->rect[c][n].y2);
break;
case xTEXT:
@ -1458,7 +1460,7 @@ void move_objects(int what, int merge, double dx, double dy)
cairo_restore(xctx->cairo_ctx);
}
#endif
bbox(ADD, xctx->rx1, xctx->ry1, xctx->rx2, xctx->ry2 );
if(!floaters) bbox(ADD, xctx->rx1, xctx->ry1, xctx->rx2, xctx->ry2 );
if(xctx->rotatelocal) {
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);
@ -1484,7 +1486,7 @@ void move_objects(int what, int merge, double dx, double dy)
cairo_restore(xctx->cairo_ctx);
}
#endif
bbox(ADD, xctx->rx1, xctx->ry1, xctx->rx2, xctx->ry2 );
if(!floaters) bbox(ADD, xctx->rx1, xctx->ry1, xctx->rx2, xctx->ry2 );
break;
@ -1511,6 +1513,10 @@ void move_objects(int what, int merge, double dx, double dy)
xctx->inst[n].rot = (xctx->inst[n].rot +
( (xctx->move_flip && (xctx->inst[n].rot & 1) ) ? xctx->move_rot+2 : xctx->move_rot) ) & 0x3;
xctx->inst[n].flip = xctx->move_flip ^ xctx->inst[n].flip;
/* this is needed since no find_inst_to_be_redrawn() is executed if floaters are present */
if(floaters) symbol_bbox(n,
&xctx->inst[n].x1, &xctx->inst[n].y1,
&xctx->inst[n].x2, &xctx->inst[n].y2);
}
}
if(!firsti || !firstw) {
@ -1518,8 +1524,8 @@ void move_objects(int what, int merge, double dx, double dy)
xctx->prep_hi_structs=0;
}
/* build after copying and after recalculating prepare_netlist_structs() */
find_inst_to_be_redrawn(1 + 2 + 4 + 32); /* 32: call prepare_netlist_structs(0) */
find_inst_to_be_redrawn(16); /* clear data */
if(!floaters) find_inst_to_be_redrawn(1 + 2 + 4 + 32); /* 32: call prepare_netlist_structs(0) */
if(!floaters) find_inst_to_be_redrawn(16); /* clear data */
check_collapsing_objects();
if(tclgetboolvar("autotrim_wires")) trim_wires();
@ -1532,11 +1538,11 @@ void move_objects(int what, int merge, double dx, double dy)
xctx->ui_state &= ~STARTMERGE;
xctx->move_rot=xctx->move_flip=0;
xctx->x1=xctx->y_1=xctx->x2=xctx->y_2=xctx->deltax=xctx->deltay=0.;
bbox(SET , 0.0 , 0.0 , 0.0 , 0.0);
set_modify(1); /* must be done before draw() if floaters are present to force cached values update */
if(!floaters) bbox(SET , 0.0 , 0.0 , 0.0 , 0.0);
draw();
bbox(END , 0.0 , 0.0 , 0.0 , 0.0);
if(!floaters) bbox(END , 0.0 , 0.0 , 0.0 , 0.0);
xctx->rotatelocal=0;
set_modify(1);
}
draw_selection(xctx->gc[SELLAYER], 0);
}

View File

@ -2246,6 +2246,9 @@ static void read_xschem_file(FILE *fd)
dbg(1, "read_xschem_file(): no file_version, assuming file_version=%s\n", xctx->file_version);
}
}
if(there_are_floaters()) {
floater_hash_all_names();
}
}
void load_ascii_string(char **ptr, FILE *fd)

View File

@ -434,6 +434,8 @@ int global_spice_netlist(int global) /* netlister driver */
unselect_all(1);
dbg(1, "global_spice_netlist(): invoking pop_undo(0, 0)\n");
xctx->pop_undo(4, 0);
tclvareval("get_directory [list ", xctx->sch[xctx->currsch], "]", NULL);
my_strncpy(xctx->current_dirname, tclresult(), S(xctx->current_dirname));
my_strncpy(xctx->current_name, rel_sym_path(xctx->sch[xctx->currsch]), S(xctx->current_name));
dbg(1, "spice_netlist(): invoke prepare_netlist_structs for %s\n", xctx->current_name);
err |= prepare_netlist_structs(1); /* so 'lab=...' attributes for unnamed nets are set */

View File

@ -229,6 +229,8 @@ int global_tedax_netlist(int global) /* netlister driver */
xctx->currsch--;
unselect_all(1);
xctx->pop_undo(4, 0);
tclvareval("get_directory [list ", xctx->sch[xctx->currsch - 1], "]", NULL);
my_strncpy(xctx->current_dirname, tclresult(), S(xctx->current_dirname));
my_strncpy(xctx->current_name, rel_sym_path(xctx->sch[xctx->currsch]), S(xctx->current_name));
err |= prepare_netlist_structs(1); /* so 'lab=...' attributes for unnamed nets are set */

View File

@ -242,7 +242,9 @@ char *get_generator_command(const char *str)
goto end;
}
#ifdef __unix__
my_strdup(_ALLOC_ID_, &gen_cmd, cmd_filename);
/* my_strdup(_ALLOC_ID_, &gen_cmd, cmd_filename); */
/* add quotes to protect spaces in cmd path */
my_mstrcat(_ALLOC_ID_, &gen_cmd, "\"", cmd_filename, "\"", NULL);
*spc_idx = ' ';
my_strcat(_ALLOC_ID_, &gen_cmd, spc_idx);
#else

View File

@ -372,6 +372,8 @@ int global_verilog_netlist(int global) /* netlister driver */
xctx->currsch--;
unselect_all(1);
xctx->pop_undo(4, 0);
tclvareval("get_directory [list ", xctx->sch[xctx->currsch], "]", NULL);
my_strncpy(xctx->current_dirname, tclresult(), S(xctx->current_dirname));
my_strncpy(xctx->current_name, rel_sym_path(xctx->sch[xctx->currsch]), S(xctx->current_name));
err |= prepare_netlist_structs(1); /* so 'lab=...' attributes for unnamed nets are set */
/* symbol vs schematic pin check, we do it here since now we have ALL symbols loaded */

View File

@ -460,6 +460,8 @@ int global_vhdl_netlist(int global) /* netlister driver */
xctx->currsch--;
unselect_all(1);
xctx->pop_undo(4, 0);
tclvareval("get_directory [list ", xctx->sch[xctx->currsch], "]", NULL);
my_strncpy(xctx->current_dirname, tclresult(), S(xctx->current_dirname));
my_strncpy(xctx->current_name, rel_sym_path(xctx->sch[xctx->currsch]), S(xctx->current_name));
err |= prepare_netlist_structs(1); /* so 'lab=...' attributes for unnamed nets are set */
/* symbol vs schematic pin check, we do it here since now we have ALL symbols loaded */

View File

@ -1463,7 +1463,7 @@ C {rom8k.sym} 480 -730 0 0 {name=x17}
C {test_doublepin.sym} 160 -170 0 0 {name=x19}
C {classD_amp.sym} 480 -770 0 0 {name=x20}
C {delta_sigma.sym} 480 -610 0 0 {name=x21}
C {solar_panel.sym} 480 -570 0 0 {name=x22}
C {solar_panel.sym} 480 -570 0 0 {name=xsolar}
C {test_extracted_netlist.sym} 160 -130 0 0 {name=x23
tclcommand="xschem descend"}
C {poweramp_lcc.sym} 480 -650 0 0 {name=x16

View File

@ -7,34 +7,34 @@ K {}
V {}
S {}
E {}
L 2 125 -885 125 -655 {}
L 2 165 -885 165 -655 {}
L 2 205 -885 205 -655 {}
L 2 245 -885 245 -655 {}
L 2 285 -885 285 -655 {}
L 2 325 -885 325 -655 {}
L 2 365 -885 365 -655 {}
L 2 405 -885 405 -655 {}
L 2 85 -855 415 -855 {}
L 2 85 -815 415 -815 {}
L 2 85 -775 415 -775 {}
L 2 85 -735 415 -735 {}
L 2 85 -695 415 -695 {}
L 4 85 -895 85 -635 {}
L 4 75 -655 425 -655 {}
L 4 125 -655 125 -645 {}
L 4 165 -655 165 -645 {}
L 4 205 -655 205 -645 {}
L 4 245 -655 245 -645 {}
L 4 285 -655 285 -645 {}
L 4 325 -655 325 -645 {}
L 4 365 -655 365 -645 {}
L 4 405 -655 405 -645 {}
L 4 75 -695 85 -695 {}
L 4 75 -735 85 -735 {}
L 4 75 -775 85 -775 {}
L 4 75 -815 85 -815 {}
L 4 75 -855 85 -855 {}
L 2 105 -1005 105 -775 {}
L 2 145 -1005 145 -775 {}
L 2 185 -1005 185 -775 {}
L 2 225 -1005 225 -775 {}
L 2 265 -1005 265 -775 {}
L 2 305 -1005 305 -775 {}
L 2 345 -1005 345 -775 {}
L 2 385 -1005 385 -775 {}
L 2 65 -975 395 -975 {}
L 2 65 -935 395 -935 {}
L 2 65 -895 395 -895 {}
L 2 65 -855 395 -855 {}
L 2 65 -815 395 -815 {}
L 4 65 -1015 65 -755 {}
L 4 55 -775 405 -775 {}
L 4 105 -775 105 -765 {}
L 4 145 -775 145 -765 {}
L 4 185 -775 185 -765 {}
L 4 225 -775 225 -765 {}
L 4 265 -775 265 -765 {}
L 4 305 -775 305 -765 {}
L 4 345 -775 345 -765 {}
L 4 385 -775 385 -765 {}
L 4 55 -815 65 -815 {}
L 4 55 -855 65 -855 {}
L 4 55 -895 65 -895 {}
L 4 55 -935 65 -935 {}
L 4 55 -975 65 -975 {}
L 4 610 -1100 630 -1140 {}
L 4 630 -1140 650 -1100 {}
L 4 650 -1100 670 -1140 {}
@ -54,11 +54,16 @@ L 4 1130 -1060 1130 -1020 {}
L 4 1130 -1060 1150 -1060 {}
L 4 1150 -1060 1150 -1020 {}
L 4 1150 -1020 1160 -1020 {}
L 4 890 -690 890 -650 {}
L 4 880 -650 890 -650 {}
L 4 880 -650 890 -640 {}
L 4 890 -640 900 -650 {}
L 4 890 -650 900 -650 {}
L 4 880 -760 880 -720 {}
L 4 870 -720 880 -720 {}
L 4 870 -720 880 -710 {}
L 4 880 -710 890 -720 {}
L 4 880 -720 890 -720 {}
L 4 970 -380 970 -340 {}
L 4 960 -340 970 -340 {}
L 4 960 -340 970 -330 {}
L 4 970 -330 980 -340 {}
L 4 970 -340 980 -340 {}
B 2 1260 -560 1680 -390 {flags=graph
y1 = -0.42
y2 = 22
@ -145,76 +150,85 @@ color=8
node="\\"CTRL1 Duty cycle; ctrl1 20u ravg()\\""
jpeg_quality=30
linewidth_mult=2.0}
B 18 85 -840 340 -655 {}
A 5 340 -840 5.590169943749475 243.434948822922 360 {fill=true}
P 7 6 415 -655 360 -811.25 355 -825 342.5 -840 330 -845 85 -855 {}
B 18 65 -960 320 -775 {}
A 5 320 -960 5.590169943749475 243.434948822922 360 {fill=true}
P 7 6 395 -775 340 -931.25 335 -945 322.5 -960 310 -965 65 -975 {}
T {2x10 1W white LED} 1240 -200 0 0 0.4 0.4 {layer=8}
T {2xseries 1W white LEDs} 1220 -140 0 0 0.4 0.4 {}
T {2.5} 115 -635 0 0 0.2 0.2 {}
T {5.0} 155 -635 0 0 0.2 0.2 {}
T {7.5} 195 -635 0 0 0.2 0.2 {}
T {10.0} 235 -635 0 0 0.2 0.2 {}
T {12.5} 275 -635 0 0 0.2 0.2 {}
T {15.0} 315 -635 0 0 0.2 0.2 {}
T {17.5} 355 -635 0 0 0.2 0.2 {}
T {20.0} 395 -635 0 0 0.2 0.2 {}
T {2.5} 55 -860 0 0 0.2 0.2 {}
T {2.0} 55 -820 0 0 0.2 0.2 {}
T {1.5} 55 -775 0 0 0.2 0.2 {}
T {1.0} 55 -740 0 0 0.2 0.2 {}
T {0.5} 55 -700 0 0 0.2 0.2 {}
T {25C, 1000W/m2} 210 -910 0 0 0.2 0.2 {}
T {V} 430 -645 0 0 0.4 0.4 {}
T {I} 60 -900 0 0 0.4 0.4 {}
T {SOLAR PANEL} 165 -935 0 0 0.4 0.4 {}
T {Maximum Power} 327.5 -860 0 0 0.2 0.2 {layer=8}
T {2.5} 95 -755 0 0 0.2 0.2 {}
T {5.0} 135 -755 0 0 0.2 0.2 {}
T {7.5} 175 -755 0 0 0.2 0.2 {}
T {10.0} 215 -755 0 0 0.2 0.2 {}
T {12.5} 255 -755 0 0 0.2 0.2 {}
T {15.0} 295 -755 0 0 0.2 0.2 {}
T {17.5} 335 -755 0 0 0.2 0.2 {}
T {20.0} 375 -755 0 0 0.2 0.2 {}
T {2.5} 35 -980 0 0 0.2 0.2 {}
T {2.0} 35 -940 0 0 0.2 0.2 {}
T {1.5} 35 -895 0 0 0.2 0.2 {}
T {1.0} 35 -860 0 0 0.2 0.2 {}
T {0.5} 35 -820 0 0 0.2 0.2 {}
T {25C, 1000W/m2} 190 -1030 0 0 0.2 0.2 {}
T {V} 410 -765 0 0 0.4 0.4 {}
T {I} 40 -1020 0 0 0.4 0.4 {}
T {SOLAR PANEL} 145 -1055 0 0 0.4 0.4 {}
T {Maximum Power} 307.5 -980 0 0 0.2 0.2 {layer=8}
T {set between 0 and 1
to simulate
sun radiation
level} 10 -390 0 0 0.2 0.2 {}
T {@name} 885 -628.75 0 0 0.2 0.2 {floater=L2
level} 10 -440 0 0 0.2 0.2 {}
T {@name} 875 -698.75 0 0 0.3 0.3 {floater=L2
layer=7}
T {@value} 885 -613.75 0 0 0.2 0.2 {floater=L2
T {@value} 875 -673.75 0 0 0.3 0.3 {floater=L2
layer=7}
T {m=@m} 885 -598.75 0 0 0.2 0.2 {floater=L2
T {m=@m} 875 -648.75 0 0 0.3 0.3 {floater=L2
layer=7}
T {Floater text example} 860 -720 0 0 0.4 0.4 {}
N 1010 -160 1100 -160 {lab=0}
N 1100 -250 1100 -160 {lab=0}
N 640 -560 730 -560 {lab=#net1}
N 1010 -390 1040 -390 {lab=VO}
N 1010 -390 1010 -260 {lab=VO}
N 1010 -200 1010 -160 {lab=0}
N 530 -560 580 -560 {lab=PANEL}
N 1010 -560 1010 -390 {lab=VO}
N 820 -560 860 -560 {lab=SW}
N 820 -560 820 -440 {lab=SW}
N 790 -560 820 -560 {lab=SW}
N 820 -160 1010 -160 {lab=0}
N 630 -160 820 -160 {lab=0}
N 1000 -560 1010 -560 {lab=VO}
N 1100 -390 1140 -390 {lab=LED}
N 1100 -390 1100 -310 {lab=LED}
N 820 -380 820 -340 { lab=#net2}
N 920 -560 940 -560 { lab=#net3}
N 360 -480 360 -430 {
T {Floater text
example} 850 -820 0 0 0.4 0.4 {}
T {@name} 985 -308.75 0 1 0.3 0.3 {floater=C1
layer=7}
T {@value} 985 -286.25 0 1 0.3 0.3 {floater=C1
layer=7}
T {m=@m} 985 -263.75 0 1 0.3 0.3 {floater=C1
layer=7}
T {Floater text
example} 870 -440 0 0 0.4 0.4 {}
N 1010 -210 1100 -210 {lab=0}
N 1100 -300 1100 -210 {lab=0}
N 640 -610 730 -610 {lab=#net1}
N 1010 -440 1040 -440 {lab=VO}
N 1010 -440 1010 -310 {lab=VO}
N 1010 -250 1010 -210 {lab=0}
N 530 -610 580 -610 {lab=PANEL}
N 1010 -610 1010 -440 {lab=VO}
N 820 -610 860 -610 {lab=SW}
N 820 -610 820 -490 {lab=SW}
N 790 -610 820 -610 {lab=SW}
N 820 -210 1010 -210 {lab=0}
N 800 -210 820 -210 {lab=0}
N 1000 -610 1010 -610 {lab=VO}
N 1100 -440 1140 -440 {lab=LED}
N 1100 -440 1100 -360 {lab=LED}
N 820 -430 820 -390 { lab=#net2}
N 920 -610 940 -610 { lab=#net3}
N 360 -530 360 -480 {
lab=#net4}
N 360 -370 360 -320 {lab=0}
N 360 -480 400 -480 {
N 360 -420 360 -370 {lab=0}
N 360 -530 400 -530 {
lab=#net4}
N 760 -670 760 -600 {
N 760 -720 760 -650 {
lab=CTRL1}
N 460 -480 530 -480 {
N 460 -530 530 -530 {
lab=#net5}
N 590 -480 650 -480 {
N 590 -530 650 -530 {
lab=PANEL}
N 500 -340 500 -320 {
N 500 -390 500 -370 {
lab=0}
N 500 -420 500 -400 {
N 500 -470 500 -450 {
lab=#net6}
N 160 -400 320 -400 {
N 160 -450 320 -450 {
lab=SUN}
N 160 -310 160 -290 {
N 160 -360 160 -340 {
lab=0}
N 610 -1010 610 -990 {
lab=0}
@ -222,19 +236,19 @@ N 610 -1080 610 -1070 {
lab=TRIANG}
N 610 -1080 770 -1080 {
lab=TRIANG}
N 720 -870 830 -870 {
N 720 -890 830 -890 {
lab=LEVEL}
N 550 -840 550 -800 {
N 550 -860 550 -820 {
lab=REF}
N 550 -840 600 -840 {
N 550 -860 600 -860 {
lab=REF}
N 550 -900 600 -900 {
N 550 -920 600 -920 {
lab=LED}
N 1010 -1000 1060 -1000 {
lab=CTRL1}
N 160 -400 160 -370 {
N 160 -450 160 -420 {
lab=SUN}
N 830 -970 830 -870 {
N 830 -970 830 -890 {
lab=LEVEL}
N 830 -970 890 -970 {
lab=LEVEL}
@ -242,39 +256,46 @@ N 770 -1080 770 -1030 {
lab=TRIANG}
N 770 -1030 890 -1030 {
lab=TRIANG}
N 820 -280 820 -160 {
N 820 -330 820 -210 {
lab=0}
C {title.sym} 160 -40 0 0 {name=l1 author="Stefan Schippers" net_name=true}
C {code_shown.sym} 190 -250 0 0 {name=CONTROL value=".control
* save all
tran .05u 1m uic
write solar_panel.raw
exit
C {code_shown.sym} 170 -310 0 0 {name=CONTROL
value="tcleval(
.control
* example of tcl evaluation of code blocks:
* current path: $path
* schematic: [xschem get current_name]
tran .05u 1m uic
write solar_panel.raw
exit
.endc
" net_name=true}
C {code.sym} 20 -190 0 0 {name=MODELS value=".MODEL DIODE D(IS=1.139e-08 RS=0.99 CJO=9.3e-12 VJ=1.6 M=0.411 BV=30 EG=0.7 )
)"
net_name=true}
C {code.sym} 20 -240 0 0 {name=MODELS value=".MODEL DIODE D(IS=1.139e-08 RS=0.99 CJO=9.3e-12 VJ=1.6 M=0.411 BV=30 EG=0.7 )
.MODEL swmod SW(VT=0.5 VH=0.01 RON=0.01 ROFF=10000000)
" net_name=true}
C {lab_pin.sym} 650 -480 0 1 {name=l4 lab=PANEL }
C {lab_pin.sym} 630 -160 0 0 {name=l6 lab=0 }
C {ammeter.sym} 1070 -390 3 0 {name=Vled net_name=true}
C {ind.sym} 890 -560 3 1 {name=L2
C {lab_pin.sym} 650 -530 0 1 {name=l4 lab=PANEL }
C {lab_pin.sym} 800 -210 0 0 {name=l6 lab=0 }
C {ammeter.sym} 1070 -440 3 0 {name=Vled net_name=true}
C {ind.sym} 890 -610 3 1 {name=L2
m=1
value=40u
footprint=1206
device=inductor net_name=true
hide_texts=true}
C {lab_pin.sym} 1140 -390 0 1 {name=l7 lab=LED }
C {lab_pin.sym} 820 -500 0 1 {name=l9 lab=SW }
C {capa.sym} 1010 -230 0 0 {name=C1
C {lab_pin.sym} 1140 -440 0 1 {name=l7 lab=LED }
C {lab_pin.sym} 820 -550 0 1 {name=l9 lab=SW }
C {capa.sym} 1010 -280 0 0 {name=C1
m=1
value=500n
footprint=1206
device="ceramic capacitor" net_name=true}
C {lab_pin.sym} 1010 -350 0 1 {name=l10 lab=VO }
C {lab_pin.sym} 530 -560 0 0 {name=l3 lab=PANEL }
C {ammeter.sym} 970 -560 3 0 {name=Vind net_name=true}
C {isource_table.sym} 1100 -280 0 0 {name=G2[9..0] CTRL="V(LED)" TABLE="
device="ceramic capacitor" net_name=true
hide_texts=true}
C {lab_pin.sym} 1010 -400 0 1 {name=l10 lab=VO }
C {lab_pin.sym} 530 -610 0 0 {name=l3 lab=PANEL }
C {ammeter.sym} 970 -610 3 0 {name=Vind net_name=true}
C {isource_table.sym} 1100 -330 0 0 {name=G2[9..0] CTRL="V(LED)" TABLE="
+ (0, 0)
+ (4.8, 5m)
+ (5.2, 15m)
@ -290,34 +311,34 @@ C {isource_table.sym} 1100 -280 0 0 {name=G2[9..0] CTRL="V(LED)" TABLE="
+ (7.4, 470m)
+ (8.0, 750m)"
net_name=true}
C {ammeter.sym} 610 -560 3 0 {name=Vsw net_name=true}
C {ammeter.sym} 820 -310 2 0 {name=Vdiode net_name=true}
C {spice_probe.sym} 1120 -390 0 0 {name=p1 analysis=tran}
C {spice_probe.sym} 650 -480 0 0 {name=p2 analysis=tran}
C {spice_probe.sym} 820 -460 0 1 {name=p3 analysis=tran}
C {ammeter.sym} 610 -610 3 0 {name=Vsw net_name=true}
C {ammeter.sym} 820 -360 2 0 {name=Vdiode net_name=true}
C {spice_probe.sym} 1120 -440 0 0 {name=p1 analysis=tran}
C {spice_probe.sym} 650 -530 0 0 {name=p2 analysis=tran}
C {spice_probe.sym} 820 -510 0 1 {name=p3 analysis=tran}
C {launcher.sym} 1080 -1140 0 0 {name=h3
descr="Reload Waves"
tclcommand="
xschem raw_read $netlist_dir/[file tail [file rootname [xschem get current_name]]].raw tran
"
}
C {pv_ngspice.sym} 360 -400 0 0 {name=X1 m=1 power=100 n=36}
C {lab_pin.sym} 360 -320 0 0 {name=l12 lab=0 }
C {capa.sym} 500 -450 0 0 {name=C11
C {pv_ngspice.sym} 360 -450 0 0 {name=X1 m=1 power=100 n=36}
C {lab_pin.sym} 360 -370 0 0 {name=l12 lab=0 }
C {capa.sym} 500 -500 0 0 {name=C11
m=1
value=10u
footprint=1206
device="ceramic capacitor" net_name=true}
C {lab_pin.sym} 500 -320 0 0 {name=l90 lab=0 }
C {ammeter.sym} 430 -480 3 1 {name=Vpanel net_name=true}
C {diode_ngspice.sym} 820 -410 2 0 {name=X2 m=1 Roff=1e9 Ron=0.1}
C {switch_ngspice.sym} 760 -560 1 0 {name=S1 model=swmod}
C {lab_pin.sym} 740 -600 0 0 {name=l5 lab=0 }
C {ammeter.sym} 560 -480 3 1 {name=Vpanel1 net_name=true}
C {ammeter.sym} 500 -370 0 0 {name=Vcap net_name=true}
C {vsource.sym} 160 -340 0 0 {name=Vfade value="pwl 0 1 1m 0"}
C {lab_pin.sym} 160 -290 0 0 {name=l8 lab=0 }
C {ngspice_get_expr.sym} 1120 -320 0 0 {name=r29
C {lab_pin.sym} 500 -370 0 0 {name=l90 lab=0 }
C {ammeter.sym} 430 -530 3 1 {name=Vpanel net_name=true}
C {diode_ngspice.sym} 820 -460 2 0 {name=X2 m=1 Roff=1e9 Ron=0.1}
C {switch_ngspice.sym} 760 -610 1 0 {name=S1 model=swmod}
C {lab_pin.sym} 740 -650 0 0 {name=l5 lab=0 }
C {ammeter.sym} 560 -530 3 1 {name=Vpanel1 net_name=true}
C {ammeter.sym} 500 -420 0 0 {name=Vcap net_name=true}
C {vsource.sym} 160 -390 0 0 {name=Vfade value="pwl 0 1 1m 0"}
C {lab_pin.sym} 160 -340 0 0 {name=l8 lab=0 }
C {ngspice_get_expr.sym} 1120 -370 0 0 {name=r29
node="[format %.4g [expr \{[ngspice::get_voltage led] * [ngspice::get_current vled]\}]] W"
descr = power
}
@ -325,17 +346,17 @@ C {vsource.sym} 610 -1040 0 0 {name=Vtriang value="pulse 0 1 0 2u 2u 1f 4u"}
C {lab_pin.sym} 610 -990 0 0 {name=l11 lab=0 }
C {lab_pin.sym} 770 -1080 0 1 {name=l14
lab=TRIANG }
C {vsource.sym} 550 -770 0 0 {name=Vref value=7}
C {lab_pin.sym} 550 -740 0 0 {name=l17 lab=0 }
C {lab_pin.sym} 760 -670 0 0 {name=l13 lab=CTRL1 }
C {comp_ngspice.sym} 660 -870 0 0 {name=x3 OFFSET=0.5 AMPLITUDE=1 ROUT=7k COUT=1n}
C {lab_pin.sym} 550 -840 0 0 {name=l16
C {vsource.sym} 550 -790 0 0 {name=Vref value=7}
C {lab_pin.sym} 550 -760 0 0 {name=l17 lab=0 }
C {lab_pin.sym} 760 -720 0 0 {name=l13 lab=CTRL1 }
C {comp_ngspice.sym} 660 -890 0 0 {name=x3 OFFSET=0.5 AMPLITUDE=1 ROUT=7k COUT=1n}
C {lab_pin.sym} 550 -860 0 0 {name=l16
lab=REF}
C {lab_pin.sym} 550 -900 0 0 {name=l15 lab=LED}
C {lab_pin.sym} 830 -870 0 1 {name=l18 lab=LEVEL}
C {lab_pin.sym} 550 -920 0 0 {name=l15 lab=LED}
C {lab_pin.sym} 830 -890 0 1 {name=l18 lab=LEVEL}
C {comp_ngspice.sym} 950 -1000 0 0 {name=x4 OFFSET=0.5 AMPLITUDE=1 ROUT=1 COUT=1p}
C {lab_pin.sym} 1060 -1000 0 1 {name=l19 lab=CTRL1 }
C {lab_pin.sym} 160 -400 0 0 {name=l20 lab=SUN }
C {lab_pin.sym} 160 -450 0 0 {name=l20 lab=SUN }
C {spice_probe.sym} 850 -1030 0 1 {name=p4 analysis=tran}
C {spice_probe.sym} 810 -870 0 1 {name=p5 analysis=tran}
C {spice_probe.sym} 760 -620 0 0 {name=p6 analysis=tran}
C {spice_probe.sym} 810 -890 0 1 {name=p5 analysis=tran}
C {spice_probe.sym} 760 -670 0 0 {name=p6 analysis=tran}