fix a regression in delete(): instance hash was not updated. removed some redundant drawing in copy operations

This commit is contained in:
Stefan Schippers 2020-10-03 04:33:52 +02:00
parent 5b72e307df
commit 39cd1a77ed
5 changed files with 29 additions and 210 deletions

Binary file not shown.

View File

@ -139,7 +139,7 @@ int callback(int event, int mx, int my, KeySym key,
mousey=Y_TO_XSCHEM(my);
mousex_snap=ROUND(mousex / cadsnap) * cadsnap;
mousey_snap=ROUND(mousey / cadsnap) * cadsnap;
if(lastselected > 1) my_snprintf(str, S(str), "mouse = %.16g %.16g - selected: %d path: %s",
my_snprintf(str, S(str), "mouse = %.16g %.16g - selected: %d path: %s",
mousex_snap, mousey_snap, lastselected, sch_path[currentsch] );
statusmsg(str,1);
switch(event)

View File

@ -1,194 +0,0 @@
- make currentsch++ safe (check bounds)
- erich converters:
https://github.com/erichVK5/translate2coralEDA
- info on devmapping:
http://www.delorie.com/pcb/pin-mapping.html
http://repo.hu/projects/cschem/design/07_devmap.html
http://wiki.friendlyarm.com/wiki/images/f/fd/Schematic_NanoPi-NEO-V1.4-1801-20180320.pdf
- global=1 attribute for global pins (vdd.sym, gnd.sym etc ) should be 'global=true' --done--
to be consistent with all other boolean attributes.
Igor2
Stefan, here's the concept: svn://repo.hu/openhw/projects/lab/tester
far from finished, so please don't yet redraw
Vuokko, yes, as usual
Igor2
Stefan, the tricky idea is: 74374 is edge triggered, it reads the input and latches it to the output on an edge of clk
so the firmware would do 3 things:
it would set the frist 8 outputs on PA0..7 and do an edge for U2 - it will be ignored by U3 because it gets clk inverted
then it would set the second 8 outputs on PA0..7 and invert the clk signal, so U3 would latch in the input, U2 ignoring it
and the third thing is after this: without changing the clock, it would set PA0..7 to analog input and run 8 ADC conversionns loading 8 values
for each of the 4 input channels, I have 2 opamp channels
one does the level shift in a way that -5..+5V input ends up as 0..1.1V output (the ADC needs this level)
the other converts 0..15 in to 0..1.1V
so this is "range selection"
for small signals I will have about 10/1024 V resolution, that is about 0.01V (+- adc errors)
I'll need to use the small signal range for negative voltages
for large signal, above +5V, I need to use the other adc input, where I have 15/1024, about 0.015V resolution and no shift
@jmp_ghli
(SVN) pcb-rnd rev: 22511 by blinken | [lesstif] -Fix: dlg_test crash, check at tree rendering if the model list is empty.|
Igor2
Stefan, the tricky part is that I can achieve all 16 output channels and 4 input channels with range selection using only 9 pins, which allows me to use this small MCU
Igor2
(normally this isn't worth it, it's usually cheaper to buy a bigger MCU with more pins, but I have tons of recycled 74374s and 4 chan opamps, so those are for free for me)
Igor2
I don't yet know if it really works, it's only a concept at the moment
stefan
Igor2, reading slowly ( in a meeting now :))
tnx 4 now
Igor2
when you are back, there is one more interesting thing to observe:
for the output driver ICs, I used large, per package symbols while for input opamps I used slotted symbols
the reason is that the output doesn't have any extra parts around it, so splitting it up would only clutter the drawing
on input side I have a lot of resistors around each opamp, so slotted makes more sense, makes the drawing more readable
stefan
so for output you uswe x1 packages while for inputs you use xn slotted devs?
iiuc
Igor2
yes
on the same sch
so it's really per case specific
when we have the slots grouped and it's really just a ladder of all-in-all-out, it's usually better to go for non-slotted
so a good rich lib has both slotted and non-slotted for these kind of ICs
- allow any filename, do not enforce/assume .sch /.sym extension --done-- in 1.1 file format
- documentation: tutorial on xschem libraries --done--
- add 'devmap=devfile' attribute: netlister will look for mapfile for
symbol attributes. this will allow to reverse / change connecions naming etc
- external program that can be used to change pinnumber mapping
xschem sends symbol on stdin to devmap program, devmap spits out new
symbol, xschem reads it from stdout
- display one UI box per key=value pairs in edit property
- documentation: style guide for symbols
- add the possibility of referencing a 'golden' symbol from where to pick up
attributes
- separate grid off / axes off
- make bindings to external apps (simulators, viewers) more customizable
- free all static (char *) variabled declared in functions before leaving
- remove cairo code and still use ttf fonts ? (--> Igor2)
- add 'cut poly' command to transform a poly line into segments (lines)
- remove polygon points that become coincident after a stretch operation
- allow repositioning of symbol text at instance level.
- experiment SDL graphics
-----
- rotate/flip objects as they are selected without requiring a move operation --done--
- easy navigate between library directories when placing a symbol --done--
- allow components with duplicate names, do not enforce auto-rename --done--
- documentation: tutorial on xschem slotting (tedax) --done--
- propagate $PREFIX actual location to manpages --done--
- add option to create netlist in specified output directory --done--
- specify output file in --png, --postscript, --svg --> --plotfile --done--
- make first load of schematics/symbols appear with correct line widths --done--
- version number in sch/sym files --done--
- more symbols --done--
- lm358, slotted so(8)
- 2n7002 sot23
- '.' in pathlist search path should be the directory of the containing schematic, not the xschem xwd --done--
- add '*' in window title /icon title when file modified --done--
- integrate ngspice --done--
- change the way to change layer colors
(ctrl-menu click is not working for many users) --done--
- save only one copy of embedded symbols. --done--
- allow 'token = value' in property strings (allow spaces around '=') --done--
- update svgdraw for arcs/circles --done--
- make color changes made by the user persistent (~/.xschem/colors) --done--
- 'About' dialog box --done--
- change window / icon title to 'xschem - <filename>' --done--
- color picker to allow change layer colors --done--
- update psprint for arcs/circles --done--
- print png/pdf/svg to rename to export --done--
- ctrl-Q to exit app --done--
- c89 --done--
- long option names, version info, update help (xschem -h, xschem --version, xschem --help) --done--
- L 200 200 300 300 {} crashes xschem (no layer #) --done--
- C {} ..... {} crashes xschem (empty sym reference) --done--
- display connecting dots when drawing nets --done--
- make menus ordered so moving with arrow will go in a predictable way --done--
- circles/arcs --done--
- standard pathname resolution --done--
- implement tcl command 'xschem setprop ... ' --done--
- undo files and other temp files in /tmp --done--
- undo/redo: remove direct unix calls pipe() and fork() and use popen. much simpler & portable --done--
- modify polygon drawing primitive to handle open/close polygons --done--
- add requirements for libcairo2-dev and libfl-dev in documentation --done--
- embedded symbols in schematic --done--
- allow mouse click repeat last command as option -- done for wires and lines --
- manhattan route when drawing wires -- done for lines and wires --
- display connection dots --done--
- command to break wires at intersections and instance pins --done--
about popen/pclose
ok. And what is your suggestion to replace popen/pclose? well in old checkins of xschem i was using pipe/fork/execlp/dup2 and friends, i thought using popen/pclose was more portable :-(
Igor2
the only real portable thing is system
we can detect popen
if here's no popen we can detect pipe+fork+dup and that can give a trivial replacement
(the reason why pipe+fork+dup should not _always_ be used instead of popen is mainly windows: you do have popen there but no fork or pipe)
you don't need dup2, it's just a convenience call, plain old dup can do what you need
(it's a bit hackish)
stefan
ok i was asking because i knew dup2 was not portable, but out of the box i dont know how to replace it
Igor2
easy:
dup uses the lowes available fd
so you just need to close/dup in the right order
stefan
but in't this exposed to race conditionas?
conditions*
may be not an issue n xschem
Igor2
if you don't use threads: no
stefan
ok
perfect
Igor2
or at elast you shouldn't:
- start threads before finishing the dup's
stefan
i do not .
Igor2
- or if you do start threads, you should keep file operations in one
warning:
tcl does use threads in some situations, whether you want it or not
but
the normal recipe is this:
fork(); if you are in child: series of close/dup
(in the parent you don't need dup/dup2 anyway, arbitrary file descriptors are fine)
then after you finished all the close/dup magic in the child, you exec()
between the fork and the exec there's no therading
stefan
ok
Igor2
by the exec you have all the fds sorted, so the new process can do whatever it wants to
* stefan copying this text , heehhe
Igor2
if you work on this:
just assume a #define for popen, something like HAS_POPEN
and another for fork
stefan
ok
Igor2
close and dup are pretty much portable
just add them in your generated config.h, so you can experiment
stefan
ok
thank you
Igor2
if you start using any new posix/modern-bsd call, just invent a HAS for it
when you already know what you need detected, just drop me a mail and I'll add the detection (usually in a morning coding slot)

View File

@ -475,7 +475,7 @@ void find_inst_to_be_redrawn(const char *node)
void copy_objects(int what)
{
int c, i, n, k;
Box tmp;
/* Box tmp; */
double angle;
int newpropcnt;
double tmpx, tmpy;
@ -485,7 +485,7 @@ void copy_objects(int what)
/* 20171112 */
#ifdef HAS_CAIRO
char *textfont;
int customfont; /* 20181009 */
/* int customfont; */
#endif
if(what & BEGIN)
@ -546,14 +546,17 @@ void copy_objects(int what)
prepared_hash_wires=0;
if(show_pin_net_names) find_inst_hash_clear();
/* calculate copied symbols bboxes before actually doing the move */
/*
for(i=0;i<lastselected;i++)
{
n = selectedgroup[i].n;
if( selectedgroup[i].type == ELEMENT) {
symbol_bbox(n, &inst_ptr[n].x1, &inst_ptr[n].y1, &inst_ptr[n].x2, &inst_ptr[n].y2 ); /* 20171201 */
symbol_bbox(n, &inst_ptr[n].x1, &inst_ptr[n].y1, &inst_ptr[n].x2, &inst_ptr[n].y2 );
bbox(ADD, inst_ptr[n].x1, inst_ptr[n].y1, inst_ptr[n].x2, inst_ptr[n].y2 );
}
}
*/
for(i=0;i<lastselected;i++)
{
@ -561,7 +564,8 @@ void copy_objects(int what)
if(selectedgroup[i].type == WIRE)
{
check_wire_storage();
if(wire[n].bus){ /* 20171201 */
/*
if(wire[n].bus){
int ov, y1, y2;
ov = bus_width> cadhalfdotsize ? bus_width : CADHALFDOTSIZE;
if(wire[n].y1 < wire[n].y2) { y1 = wire[n].y1-ov; y2 = wire[n].y2+ov; }
@ -574,6 +578,7 @@ void copy_objects(int what)
else { y1 = wire[n].y1+ov; y2 = wire[n].y2-ov; }
bbox(ADD, wire[n].x1-ov, y1 , wire[n].x2+ov , y2 );
}
*/
if(rotatelocal) {
ROTATION(wire[n].x1, wire[n].y1, wire[n].x1, wire[n].y1, rx1,ry1);
ROTATION(wire[n].x1, wire[n].y1, wire[n].x2, wire[n].y2, rx2,ry2);
@ -620,7 +625,7 @@ void copy_objects(int what)
{
case LINE:
if(c!=k) break;
bbox(ADD, line[c][n].x1, line[c][n].y1, line[c][n].x2, line[c][n].y2); /* 20181009 */
/* bbox(ADD, line[c][n].x1, line[c][n].y1, line[c][n].x2, line[c][n].y2) */
if(rotatelocal) {
ROTATION(line[c][n].x1, line[c][n].y1, line[c][n].x1, line[c][n].y1, rx1,ry1);
ROTATION(line[c][n].x1, line[c][n].y1, line[c][n].x2, line[c][n].y2, rx2,ry2);
@ -658,15 +663,17 @@ void copy_objects(int what)
case POLYGON: /* 20171115 */
if(c!=k) break;
{
double bx1, by1, bx2, by2;
/* double bx1, by1, bx2, by2; */
double *x = my_malloc(227, sizeof(double) *polygon[c][n].points);
double *y = my_malloc(228, sizeof(double) *polygon[c][n].points);
int j;
for(j=0; j<polygon[c][n].points; j++) {
/*
if(j==0 || polygon[c][n].x[j] < bx1) bx1 = polygon[c][n].x[j];
if(j==0 || polygon[c][n].y[j] < by1) by1 = polygon[c][n].y[j];
if(j==0 || polygon[c][n].x[j] > bx2) bx2 = polygon[c][n].x[j];
if(j==0 || polygon[c][n].y[j] > by2) by2 = polygon[c][n].y[j];
*/
if( polygon[c][n].sel==SELECTED || polygon[c][n].selected_point[j]) {
if(rotatelocal) {
ROTATION(polygon[c][n].x[0], polygon[c][n].y[0], polygon[c][n].x[j], polygon[c][n].y[j], rx1,ry1);
@ -679,8 +686,8 @@ void copy_objects(int what)
x[j] = polygon[c][n].x[j];
y[j] = polygon[c][n].y[j];
}
bbox(ADD, bx1, by1, bx2, by2); /* 20181009 */
}
/* bbox(ADD, bx1, by1, bx2, by2); */
drawpolygon(k, NOW, x, y, polygon[c][n].points, polygon[c][n].fill, polygon[c][n].dash); /* 20180914 added fill */
selectedgroup[i].n=lastpolygon[c];
store_polygon(-1, x, y, polygon[c][n].points, c, polygon[c][n].sel, polygon[c][n].prop_ptr);
@ -691,10 +698,11 @@ void copy_objects(int what)
break;
case ARC:
if(c!=k) break;
/*
arc_bbox(arc[c][n].x, arc[c][n].y, arc[c][n].r, arc[c][n].a, arc[c][n].b,
&tmp.x1, &tmp.y1, &tmp.x2, &tmp.y2);
bbox(ADD, tmp.x1, tmp.y1, tmp.x2, tmp.y2);
*/
if(rotatelocal) {
/* rotate center wrt itself: do nothing */
rx1 = arc[c][n].x;
@ -722,7 +730,7 @@ void copy_objects(int what)
case xRECT:
if(c!=k) break;
bbox(ADD, rect[c][n].x1, rect[c][n].y1, rect[c][n].x2, rect[c][n].y2); /* 20181009 */
/* bbox(ADD, rect[c][n].x1, rect[c][n].y1, rect[c][n].x2, rect[c][n].y2); */
if(rotatelocal) {
ROTATION(rect[c][n].x1, rect[c][n].y1, rect[c][n].x1, rect[c][n].y1, rx1,ry1);
ROTATION(rect[c][n].x1, rect[c][n].y1, rect[c][n].x2, rect[c][n].y2, rx2,ry2);
@ -742,7 +750,7 @@ void copy_objects(int what)
case xTEXT:
if(k!=TEXTLAYER) break;
check_text_storage();
/* 20181009 */
/*
#ifdef HAS_CAIRO
customfont = set_text_custom_font(&textelement[n]);
#endif
@ -754,7 +762,7 @@ void copy_objects(int what)
if(customfont) cairo_restore(ctx);
#endif
bbox(ADD, rx1, ry1, rx2, ry2 );
*/
if(rotatelocal) {
ROTATION(textelement[n].x0, textelement[n].y0, textelement[n].x0, textelement[n].y0, rx1,ry1);
} else {
@ -903,7 +911,6 @@ void copy_objects(int what)
find_inst_to_be_redrawn(wire[n].node);
}
}
/* draw_symbol(ADD,k, n,k, 0, 0, 0.0, 0.0); */
}
filledrect(k, END, 0.0, 0.0, 0.0, 0.0);

View File

@ -221,8 +221,11 @@ void delete(void)
/* first calculate bbox, because symbol_bbox() needs translate (@#0:net_name) which needs prepare_netlist_structs
* which needs a consistent inst_ptr[] data structure */
/* does not seem to be needed
prepared_netlist_structs=0;
prepared_hilight_structs=0;
*/
if(show_pin_net_names) {
find_inst_hash_clear();
prepare_netlist_structs(0);
@ -246,15 +249,16 @@ void delete(void)
/* already done above
for(i=0;i<lastinst;i++)
{
if(inst_ptr[i].sel == SELECTED)
{
symbol_bbox(i, &inst_ptr[i].x1, &inst_ptr[i].y1, &inst_ptr[i].x2, &inst_ptr[i].y2); /*20171201 */
symbol_bbox(i, &inst_ptr[i].x1, &inst_ptr[i].y1, &inst_ptr[i].x2, &inst_ptr[i].y2);
bbox(ADD, inst_ptr[i].x1, inst_ptr[i].y1, inst_ptr[i].x2, inst_ptr[i].y2);
}
}
*/
for(i=0;i<lasttext;i++)
{
@ -313,6 +317,7 @@ void delete(void)
lastinst-=j;
if(j) {
prepared_hash_instances=0;
prepared_netlist_structs=0;
prepared_hilight_structs=0;
}
@ -339,7 +344,6 @@ void delete(void)
my_free(942, &wire[i].node);
set_modify(1);
prepared_hash_wires=0;
continue;
}
if(j) {
@ -348,6 +352,7 @@ void delete(void)
}
lastwire -= j;
if(j) {
prepared_hash_wires=0;
prepared_netlist_structs=0;
prepared_hilight_structs=0;
}
@ -1124,6 +1129,7 @@ void select_all(void)
drawtemparc(gc[SELLAYER], END, 0.0, 0.0, 0.0, 0.0, 0.0);
drawtemprect(gc[SELLAYER], END, 0.0, 0.0, 0.0, 0.0);
drawtempline(gc[SELLAYER], END, 0.0, 0.0, 0.0, 0.0);
rebuild_selected_array();
}