[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
Re: gEDA-user: PCB: Stale rat's nest?
Vanessa Dannenberg wrote:
What would cause PCB to not properly maintain it's rats nest and/or netlist?
In particular, over the course of adding rats to a board I'm working on,
moving parts, changing out parts for others, etc., PCB has made a mess of the
netlist it saves with the board. The rats themselves *look* right when
they're drawn, but the list data doesn't match what's being drawn.
In the Netlist window, I find several duplicate entries, for example
"ratDrawn1" appears several times, each time with a different pin list, some
of which are outdated. I've had to erase all of the rats and the netlist
section from the PCB drawing file using a text editor, and start over from
scratch.
This board was not created using gEDA's schematic capture tools, rather I
decided to lay it out manually (gschema is too buggy right now, sorry).
Hi Vanessa,
I looked into this a bit and here is what I found.
Everytime pcb is exited and started again, the variable which keeps
track of the # in ratDrawn# gets reset! So if you exit, get back in,
and draw more nets, you'll get duplicate names. Now, it does appear
that this is largely cosmetic meaning that I can't find where the name
is used except in the netlist window.
I'm attaching two things. The first is an awk script which will
hopefully repair your .pcb file. Please, please, please keep a backup!
Run it with
./fixnets.awk mydesign.pcb > fixed.pcb
The second is a patch to pcb which should correct this behaviour. Now
when it makes the decision to create a brand new net, it checks for name
collisions and will keep incrementing the ratDrawn# counter until it
finds a free number.
Please let me know if this fixes the problem for you.
Oh, the other question I have for you is can you elaborate on the bugs
in gschem? I've used it for a few years now and have found it to be
quite stable.
-Dan
Index: rats.c
===================================================================
RCS file: /cvsroot/pcb/pcb/src/rats.c,v
retrieving revision 1.20
diff -u -2 -r1.20 rats.c
--- rats.c 2 Dec 2005 23:29:54 -0000 1.20
+++ rats.c 2 Mar 2006 22:16:56 -0000
@@ -786,4 +786,23 @@
+/*
+ * Check to see if a particular name is the name of an already existing rats
+ * line
+ */
+static int
+rat_used (char *name)
+{
+ if (name == NULL)
+ return -1;
+
+ MENU_LOOP (&PCB->NetlistLib);
+ {
+ if (menu->Name && (strcmp(menu->Name, name) == 0) )
+ return 1;
+ }
+ END_LOOP;
+
+ return 0;
+}
/* These next two functions moved from the original netlist.c as part of the
@@ -867,6 +886,16 @@
}
/* neither belong to a net, so create a new one */
- menu = GetLibraryMenuMemory (&PCB->NetlistLib);
+
+ /*
+ * before creating a new rats here, we need to search
+ * for a unique name.
+ */
sprintf (ratname, " ratDrawn%i", ++ratDrawn);
+ while ( rat_used (ratname) )
+ {
+ sprintf (ratname, " ratDrawn%i", ++ratDrawn);
+ }
+
+ menu = GetLibraryMenuMemory (&PCB->NetlistLib);
menu->Name = MyStrdup (ratname, "AddNet");
entry = GetLibraryEntryMemory (menu);
#!/usr/bin/awk -f
#
# Search for lines like:
#
# Net("ratDrawn2" "(unknown)")
#
BEGIN {
dcnt = 1;
}
/^[ \t]Net\(/ {
# extract the name like ratDrawn2 (without the quotes)
name = $0;
gsub(/^[ \t]Net\(\"/, "", name);
gsub(/\".*/, "", name);
style = $2;
gsub(/\)$/, "", style);
if( name ~ /ratDrawn[0-9]+/ ) {
name = sprintf("ratDrawn%d", dcnt);
dcnt++;
}
printf("\tNet(\"%s\" %s)\n", name, style);
next;
}
{
print;
}