#usage "en:Place a text Spiceorder xx at all pins in symbol.

" "To simulate a schematic in LTspice IV, you can export the schematic and " "the symbols of a library t a LTspice .asc file format with export-ltspice.ulp.
" "To simulate in Spice, the pins must have a SpiceOrder.
" "To assigning the spiceorder unique to a pin, you must place the text SiceOrder xx " "on the coordinate of the pin on the layer 99 SpiceOrder.
" "SpiceOrder is a reserved name
" "xx ist the number
" "You can use this ulp in device- and symbol-editor. If you start the ulp in a device, " "all used symbols of this device can place the spiceorder, if you start the ulp in a symbol, " "only this symbol will be edit.Author alf@cadsoft.de" , "de:Platziere einen Text SpiceOrder xx an jedem Pin im Symbol

" "Um einen Schaltplan in LTspive IV simulieren zu können, kann man mit dem " "export-ltspice.ulp einen Schaltplan so wie die Symbole der Bibliothek " "im LTspice .asc Format augeben.
" "Zum simulieren in Spice, muß für jeden Pin die SpiceOrder angegeben werden. " "Um die SpiceOrder eindeutig zuzuordnen, muß man im Symbol an jedem Pin " "(Koordinate des Pin) im Layer 99 SpiceOrder einen entsprtechenden Text " "platzieren." "

" "SpiceOrder ist ein reservierter Name.
" "xx ist die Nummer." "

" "Dieses ULP kann sowohl im Device-Editor wie im Symbol-Editor gestartet werden. " "Wird es im Device-Editor gestartet, denn kann man allen Symbolen die im Device " "benutzt werden die SpiceOrder zuweisen. Im Symbol-Editor gestartet nur dem Symbol " "das man gerade im Editor geladen hat." "

" "Author alf@cadsoft.de" string Version = "1.0.,0"; // 2012-06-28 alf@cadsoft.de string SpiceOrder = "SpiceOrder"; string PinName[], GateName[], Symbols[], SpiceOrderNum[]; string List[]; int PinX[], PinY[]; int CntPin = 0; int OrderExist[]; int OrderExistCollect = 0; int LayerSpiceOrder = 99; // Die Zuordnung der Pins zu der SpiceOrder geschieht über den Text SpiceOrderXX // und wird als Text in diesem Layer abgelegt! int ColorViolett = 5; string DefLayerSpiceLayer = ""; // if not exist this layer int test = 0; // test option zum debuggen /*** functions ***/ string checkapostroph(string s) { // da der ganze String in ' eingeschlossen wird, // müssen die Apostrophen verdoppelt werden. string t[]; int cnt; cnt = strsplit(t, s, '\''); // check Apostroph if (cnt > 1) { s = ""; for (int i = 0; i < cnt; i++) { if (i == 0) { if (t[i]) s += t[i]; } else if (i) s += "''" + t[i]; } } return s; } void genLine(int n) { sprintf(List[n], "%d\t%s\t%s\t%s\t%s\t%.4f\t%.4f", n, Symbols[n], GateName[n], PinName[n], SpiceOrderNum[n], u2mil(PinX[n]), u2mil(PinY[n])); return; } void getOrderText(UL_SYMBOL S) { S.texts(T) { if (T.layer == LayerSpiceOrder) { string s[]; int cnt = strsplit(s, T.value, ' '); if (s[0] == SpiceOrder) { S.pins(P) { int found = 0; for (int n = 0; n < CntPin; n++) { if (T.x == PinX[n] && T.y == PinY[n] && S.name == Symbols[n]) { sprintf(s[2] , "%d %s %.4f %.4f / %.4f %.4f", n, PinName[n], u2mil(P.x), u2mil(P.y), u2mil(PinX[n]), u2mil(PinX[n])); SpiceOrderNum[n] = s[1]; genLine(n); found = 1; OrderExist[n] = 1; OrderExistCollect = 1; break; } } if (found) break; } } } } return; } int checkGsymbolName(string symname) { int exist = 0; for (int n = 0; n < CntPin; n++) { if (Symbols[n] == symname) { exist = 1; break; } } return exist; } int genScript(void) { string cmd, s; string gate = ""; for (int n = 0; n < CntPin; n++ ) { if (gate != GateName[n] || symbol) { // || symbol, um aus einem Symbol heraus die SpiceOrder zu definieren sprintf(s, "Edit '%s.SYM';\nGRID MIL 100 1;\n", checkapostroph(Symbols[n])); cmd+=s; sprintf(s, "LAYER %d SpiceOrder;\n", LayerSpiceOrder); cmd+=s; sprintf(s, "SET COLOR_LAYER %d %d;\n", LayerSpiceOrder, ColorViolett); // SET COLOR_LAYER layer color; cmd+=s; sprintf(s, "DISPLAY NONE %d;\n", LayerSpiceOrder); cmd+=s; sprintf(s, "CHANGE Size 16;\nLayer %d;\n", LayerSpiceOrder); cmd+=s; sprintf(s, "CHANGE Align Center;\n"); cmd+=s; gate = GateName[n]; } if (OrderExist[n] ) { sprintf(s, "DELETE (%.4f %.4f);\n", u2mil(PinX[n]), u2mil(PinY[n]) ); cmd+=s; } if (!SpiceOrderNum[n]) { dlgMessageBox("First define SpiceOrder!", "OK"); return 0; } sprintf(s, "TEXT 'SpiceOrder %s' R0 (%.4f %.4f);\n", SpiceOrderNum[n], u2mil(PinX[n]), u2mil(PinY[n]) ); cmd+=s; } sprintf(s, "DISPLAY ALL;\n"); cmd+=s; if (test) { dlgDialog("Test") { dlgHBoxLayout dlgSpacing(600); dlgHBoxLayout { dlgVBoxLayout dlgSpacing(600); dlgTextEdit(cmd); } dlgHBoxLayout { dlgPushButton("OK") dlgAccept(); dlgPushButton("esc") { dlgReject(); exit(-99); } } }; } exit(cmd); } void getSymbolPin(string sname, string gname) { library(L) { L.symbols(SYM) { if (SYM.name == sname) { SYM.pins(P) { PinName[CntPin] = P.name; Symbols[CntPin] = SYM.name; PinX[CntPin] = P.x; GateName[CntPin] = gname; PinY[CntPin] = P.y; genLine(CntPin); CntPin++; } getOrderText(SYM); break; } } } return; } void getSpiceOrder(int n) { string neworder = SpiceOrderNum[n]; dlgDialog("Get Spiceorder") { dlgGridLayout { dlgCell(0, 0) dlgHBoxLayout { dlgStretch(1); dlgLabel("Symbol:"); } dlgCell(0, 1) dlgLabel(Symbols[n]); dlgCell(1, 0) dlgHBoxLayout { dlgStretch(1); dlgLabel("Gate:"); } dlgCell(1, 1) dlgLabel(GateName[n]); dlgCell(2, 0) dlgHBoxLayout { dlgStretch(1); dlgLabel("Pin:"); } dlgCell(2, 1) dlgLabel(GateName[n]+ "." + PinName[n]); dlgCell(3, 0) dlgLabel("Spiceorder "); dlgCell(3, 1) dlgStringEdit(neworder); } dlgHBoxLayout { dlgPushButton("+OK") dlgAccept(); dlgPushButton("-CANCEL") { dlgReject(); return; } } }; SpiceOrderNum[n] = neworder; genLine(n); return; } /*** main ***/ if (deviceset || symbol) { if (deviceset) { deviceset(DV) { DV.gates(G) { if (!checkGsymbolName(G.symbol.name)) { getSymbolPin(G.symbol.name, G.name); } } } } if (symbol) { symbol(S) { if (!checkGsymbolName(S.name)) { getSymbolPin(S.name, ""); } } } int sel; dlgDialog("Spiceorder") { dlgHBoxLayout dlgSpacing(500); dlgHBoxLayout { dlgVBoxLayout dlgSpacing(500); dlgListView("#\tSymbol\tGate\tPin\tSpiceorder\tX\tY", List, sel) getSpiceOrder(sel); } if (OrderExistCollect) dlgLabel("ATTENTION: SpiceOrder exist!"); dlgHBoxLayout { dlgPushButton("+OK") { if(genScript()) dlgAccept(); } dlgPushButton("-CANCEL") { dlgReject(); exit(-1); } dlgStretch(1); dlgPushButton("&Help") dlgMessageBox(usage, "OK"); } }; } else dlgMessageBox("Start this ULP in Deviceset!", "OK");