#usage "Import an EAGLE-Net-List into a schematic\n" "

" "Usage:

" "RUN cmd-net-list2sch [netlist-file ]

" "RUN cmd-net-list2sch [net device pin device pin ]

" "RUN cmd-net-list2sch : Opens a file dialog to select the Net list file." "

" "Example:

" "RUN cmd-net-list2sch hexapod.lst

" "RUN cmd-net-list2sch IN1 R1 1 C1 2

" "RUN cmd-net-list2sch clk ic1 9 ic3 15

" "Attention:" "

" "In special situations it could happen that importing a netlist " "into a schematic (in form of 'airwires' as it happens here) " "results in misconnections. This is the case if a net line " "overlaps a pin connection point. If this certain pin under the " "net should get connected later, EAGLE will connect to the net " "instead of the pin under it.

" "We want to avoid this problem in the ULP by drawing the net " "line from the first pin with an offset of 50 mil. This way " "diagonal net lines will be drawn and there will be hardly pins " "that lie under net lines.

" "If a net has to be drawn on a further sheet of the schematic " "EAGLE uses the diagonal offset of 50 mil and places an " "additional LABEL." "

" "Author: support@cadsoft.de" // THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED /* German info "ACHTUNG

\n" "Das Einlesen einer Netzliste (Airwire) in den Schaltplan, " "kann in besonderen Situationen zu falschen Verbindungen fuehren.

\n" "Werden die Netze als "Luftlinien" zwischen den Bauteilpins gezeichnet, " "so kann es vorkommen, dass eine Netzlinie Bauteilpins ueberlagert. " "Wird spaeter dieser Pin unter der Linie an ein Netz angeschlossen " "so nimmt EAGLE das Netz als Kontaktpunkt und nicht den " "darunterliegenden Pin.

" "In diesem ULP wird versucht diese Problematik zu umgehen, in dem vom " "ersten Pin mit einem Offset (50mil) vom Pin weg " "und dann zum zweiten Pin gezeichnet wird. Dadurch entstehen diagonale " "Luftlinien die nur in seltenen Faellen einen Pin ueberlagern.

\n" "Wird ein Netz auf einer anderen Schaltplanseite weitergefuehrt, " "so wird vom Pin um 50 Mil diagonal weggezeichnet und zusaetzlich " "ein LABEL plaziert.

\n" */ // Eagle NET-Command definition string net_name = strupr(argv[1]); string device_a = strupr(argv[2]); string pin_a = strupr(argv[3]); string device_b = strupr(argv[4]); string pin_b = strupr(argv[5]); string cmd = ""; string lines[]; int nLines; //string s; // *** Eagle NET LIST definition *** string tok_Net = "Net"; string tok_Part = "Part"; string tok_Pad = "Pad"; string netlistLines[]; string signalName; int signalCnt = 0; string NetListfileName; // *** functions *** int actSheet(UL_SHEET S) { return S.number; } void readNetList(void) { int sn = 0; for (sn = 0; sn < nLines; sn++) { // search for start line "Net Part Pin" in Eagle Netlist if( (strstr(lines[sn], tok_Net) == 0) && (strstr(lines[sn], tok_Part) >= 8) && (strstr(lines[sn], tok_Pad) >= 16) ) { sn++; break; } } if (sn == nLines) { dlgMessageBox(NetListfileName + " is not a Eagle-Netlist", "OK"); exit (0); } string netName; string dev; string pin; string dev_b; string pin_b; do { signalCnt = strsplit (netlistLines, lines[sn], ' '); if (signalCnt > 1) { // init NET command int ncnt = 1; if (netlistLines[0]) { netName = netlistLines[0]; do { if (netlistLines[ncnt]) { dev = netlistLines[ncnt]; ncnt++; break; } ncnt++; } while (ncnt <= signalCnt); do { if (netlistLines[ncnt] ) { pin = netlistLines[ncnt]; ncnt++; } ncnt++; } while (ncnt <= signalCnt); } else { do { if (netlistLines[ncnt]) { dev_b = netlistLines[ncnt]; ncnt++; break; } ncnt++; } while (ncnt <= signalCnt); do { if (netlistLines[ncnt] ) { pin_b = netlistLines[ncnt]; } ncnt++; } while (ncnt <= signalCnt); cmd += "run " + argv[0] + " " + netName + " " + dev + " " + pin + " "; cmd += dev_b + " " + pin_b + ";\n"; dev = dev_b; pin = pin_b; dev_b = ""; pin_b = ""; } } sn++; } while (sn <= nLines); return; } // *** MAIN *** if (schematic) { // run as net command if (device_b && pin_b) { int pinA_sheet = 0; int pinB_sheet = 0; int xA, yA, xB, yB; string g = ";\nGRID LAST;\n"; int actualsheet; if (sheet) sheet(SH) actualsheet = SH.number; // *** Schematic coord. *** schematic(S) { cmd = "SET WIRE_BEND 2;\nGRID MIL 50 2 ;\n"; S.sheets(SH) { SH.parts(PA) { if (PA.name == device_a ) { PA.instances(IN) { IN.gate.symbol.pins(P) // Pin { if (P.contact) { string cp = P.contact.name; // PAD name von Connect/Pad if (cp == pin_a) { xA = P.x; yA = P.y; pinA_sheet = SH.number; } } } } } if (device_b) { if (PA.name == device_b ) { PA.instances(IN) { IN.gate.symbol.pins(P) // Pin { if (P.contact) { string cp = P.contact.name; // PAD name von Connect/Pad if (cp == pin_b) { xB = P.x; yB = P.y; pinB_sheet = SH.number; } } } } } } } } } if (net_name) net_name = "'" + net_name + "'"; // place Name in ' ' for NET-Command string s; if ( (pinA_sheet != 0) && (pinB_sheet != 0) ) { if (pinA_sheet == pinB_sheet) { if (actualsheet != pinA_sheet) { sprintf(s, "EDIT .s%d;\n", pinA_sheet); cmd += s; } sprintf(s, "NET %s (%.3f %.3f)", net_name, u2mil(xA), u2mil(yA) ); cmd += s; sprintf(s, " (%.3f %.3f)", u2mil(xA)+50, u2mil(yA)-50 ); cmd += s; sprintf(s, " (%.3f %.3f);\n", u2mil(xB), u2mil(yB) ); cmd += s; exit (cmd + g); } else { if (actualsheet != pinA_sheet) { sprintf(s, "EDIT .s%d;\n", pinA_sheet); cmd += s; } sprintf(s, "NET %s (%.3f %.3f)", net_name, u2mil(xA), u2mil(yA) ); cmd += s; sprintf(s, " (%.3f %.3f);\n", u2mil(xA)+50, u2mil(yA)+50 ); cmd += s; sprintf(s, "LABEL (%.3f %.3f)", u2mil(xA), u2mil(yA) ); cmd += s; sprintf(s, " (%.3f %.3f);\n", u2mil(xA)+50, u2mil(yA)+50 ); cmd += s; sprintf(s, "CHANGE LAYER 91 (%.3f %.3f);\n", u2mil(xA)+50, u2mil(yA)+50 ); cmd += s; if (actualsheet != pinB_sheet) { sprintf(s, "EDIT .s%d;\n", pinB_sheet); cmd += s; } sprintf(s, "NET %s (%.3f %.3f)", net_name, u2mil(xB), u2mil(yB) ); cmd += s; sprintf(s, " (%.3f %.3f);\n", u2mil(xB)+50, u2mil(yB)+50 ); cmd += s; sprintf(s, "LABEL (%.3f %.3f)", u2mil(xB), u2mil(yB) ); cmd += s; sprintf(s, " (%.3f %.3f);\n", u2mil(xB)+50, u2mil(yB)+50 ); cmd += s; sprintf(s, "CHANGE LAYER 91 (%.3f %.3f);\n", u2mil(xB)+50, u2mil(yB)+50 ); cmd += s; exit (cmd + g); } } else { cmd = ""; if (pinA_sheet == 0) cmd += "Device " + device_a + " Pin " + pin_a + "\n"; if (pinB_sheet == 0) cmd += "Device " + device_b + " Pin " + pin_b + "\n"; cmd += "not fond!"; dlgMessageBox(cmd, "OK"); exit (-1); } } // run as script converter else { string ulp_path ; char bkslash = '/'; int pos = strrchr(argv[0], bkslash); if (pos >= 0) ulp_path = strsub(argv[0], 0, pos + 1); // File handling int n = 0; string text; int nBytes; if (argv[1]) NetListfileName = argv[1]; else NetListfileName = dlgFileOpen("Select Script File", "*.*", "*.*"); if (NetListfileName) { nLines = fileread(lines, NetListfileName); readNetList(); } output(NetListfileName + "x", "wt") printf("%s", cmd); exit (cmd); } } else { dlgMessageBox("Start this ULP from a schematic!", "OK"); exit (0); }