/* SCMEDFDI (SCM) -- Convert EDIF SCM Data */ /* SCMEDFDI (SCM) -- EDIF SCM-Daten konvertieren */ /* // Copyright (c) 1999-2012 Oliver Bartels F+E, Muenchen // Author: Roman Ludwig // Changes History: // rl (120427) RELEASED FOR BAE V7.8. // rl (101220) ENHANCEMENT: // Added instance name backannotation entries support. // rl (101019) RELEASED FOR BAE V7.6. // rl (091021) RELEASED FOR BAE V7.4. // rl (081014) RELEASED FOR BAE V7.2. // rl (071029) RELEASED FOR BAE V7.0. // rl (070109) ENHANCEMENT: // Added automatic loglib run option. // rl (060829) RELEASED FOR BAE V6.8. // rl (050906) RELEASED FOR BAE V6.6. // rl (050331) ENHANCEMENT: // Added pin type attribute support. // Added symbol attribute list placement support. // rl (040811) RELEASED FOR BAE V6.4. // rl (040119) ENHANCEMENT: // Applied new full pin connectivity mode to created plans. // rl (030904) RELEASED FOR BAE V6.2. // rl (021209) RELEASED FOR BAE V6.0. // rl (021014) ENHANCEMENT: // Added additional orthogonal segment to pin/pin overlap // position to establish connection in case of transit segment. // Fixed problems with scale factor. // rl (020618) RELEASED FOR BAE V5.4. // rl (010625) RELEASED FOR BAE V5.0. // rl (010529) ENHANCEMENT: // Added optional parameter settings from bae.ini file. // rl (000830) RELEASED FOR BAE V4.6. // rl (000419) ENHANCEMENT: // Introduced pin rotation support. // rl (991112) RELEASED FOR BAE V4.4. // rl (990429) ORIGINAL CODING. // // DESCRIPTION // // The scmedfdi User Language program converts a EDIF data file // to BAE SCM format. Logical library definitions are generated automatically. */ // Includes #include "baeparam.ulh" // User Language BAE param. access #include "scm.ulh" // User Language SCM utilities #include "pop.ulh" // User Language popup utilities // Disable undo state request #pragma ULCALLERNOUNDO // Messages string UPRPEXIT = M_UPRPEXIT(); string REPLOGHD0 = M("BAE SCM EDIF Konvertierung", "BAE SCM EDIF Conversion"); string REPLOGHD1 = M("Fehlerreport:","Error report:"); string REPLIBCONV = M("Konvertieren Library Datei...", "Converting library file..."); string REPDONE = M("Es wurden keine Fehler festgestellt.", "Operation completed."); string UPRLIBFILE = M("Library-Eingabedatei ? ","Library Input File ? "); string UPROVRWRITE = M("Zieldatei '%s' ersetzen ?", "Replace destination file '%s' ?"); string ERRTMPWRITE = M("Fehler beim Schreiben der Temporaerdatei '%s'!", "Error writing temporary file '%s'!"); string ERRLIBOPEN = M("Library-Eingabedatei '%s' kann nicht geoeffnet werden!", "Couldn't open library file '%s'!"); string ERRLOGCREA = M("Logische Bibliothek '%s' kann nicht erzeugt werden!", "Couldn't create logical library file '%s'!"); string ERRMAPCREA = M("Mappingdatei '%s' kann nicht erzeugt werden!", "Couldn't create logical library file '%s'!"); string ERRPLCPOLY = M("Fehler bei der Polygonerzeugung (%s %s: %.1fmm,%.1fmm)!", "Error generating polygon (%s %s: %.1fmm,%.1fmm)!"); string ERRPLCTEXT = M("Fehler bei der Textplatzierung (%s %s: '%s')!", "Error placing text (%s %s: '%s')!"); string ERRPLCPIN = M("Fehler bei der Pinplatzierung (%s %s: '%s')!", "Error placing pin (%s %s: '%s')!"); string ERRPLCCON = M("Fehler bei der Verbindungsplatzierung (%s %s: %.1fmm,%.1fmm)!", "Error placing connection (%s %s: %.1fmm,%.1fmm)!"); string ERRPLCSYM = M("Fehler bei der Symbolplatzierung (%s %s: %s, %s)!", "Error placing symbol (%s %s: %s, %s)!"); string ERRRENSYM = M("Fehler bei der Symbolumbenennung (%s %s: %s, %s)!", "Error renaming symbol (%s %s: %s, %s)!"); string ERRPLCLAB = M("Fehler bei der Labelplatzierung (%s %s: %s, %s)!", "Error placing label (%s %s: %s, %s)!"); string ERRPLCPORT = M("Fehler bei der Portplatzierung (%s %s: %s, %s)!", "Error placing port (%s %s: %s, %s)!"); string ERRPLCTAP = M("Plan '%s' Bustap '%s' (%.1fmm,%.1fmm) konnte nicht platziert werden!", "Sheet '%s' Bustap '%s' (%.1mm,%.1mm) could not be placed!"); string ERRSETATTR = M("Fehler bei der Attributzuweisung (%s %s: %s, %s, %s)!", "Error assigning attributes (%s %s: %s, %s, %s)!"); string ERRBTAPREC = M("Plan '%s' Bustap '%s' zu viele Unterbusse (Busschleife?)!", "Sheet '%s' bustap '%s' too many sub busses (bus loop?)!"); string ERRBTAPLNAME = M("Plan '%s' Namenskombination Bus '%s'/Bustap '%s' %d Zeichen zu lang!", "Sheet '%s' name combination bus '%s'/bus tap '%s' %d chars too long!"); string ERRCPMARK = M("Marker '%s' nicht in Bibliothek '%s'!", "Marker '%s' not defined in library '%s'!"); string ERRCPLABEL = M("Label '%s' nicht in Bibliothek '%s'!", "Label '%s' not defined in library '%s'!"); // INI file parameter name definitions #define PAR_SEDFIFEXT "SEDFIFEXT_SCM" // Library input file name extension #define PAR_SMAPEXT "SYMMAPEXT_SCM" // Symbol mapping file ext. #define PAR_EDFDEFFEXT "EDFDEFFEXT_SCM"// Logical library file name extension #define PAR_EDFPOWMODE "EDFPOWMODE_SCM"// Power pin process mode #define PAR_EDFPOWEXT "EDFPOWEXT_SCM" // Power symbol name extension #define PAR_EDFVALATT "EDFVALATT_SCM" // Value attribute name #define PAR_EDFTMPFLAG "EDFTMPFLAG_SCM"// Temporary file conversion flag #define PAR_EDFTMPFILE "EDFTMPFILE_SCM"// Library temporary file name #define PAR_EDFNAMEPAT "EDFNAMEPAT_SCM"// Symbol name pattern #define PAR_EDFRENAME "EDFRENAME_SCM" // Name/rename mode #define PAR_EDFSYMOFF "EDFSYMOFF_SCM" // Symbol boundary offset #define PAR_EDFNAMESIZ "EDFNAMESIZ_SCM"// Name text size #define PAR_EDFVALSIZ "EDFVALSIZ_SCM" // Value text size #define PAR_EDFPNAMSIZ "EDFPNAMSIZ_SCM"// Pin name text size #define PAR_EDFPNUMSIZ "EDFPNUMSIZ_SCM"// Pin number text size #define PAR_EDFCOMMSIZ "EDFCOMMSIZ_SCM"// Commentary text size #define PAR_EDFALOFF "EDFALOFF_SCM" // Alias placement offset #define PAR_EDFDOTDRAW "EDFDOTDRAW_SCM"// Dot draw flag #define PAR_EDFDOTRAD "EDFDOTRAD_SCM" // Dot radius #define PAR_EDFZERORAD "EDFZERORAD_SCM"// Zero circle radius #define PAR_EDFATTRL "EDFATTRL_SCM" // Attribute list #define PAR_EDFLENFAC "EDFLENFAC_SCM" // Length correction factor #define PAR_EDFPINTMODE "EDFPINTMODE_SCM"// Pin text mode #define PAR_EDFPINTCLASS "EDFPINTCLASS_SCM"// Pin text class #define PAR_EDFLOGLIB "EDFLOGLIB_SCM" // Automatic loglib run flag #define PAR_SYMLIB "SYMGRPLIB_SCM" // Symbol library #define PAR_SYMGRP "SYMGRPNAME_SCM"// Symbol group #define PAR_EDFSRENAME "EDFSRENAME_SCM"// Symbol rename mode // Global definitions string LIBEXT = bae_inistrval(PAR_SEDFIFEXT,".edf") /* Library input file name ext. */; string LOGEXT = bae_inistrval(PAR_EDFDEFFEXT,".def") /* Logical library file name ext. */; string MAPEXT = bae_inistrval(PAR_SMAPEXT,".map") /* Mapping file name ext. */; string SYMGRP = bae_inistrval(PAR_SYMGRP,"") /* Symbol group name */; string SYMLIB = bae_inistrval(PAR_SYMLIB,"") /* Symbol group library file */; int POWMODE = bae_iniintval(PAR_EDFPOWMODE,2) /* Power pin process mode */; string POWEXT = bae_inistrval(PAR_EDFPOWEXT,"_pow") /* Power symbol name ext. */; string VALATTR = bae_inistrval(PAR_EDFVALATT,"$val") /* Value attribute name */; int TMPFLAG = bae_iniintval(PAR_EDFTMPFLAG,1) /* Temporary file conversion flag */; int PINTMODE = bae_iniintval(PAR_EDFPINTMODE,2) /* Pin text mode */; int PINTCLASS = bae_iniintval(PAR_EDFPINTCLASS,1) /* Pin text class */; string TMPFILE = bae_inistrval(PAR_EDFTMPFILE,"edflib.pxx") /* Library temporary file name */; string NAMEPAT = bae_inistrval(PAR_EDFNAMEPAT,"????") /* Symbol name pattern */; int RENAMEMODE = bae_iniintval(PAR_EDFRENAME,0) /* Name/rename mode */; int SYMRENAME = bae_iniintval(PAR_EDFSRENAME,0) /* Name/rename mode */; double SYMOFF = bae_inidblval(PAR_EDFSYMOFF,0.001) /* Symbol boundary offset */; double NAMESIZ = bae_inidblval(PAR_EDFNAMESIZ,0.002) /* Name text size */; double VALSIZ = bae_inidblval(PAR_EDFVALSIZ,0.002) /* Value text size */; double PNAMSIZ = bae_inidblval(PAR_EDFPNAMSIZ,0.002) /* Pin name text size */; double PNUMSIZ = bae_inidblval(PAR_EDFPNUMSIZ,0.002) /* Pin number text size */; double COMMSIZ = bae_inidblval(PAR_EDFCOMMSIZ,0.001) /* Commentary text size */; double ALIASOFF = bae_inidblval(PAR_EDFALOFF,0.00075) /* Alias placement offset */; int DOTDRAW = bae_iniintval(PAR_EDFDOTDRAW,0) /* No dot draw */; double DOTRAD = bae_inidblval(PAR_EDFDOTRAD,0.0005) /* Dot circle radius */; double ZEROCRAD = bae_inidblval(PAR_EDFZERORAD,0.0005) /* Zero circle radius */; double LENFAC = bae_inidblval(PAR_EDFLENFAC,20.0) /* Length correction factor */; int AUTOLOGLIB = bae_iniintval(PAR_EDFLOGLIB,1) /* Automatic loglib run */; struct attrdes { // Attribute descriptor string attname /* Attribute name */; string attprop /* Attribute property name */; int attdisp /* Attribute display flag */; int attmode /* Attribute display process mode */; } /* Attribute list */; struct attrdes defattrl[] = { // Default attribute list { "$id" , "part_number" ,"",0 }, { "$plname" , "pcb_footprint" ,"",0 } }; struct attrdes attrl[] /* Attribute list */; int attrn /* Attribute count */; #define SMALLVAL 0.000000001 // Small compare value #define SDVAL 0.00005 // Small distance value double PI = cvtangle(180.0,1,2) /* (Constant) PI value */; #define CHRWTOH 32.0/48.0 // Char. width to height factor #define PINMAC "p" // Pin macro #define VALPROP "value" // Value property name #define TEMPINAME "instbatemp%d" // Temporary instance backannotated name #define DELPREFIX "atbb-ed02-a-reserve_" // Deletion prefix // Data input buffers int deffh /* Logical definition file handle */; int mapfh /* Mapping definition file handle */; string ddbfname /* Database output file name */; string ddbfsname /* Short database file name */; int symfh /* Symbol name log file handle */; int strfh /* Symbol name transl. file handle */; // Scanner variables string cursymname[] /* Current symbol name */; int cursymn=0 /* Current symbol name count */; string curplname /* Current part library name */; string curdesignator /* Current designator name */; string curportname /* Current port name */; string curportoname /* Current port original name */; string curpropname /* Current property name */; string curcellref = "" /* Current cell reference */; string curstrval /* Current string value */; string curstrdisp /* Current string display */; int curstrdispflag = 0 /* Current string display flag */; string curdispgrp /* Current display group name */; int curcellcode = 0 /* Current cell type */; int curclass /* Current element class */; double curlx, curly /* Current plan lower boundary */; double curux, curuy /* Current plan upper boundary */; double curx, cury /* Current coordinates */; double curorgx, curorgy /* Current origin coordinates */; double curdotx, curdoty /* Current dot coordinates */; double curhotx, curhoty /* Current hot spot coordinates */; double curconlx, curconly /* Cur. connect location coords. */; double curtransx, curtransy /* Cur. transformation coordinates */; int curtransori /* Cur. transformation orientation */; int curori /* Current orientation */; int curnameass /* Current name assignment */; int curarray = 0 /* Current array flag */; int curdisplay = 0 /* Current display flag */; int curmember = 0 /* Current member flag */; int curmembnum = (-1) /* Current member number */; int curnet = 0 /* Current net flag */; int currename = 0 /* Current rename flag */; int netpolyoff = 0 /* Current net polygon index offset */; int curripsym = 0 /* Current array flag */; int curtitledisp /* Current title block display flag */; double cursize /* Current size */; string curid /* Current identifier */; int curcell = 0 /* Current cell state */; string curpageblock /* Current page block name */; int curpage = 0 /* Current page state */; int curpagesym = 0 /* Current page symbol state */; int curpagedone = 0 /* Current page done state */; int curport = 0 /* Current port state */; int curportimp = 0 /* Cur. port implementation state */; int curportiref = (-1) /* Cur. port imp. inst. index */; int curportinst = 0 /* Cur. port instance state */; int curportlist = 0 /* Cur. port list state */; int curinstance = 0 /* Current instance state */; int curdes = 0 /* Current designator state */; int curprop = 0 /* Current property state */; int cursymbol = 0 /* Current symbol state */; int cursymboldone = 0 /* Current symbol done state */; int curview = 0 /* Current view state */; int curviewtype = 0 /* Current view type */; string curviewname = "" /* Current view name */; int curvaldisp = 0 /* Current value display flag */; double curvalx, curvaly /* Current value position */; double curvalang /* Current value angle */; int curvaljustify = 8 /* Current value justify mode */; double curpinnamex, curpinnamey /* Current pin name position */; int curpinnamejustify /* Current pin name justify */; int curpinnameori /* Current pin name orientation */; int curpinnamedisp = 0 /* Current pin name display flag */; double curpinnumx, curpinnumy /* Current pin number position */; int curpinnumori /* Current pin number orientation */; int curpinnumjustify /* Current pin number justify */; int curpinnumdisp = 0 /* Current pin number display flag */; double curnamex, curnamey /* Current name position */; double curnameang /* Current name angle */; int curnamejustify = 8 /* Current name justify mode */; int curnamedisp = 0 /* Current name display flag */; int curvisible = 1 /* Current visible state */; int curjustify = 0 /* Current justify mode */; int curbool = 0 /* Current boolean value */; double curflt /* Current float value */; double curexp /* Current float value */; double curint /* Current integer value */; double lenconv = 1.0 /* Length conv. factor (default m) */; double curscale = 1.0 /* Current scale factor */; double curxscale = 1.0 /* Current X scale factor */; double cursheetscale = 1.0 /* Current sheet scale factor */; int curunit = (-1) /* Current unit */; string textid = creatextid() /* Get multiline text base ID */; int mtextcnt = 0 /* Multiline text count */; struct pointdes { // Polygon point descriptor double x, y /* Point coordinates */; int t /* Point typ */; }; struct polydesc { // Polygon descriptor struct pointdes pl[] /* Polygon point list */; int ptyp /* Polygon type */; int netidx /* Polygon net index */; int pn /* Polygon point count */; } curpolyl[] /* Current polygon list */; int curpolyn /* Current pin count */; struct pointdes curpointl[] /* Point list */; struct boxdes { // Box descriptor double lx,ly /* Box lower corner */; double ux,uy /* Box upper corner */; }; struct pindesc { // Pin descriptor string name /* Pin name */; string oname /* Pin old name */; string rname /* Pin rename name */; string ptyp /* Pin type */; int sflag /* Pin symbol flag */; int portimp /* Pin port implementation flag */; double x, y /* Pin coordinates */; double ang /* Pin angle */; double namex, namey /* Pin name coordinates */; double nameang /* Pin name angle */; int namejustify /* Pin name justify */; int namedisp /* Pin name display */; double numx, numy /* Pin number coordinates */; double numang /* Pin number angle */; int numjustify /* Pin number justify */; int numdisp /* Pin number display */; string pxl[] /* Pin xlat name list */; int pxn /* Pin xlat count */; } curpinl[] /* Current pin list */; int curpinn /* Current pin count */; struct instdesc { // Instance descriptor string name /* Instance name */; string macro /* Instance macro */; string value /* Instance value */; string attrnl[] /* Instance attribute name list */; string attrvl[] /* Instance attribute value list */; int attrn /* Instance attribute count */; int ori /* Instance orientation */; int typ /* Instance type */; double x, y /* Instance coordinates */; double cx, cy /* Instance connection coordinates */; double namex, namey /* Instance name coordinates */; double nameang /* Instance name angle */; int namejustify /* Instance name justify */; int namedisp /* Instance name display */; double valx, valy /* Instance value coordinates */; double valang /* Instance value angle */; int valjustify /* Instance value justify */; int valdisp /* Instance value display */; } curinstl[] /* Current instance list */; int curinstn /* Current instance count */; struct instbadesc { // Instance backannotation descriptor string instname /* Internal instance name */; string planname /* Instance plan name */; string plcname /* Placed instance name */; string backname /* Backannotated instance name */; string plname /* Backannotated part lib. name */; } instbal[] /* Instance backannotation list */; int instbabase = 0 /* Instance backanno. base index */; string curinstbaname /* Instance backannotation name */; int instbaproc = 0 /* Instance backannotate command */; int instban = 0 /* Instance backannotation count */; int instback = 0 /* Instance backannotation flag */; string inirpname /* $rpname initial value */; struct textdesc { // Text descriptor double x, y /* Text coordinates */; double size /* Text size */; double angle /* Text angle */; string str /* Text string */; } curtextl[] /* Current text list */; int curtextn /* Current text count */; struct symdesc { // Symbol descriptor double x, y /* Symbol hot spot coordinates */; string name /* Symbol name */; int typ /* Symbol type */; int mainp /* Symbol main part flag */; int pagesym /* Symbol block flag */; } syml[] /* Current symbol list */; int inssymidx /* Symbol insert index */; int symn = 0 /* Current symbol count */; struct aliasdesc { // Alias descriptor double x, y /* Alias coordinates */; int ori /* Alias orientation */; string name /* Net name */; } curaliasl[] /* Current alias list */; int curaliasn /* Current alias count */; int fnalias /* First net alias index */; string strvalstk[] /* Current string value stack */; string namestk[] /* Current name stack */; string renamestk[] /* Current rename stack */; int namestkn = 0 /* Current name stack count */; int pointstk[] /* Current point index stack */; int pointstkn = 0 /* Current point index stack count */; struct boxdes boxstk[] /* Current box stack */; int boxstkn = 0 /* Current box stack count */; string netnamel[] /* Net name list */; int netnamen = 0 /* Net name count */; string dellabell[] = { // Label delete list "vcc5" }; int dellabeln = arylength(dellabell) /* Label delete count */; struct topcelldesc { // Top level cell descriptor double xl, yl /* Cell lower boundary */; double xu, yu /* Cell upper boundary */; struct pindesc pl[] /* Pin list */; int pn /* Pin count */; string name /* Top level name */; } tcelll[] /* Top cell level list */; int tcelln = 0 /* Top level cell count */; #define NTYP_MAC 0 // Symbol macro name type #define NTYP_NAME 1 // Symbol name type #define NTYP_GRP 2 // Display group name type #define NTYP_KEY 3 // Keyword name type #define NTYP_ANNOT 4 // Annotation name type struct renamedesc { // Rename definition descriptor string oname /* Original name */; string rname /* Rename name */; int typ /* Namespace type */; } renamel[] /* Rename definition list */; int renamen = 0 /* Rename definition count */; int curnametype[] = { NTYP_KEY } /* Current namespace type stack */; int curnametypen = 0 /* Current namespace type stack cnt. */; STRINGS msgl /* Message list */; int msgn = 0 /* Message count */; string oldlibfname /* Old library file name */; // Main program void main() { string libfname /* Library file name */; string logfname /* Logical library file name */; string mapfname /* Mapping file name */; string bakfname /* Backup file name */; string tmpname /* Temporary instance name */; string ename /* Element name */; string msg /* Message buffer */; STRINGS hl /* Popup menu header list */; int hn /* Popup menu header count */; int chgflag /* Plan changed flag */; int i /* Loop control variable */; // Get the attribute list for (attrn=0;attrn<1000;attrn++) { if ((attrl[attrn].attname=bae_inistrval( bae_inifieldvarname(PAR_EDFATTRL,attrn,0),""))=="") { // Check if list defined at all if (attrn==0) { // Use default attribute list attrl=defattrl; attrn=arylength(attrl); } break; } attrl[attrn].attprop=bae_inistrval( bae_inifieldvarname(PAR_EDFATTRL,attrn,1),""); attrl[attrn].attdisp=0; attrl[attrn].attmode=bae_iniintval( bae_inifieldvarname(PAR_EDFATTRL,attrn,2),0); } // Select the library input file if (bae_askfilename(libfname,LIBEXT,UPRLIBFILE) || libfname=="") error_abort(); // Get the output file names ddbfname=convstring(libfname,0)+DDBEXT; ddbfsname=convstring(libfname,2); logfname=convstring(libfname,0)+LOGEXT; mapfname=convstring(libfname,0)+MAPEXT; oldlibfname=scm_libfname(); // Get the symbol library name if (SYMLIB=="") SYMLIB=scm_deflibname(); // Check if file already exists fseterrmode(0); if ((deffh=fopen(ddbfname,0))!=(-1)) { fclose(deffh); sprintf(msg,UPROVRWRITE,ddbfname); if (!verify(msg,0)) error_abort(); bakfname=convstring(libfname,0)+".bak"; if ((deffh=fopen(bakfname,0))!=(-1)) { fclose(deffh); remove(bakfname); } rename(ddbfname,bakfname); } // Copy markers if (ddbcopyelem(oldlibfname,ddbfname,DDBCLSMRK,PINMAC,1)!=0) { sprintf(msg,ERRCPMARK,PINMAC,oldlibfname); error(msg); } if (ddbcopyelem(oldlibfname,ddbfname,DDBCLSMRK,"pin",1)!=0) { sprintf(msg,ERRCPMARK,"pin",oldlibfname); error(msg); } if (ddbcopyelem(oldlibfname,ddbfname,DDBCLSMRK,"terminal",1)!=0) { sprintf(msg,ERRCPMARK,"terminal",oldlibfname); error(msg); } if (ddbcopyelem(oldlibfname,ddbfname,DDBCLSMRK,"junction",1)!=0) { sprintf(msg,ERRCPMARK,"junction",oldlibfname); error(msg); } if (ddbcopyelem(oldlibfname,ddbfname,DDBCLSLAB,"standard",1)!=0) { sprintf(msg,ERRCPLABEL,"standard",oldlibfname); error(msg); } if (ddbcopyelem(oldlibfname,ddbfname,DDBCLSLAB,"port",1)!=0) { sprintf(msg,ERRCPLABEL,"port",oldlibfname); error(msg); } if (ddbcopyelem(oldlibfname,ddbfname,DDBCLSLAB,"bustap",1)!=0) { sprintf(msg,ERRCPLABEL,"bustap",oldlibfname); error(msg); } // Create logical library file if ((deffh=fopen(logfname,1))==(-1)) errormsg(ERRLOGCREA,logfname); if (SYMRENAME) { symfh=fopen(convstring(libfname,0)+"_sym.txt",1); strfh=fopen(convstring(libfname,0)+"_rename.txt",0); } else { symfh=strfh=(-1); } // Start the logical library file fprintf(deffh,"loglib\n"); // Create mapping file if ((mapfh=fopen(mapfname,1))==(-1)) errormsg(ERRMAPCREA,mapfname); // Save current state for undo bae_callmenu(MNU_BAESAVESTATE); // Process the library file parsefile(libfname); // Check if backannotated part names if (instback) { // First rename to temporary names ename=""; while (scanddbenames(ddbfname,DDBCLSCM,ename)==1) { // Load the plan if not already in memory if (ddbfname!=bae_planfname() || ename!=bae_planename()) { if (ddbfname==bae_planfname()) bae_setintpar(22,1); loadddbelem(ddbfname,ename,DDBCLSCM); } chgflag=bae_plannotsaved(); for (i=0;i=arylength(ERRS)) sprintf(msg,ERRS[arylength(ERRS)-1],status); else sprintf(msg,ERRS[status], fn,synscanline(),synscanstring()); // Print the error message error(msg); } // Parser action routines int p_annot() // Receive a annotate command // Returns : zero if done or (-1) on error { curorgx=0.0; curorgy=0.0; curjustify=0; curori=0; cursize=NAMESIZ; incnamespace(NTYP_ANNOT); // Return without errors return(0); } int p_annotend() // Receive an annotate end // Returns : zero if done or (-1) on error { double ang /* Text angle */; if (curview!=1) { decnamespace(); return(0); } ang=curori*0.5*PI; textadjust(curstrdisp,curjustify,0,curorgx,curorgy,ang,cursize, curtextl[curtextn].x,curtextl[curtextn].y,curtextl[curtextn].angle,0); curtextl[curtextn].str=textstrconv(curstrdisp); curtextl[curtextn].size=cursize; curtextn++; curjustify=0; decnamespace(); // Return without errors return(0); } int p_arc() // Receive an arc // Returns : zero if done or (-1) on error { double x1,y1 /* First arc point */; double x2,y2 /* Second arc point */; double xp,yp /* Sekant vector */; double xm,ym /* Center point coordinates */; double xs,ys /* Sekant middle point coordinates */; double xa,ya /* Center vector components */; double r /* Radius */; double lp /* Sekant length */; double ap /* Sekant arc point distance */; int ptyp /* Point typ */; int sidx /* Polygon point list start index */; // Check if symbol skip if (curview!=1 || pointstkn<1 || (pointstk[pointstkn]-pointstk[pointstkn-1])<3) return(0); sidx=pointstk[pointstkn]-3; // Last point is third arc point x1=curpointl[sidx].x; y1=curpointl[sidx].y; xa=curpointl[sidx+1].x; ya=curpointl[sidx+1].y; x2=curpointl[sidx+2].x; y2=curpointl[sidx+2].y; // Get sekant middle to arc point vector and length xs=0.5*(x1+x2)-xa; ys=0.5*(y1+y2)-ya; ap=sqrt(xs*xs+ys*ys); // Get sekant vector and length xp=x2-x1; yp=y2-y1; lp=sqrt(xp*xp+yp*yp); // Very small arc angle, don't create arc (line interpolation) if (lp<=SMALLVAL) return(0); // Calculate arc radius r=0.5*lp/cos(0.5*PI-2.0*atan(2.0*ap/lp)); // Normalize sekant vector xp/=lp; yp/=lp; // Create left or right arc according to sekant/arcpoint orientation if ((yp*xs-xp*ys)>=0.0) { xm=xa+r*yp; ym=ya-r*xp; ptyp=2; } else { xm=xa-r*yp; ym=ya+r*xp; ptyp=1; } // Store the arc center point curpointl[sidx+1].x=xm; curpointl[sidx+1].y=ym; curpointl[sidx+1].t=ptyp; // Return without errors return(0); } int p_array() // Receive an array flag // Returns : zero if done or (-1) on error { curarray=1; // Return without errors return(0); } int p_boundingbox() // Receive a bounding box // Returns : zero if done or (-1) on error { double lx,ly /* Lower box boundary */; double ux,uy /* Upper box boundary */; double t /* Temp. buffer */; if (curview!=1) return(0); // Dismiss stored polygon curpolyn--; curpolyl[curpolyn].pn=0; curpolyl[curpolyn].ptyp=0; // Get the box boundaries lx=curpolyl[curpolyn].pl[2].x; ly=curpolyl[curpolyn].pl[0].y; ux=curpolyl[curpolyn].pl[0].x; uy=curpolyl[curpolyn].pl[2].y; if (lx>ux) { t=lx; lx=ux; ux=t; } if (ly>uy) { t=ly; ly=uy; uy=t; } boxstk[boxstkn].lx=lx; boxstk[boxstkn].ly=ly; boxstk[boxstkn].ux=ux; boxstk[boxstkn].uy=uy; // Return without errors return(0); } int p_cellcode(int code) // Receive a cell type code // Returns : zero if done or (-1) on error { curcellcode=code; // Return without errors return(0); } int p_cellend() // Receive a symbol end // Returns : zero if done or (-1) on error { index C_FIGURE nfig /* New figure list element */; string macname /* Macro name */; string oldmacname /* Old label macro name */; string pinname /* Pin name */; string cmpname /* Pin compare name */; string pinmac /* Pin macro name */; string pintyp /* Pin type name */; string partname /* Part name */; string etapname /* Error bustap name */; string ebusname /* Error bus name */; string namepat = "" /* Name pattern */; int autoname /* Automatic name generation flag */; int errcode /* Error code */; int firstpin /* First pin flag */; int mainp /* Mainpart definition flag */; int pown /* Power pin count */; int pn /* Pin count */; int sidx /* Symbol index */; int skipdef /* Symbol definition skip flag */; int extsymb /* Extended symbol definitions flag */; int pagesym /* Page symbol flag */; int pinnum /* Pin number */; int res /* Symbol place result */; int symidx /* Symbol name index */; double xoff, yoff /* Symbol offset */; double ix, iy /* Current instance coordinates */; double bx, by /* Text base vector */; double x,y /* Bus entry coordinates */; double ang /* Current angle */; double angsin, angcos /* Current angle trig. values */; double s /* Scale factor */; int mirr /* Current mirror flag */; int mode /* Current text mode */; int start /* Text string start */; STRINGS rl /* Rule list */; int textcol = 0 /* Text column */; int len /* Current string length */; char c /* Character buffer */; int i, j, k /* Loop control variable */; // Check if cell type override by view name/name if (curcellcode==0 && curviewtype==1) curcellcode=3; if (curdesignator!="") { namepat=curdesignator; res=strlen(namepat)-1; if (namepat[res]=='?') namepat[res]='*'; else namepat+=NAMEPAT; } // Evaluate the cell code skipdef= curcellcode==1 ? 1 : 0 ; // Search undeclared power pins pown=mainp=0; for (i=0;i0 && curpinl[i].pxl[0]==curpinl[i].pxl[1]) // Set pin type curpinl[i].ptyp="sup"; if (curpinl[i].ptyp=="sup") { pown++; continue; } pn=0; for (j=1;j0) { // Set pin type to extended power curpinl[i].ptyp="xsup"; mainp=1; } } // Get the extended symbol definition flag extsymb= (curcellcode==2 || curcellcode==3 || curcellcode==4) ? 0 : 1 ; // Get the symbol class curclass= curpage ? DDBCLSCM : ((curpinn==1 && pown==1) || extsymb==0 ? DDBCLSLAB : DDBCLSSYM); s= curpage ? cursheetscale : 1.0 ; // Check if the element is already defined if (curpage) { symidx=1; partname=cursymname[0]; while (existddbelem(ddbfname,DDBCLSCM,partname)==1) { symidx++; partname=cursymname[0]+"_"+itoa(symidx); } cursymname[0]=partname; } else { skipdef|= (curpagedone || existddbelem(ddbfname,curclass,cursymname[0])==1) ? 1 : 0; } if (curclass==DDBCLSLAB) for (i=0;icurpinl[i].x || (curhotx==curpinl[i].x && curhotyinssymidx;i--) syml[i]=syml[i-1]; // Insert symbol syml[inssymidx].name=cursymname[0]; syml[inssymidx].x=curhotx; syml[inssymidx].y=curhoty; syml[inssymidx].mainp=mainp; syml[inssymidx].typ=curcellcode; syml[inssymidx].pagesym=curpagesym; symn++; symidx=inssymidx; } // Check if special main part definition required if (mainp && curclass==DDBCLSSYM && !curpage) { // Create schematic symbol element bae_clriactqueue(); bae_storemenuiact(1,1,LMB); bae_storetextiact(1,ddbfname); bae_storetextiact(1,cursymname[0]+POWEXT); if (bae_plannotsaved()) bae_storetextiact(1,M_UINYES()); bae_storetextiact(1,"m"); bae_storetextiact(1,"1"); bae_storetextiact(1,"1"); bae_setintpar(22,1); call(MNU_SCMCREELEM); bae_setintpar(22,0); // Set the plan boundaries boundset(curlx,curly,curux,curuy); if (SYMGRP!="") { bae_clriactqueue(); bae_storetextiact(1,SYMLIB); bae_storetextiact(1,SYMGRP); bae_storemouseiact(1,0.0,0.0,0,LMB); bae_setintpar(22,1); call(MNU_SCMLOADGRP); bae_setintpar(22,0); call(MNU_SCMGRPRESE); } // Perform the create element call bae_setintpar(22,1); call(MNU_BAEZOOMALL); bae_setintpar(22,0); // Place the symbol pins for (i=0;i0 ? curpinl[i].pxl[0] : curpinl[i].name, curpinl[i].numjustify,0, curpinl[i].numx,curpinl[i].numy, curpinl[i].numang,PNUMSIZ,x,y,ang,0); scm_attachtextpos(nfig,"$",x,y,ang,PNUMSIZ,0); } else if (PINTMODE!=5 && curpinl[i].namedisp && cap_lastfigelem(nfig)==0) { if (PINTMODE==1) { textadjust(curpinl[i].pxn>0 ? curpinl[i].pxl[0] : curpinl[i].name, curpinl[i].namejustify,0, curpinl[i].namex,curpinl[i].namey, curpinl[i].nameang,PNUMSIZ,x,y,ang,0); scm_attachtextpos(nfig,"$",x,y,ang,PNUMSIZ,0); } else if (PINTMODE==2) { scm_attachtextpos(nfig,"$", curpinl[i].x,curpinl[i].y,0.0,0.0,0); } } } if (scm_storetext("$rpname", 0.0,-2*(NAMESIZ+COMMSIZ),0.0,COMMSIZ,0,1)) { sprintf(msgl[msgn],ERRPLCTEXT, ddbclassname(bae_planddbclass()), bae_planename(),"$rpname"); msgn++; } // Set the symbol origin bae_clriactqueue(); bae_storemouseiact(1,curhotx,curhoty,2,LMB); call(MNU_SCMPARORIG); // Set the symbol name pattern if (namepat!="") { bae_clriactqueue(); bae_storetextiact(1,namepat); call(MNU_SCMPNAMPAT); } // Zoom overview bae_setintpar(22,1); call(MNU_BAEZOOMALL); bae_setintpar(22,0); // Save the symbol bae_setintpar(22,1); call(MNU_SCMSAVELEM); bae_setintpar(22,0); // Save identical symbols to other names for (i=1;i1 ? "pin" : "terminal") : PINMAC; pinnum=0; do { pinnum++; if (pinnum==1) pinname=curpinl[i].name; else sprintf(pinname,"%s_%d", curpinl[i].name,pinnum); } while ((res=scm_storepart(pinname,pinmac, curpinl[i].x,curpinl[i].y,curpinl[i].ang,0))==(-5)); if (res!=0) { sprintf(msgl[msgn],ERRPLCPIN, ddbclassname(bae_planddbclass()), bae_planename(),curpinl[i].name); msgn++; } if (PINTMODE==3) continue; if (curpinl[i].namedisp && cap_lastfigelem(nfig)==0) { textadjust(curpinl[i].name, curpinl[i].namejustify,0, curpinl[i].namex,curpinl[i].namey, curpinl[i].nameang,PNAMSIZ,x,y,ang,0); if (PINTMODE==5) { scm_attachtextpos(nfig,"$$", curpinl[i].x,curpinl[i].y,0.0,0.0,0); cmpname=curpinl[i].name; strupper(cmpname); if (scm_storetext( cmpname,x,y,ang,PNAMSIZ,0,mode)) { sprintf(msgl[msgn],ERRPLCTEXT, ddbclassname(bae_planddbclass()), bae_planename(),cmpname); msgn++; } else if (cap_lastfigelem(nfig)==0) // Assign the text class // predicate rule rsc_assfigintpred(nfig, RS_TXTCLASS,PINTCLASS,0,""); } else { scm_attachtextpos( nfig,"$$",x,y,ang,PNAMSIZ,0); } } else if (curpinl[i].numdisp && cap_lastfigelem(nfig)==0) { if (PINTMODE==4) { for (j=0;j0 ? curpinl[i].pxl[0] : curpinl[i].name, curpinl[i].numjustify,1, curpinl[i].numx,curpinl[i].numy, curpinl[i].numang,PNUMSIZ,x,y,ang,0); scm_attachtextpos(nfig,"$",x,y,ang,PNUMSIZ,0); } else if (PINTMODE!=5 && curpinl[i].namedisp && cap_nrefsearch(pinname,nfig)==0) { if (PINTMODE==1) { textadjust(curpinl[i].pxn>0 ? curpinl[i].pxl[0] : curpinl[i].name, curpinl[i].namejustify,0, curpinl[i].namex,curpinl[i].namey, curpinl[i].nameang,PNUMSIZ,x,y,ang,0); scm_attachtextpos(nfig,"$",x,y,ang,PNUMSIZ,0); } else if (PINTMODE==2) { scm_attachtextpos(nfig,"$",0.0,0.0,0.0,0.0,0); } } } // Check if symbol with attributes if (extsymb && (curpinn || (cursymname[0]!="gnd" && cursymname[0]!="masse_allg" && cursymname[0]!="schirm"))) { // Store the attribute texts cury=curly; if (curnamedisp) { textadjust("$",curnamejustify,1,curnamex, curnamey,curnameang,NAMESIZ,x,y,ang,mode); if (scm_storetext( "$",x,y,ang,NAMESIZ,0,mode)) { sprintf(msgl[msgn],ERRPLCTEXT, ddbclassname(bae_planddbclass()), bae_planename(),"$"); msgn++; } } else { cury-=NAMESIZ; if (scm_storetext( "$",0.0,cury,0.0,NAMESIZ,0,0)) { sprintf(msgl[msgn],ERRPLCTEXT, ddbclassname(bae_planddbclass()), bae_planename(),"$"); msgn++; } } cury-=COMMSIZ; if (curvaldisp) { textadjust(VALATTR,curvaljustify,1,curvalx, curvaly,curvalang,VALSIZ,x,y,ang,mode); if (scm_storetext( VALATTR,x,y,ang,VALSIZ,0,mode)) { sprintf(msgl[msgn],ERRPLCTEXT, ddbclassname(bae_planddbclass()), bae_planename(),VALATTR); msgn++; } } else { if (scm_storetext( VALATTR,0.0,cury,0.0,VALSIZ,0,1)) { sprintf(msgl[msgn],ERRPLCTEXT, ddbclassname(bae_planddbclass()), bae_planename(),VALATTR); msgn++; } cury-=COMMSIZ; } // Check if multiple gates part if (curpinl[0].pxn>1) { if (scm_storetext("$rpname", 0.0,cury,0.0,COMMSIZ,0,1)) { sprintf(msgl[msgn],ERRPLCTEXT, ddbclassname(bae_planddbclass()), bae_planename(),"$rpname"); msgn++; } cury-=COMMSIZ; } for (i=0;i0 && !curpagesym) { fprintf(deffh,"\txlat ( "); // Write the logical pins firstpin=1; for (i=0;i1) fprintf(mapfh,"%s;%s;%d;%s\n", cursymname[sidx],cursymname[sidx], curpinl[0].pxn,ddbfsname); } else if (mainp && !curpagesym) { fprintf(mapfh,"%s;%s;1;%s\n",cursymname[sidx], cursymname[sidx],ddbfsname); } // Write the pin type attributes if (!curpagesym) for (i=0;i=tcelln) continue; // Place the port labels for (k=0;k>2; ix=curinstl[i].x*s+angcos*xoff-angsin*yoff; iy=curinstl[i].y*s+angsin*xoff+angcos*yoff; if (syml[symidx].typ==2) { oldmacname=baepar_strval(SCMPAR_BUSTAPMACRO); bae_storetextiact(1,curinstl[i].macro); bae_callmenu(810); scm_setintpar(39,1); if (scm_storelabel(curinstl[i].name,2, ix,iy,ang,mirr)) { sprintf(msgl[msgn],ERRPLCTAP,bae_planename(), curinstl[i].name, cvtlength(ix,0,2),cvtlength(iy,0,2)); msgn++; } scm_setintpar(39,0); scm_setintpar(4,0); bae_clriactqueue(); bae_storetextiact(1,oldmacname); bae_callmenu(810); continue; } if (syml[symidx].typ==3 || (syml[symidx].typ==4 && strmatch(curinstl[i].macro,"port*")==0)) { oldmacname=baepar_strval(SCMPAR_LABELMACRO); bae_storetextiact(1,curinstl[i].macro); bae_callmenu(809); if (scm_storelabel(curinstl[i].name,0, ix,iy,ang,mirr)) { sprintf(msgl[msgn],ERRPLCLAB, ddbclassname(bae_planddbclass()), bae_planename(), curinstl[i].name,curinstl[i].macro); msgn++; } else if (curinstl[i].cx!=(-1.0) && cap_lastfigelem(nfig)==0) { bae_postprocess(); scm_attachtextpos(nfig,"#",curinstl[i].cx*s, curinstl[i].cy*s,ang,1.0,mirr); bae_postprocess(); } scm_setintpar(4,0); bae_clriactqueue(); bae_storetextiact(1,oldmacname); bae_callmenu(809); continue; } else if (syml[symidx].typ==4) { oldmacname=baepar_strval(SCMPAR_PORTMACRO); bae_storetextiact(1,curinstl[i].macro); bae_callmenu(811); if (scm_storelabel(curinstl[i].name,1, ix,iy,ang,mirr)) { sprintf(msgl[msgn],ERRPLCPORT, ddbclassname(bae_planddbclass()), bae_planename(), curinstl[i].name,curinstl[i].macro); msgn++; } else if (curinstl[i].cx!=(-1.0) && cap_lastfigelem(nfig)==0) { bae_postprocess(); scm_attachtextpos(nfig,"#",curinstl[i].cx*s, curinstl[i].cy*s,ang,1.0,mirr); bae_postprocess(); } scm_setintpar(4,0); bae_clriactqueue(); bae_storetextiact(1,oldmacname); bae_callmenu(811); continue; } partname=curinstl[i].name; if (partname[strlen(partname)-1]=='?') { autoname=1; partname[strlen(partname)-1]='\0'; curinstl[i].name=partname; partname=partname+"1"; } else { autoname=0; } if (syml[symidx].mainp) scm_storepart(partname+POWEXT, curinstl[i].macro+POWEXT,ix,iy,ang,mirr); pagesym=syml[symidx].pagesym; symidx=0; if (SYMRENAME && symfh!=(-1)) fprintf(symfh,"%s;",partname); if (strfh!=(-1)) { if (fgets(cmpname,100,strfh)!=0) { fclose(strfh); strfh=(-1); } else { for (j=0;(c=cmpname[j])!='\0';j++) if (c==';') break; if (c!=';' || strextract(cmpname,0,j-1)!=partname) { fclose(strfh); strfh=(-1); } else { partname=strextract( cmpname,j+1,strlen(cmpname)); if (partname[strlen(partname)-1]==0x0a) partname[strlen(partname)-1]= '\0'; if (partname[strlen(partname)-1]==0x0d) partname[strlen(partname)-1]= '\0'; curinstl[i].name=partname; } } } switch (errcode= scm_storepart(partname,curinstl[i].macro,ix,iy,ang,mirr)) { case 0 : break; case -5 : symidx=2; if (autoname) partname=curinstl[i].name+itoa(symidx); else partname=curinstl[i].name+"_"+itoa(symidx); while ((res=scm_storepart(partname,curinstl[i].macro, ix,iy,ang,mirr))==(-5)) { symidx++; if (autoname) partname= curinstl[i].name+itoa(symidx); else partname= curinstl[i].name+"_"+itoa(symidx); } autoname=1; if (res==0) break; default : sprintf(msgl[msgn],ERRPLCSYM, ddbclassname(bae_planddbclass()),bae_planename(), curinstl[i].name,curinstl[i].macro); msgn++; } if (SYMRENAME) fprintf(symfh,"%s\n",partname); instbal[instbabase+i].planname=bae_planename(); instbal[instbabase+i].plcname=partname; if (curinstl[i].namedisp && cap_nrefsearch(partname,nfig)==0) { textadjust(partname,curinstl[i].namejustify,0, curinstl[i].namex*s,curinstl[i].namey*s, curinstl[i].nameang,NAMESIZ,x,y,ang,0); scm_attachtextpos(nfig,"$",x,y,ang,NAMESIZ,0); } if (curinstl[i].valdisp && cap_nrefsearch(partname,nfig)==0) { textadjust(curinstl[i].value,curinstl[i].valjustify,0, curinstl[i].valx*s,curinstl[i].valy*s, curinstl[i].valang,VALSIZ,x,y,ang,0); scm_attachtextpos(nfig,VALATTR,x,y,ang,VALSIZ,0); } // Set part value attribute if (!pagesym) if (scm_setpartattrib(partname,VALATTR, curinstl[i].value,1) && curinstl[i].value!="") { sprintf(msgl[msgn],ERRSETATTR, ddbclassname(bae_planddbclass()),bae_planename(), partname,VALATTR,curinstl[i].value); msgn++; } for (j=0;j1 && isalpha(cmpname[len-1]) && isdigit(cmpname[len-2])) cmpname[len-1]='\0'; scm_setpartattrib( partname,"$rpname",cmpname,2); } } // Place the aliases for (i=0;i=0) { curinstl[curportiref].cx=curconlx; curinstl[curportiref].cy=curconly; } // Return without errors return(0); } int p_decstk(int stkfield) // Receive a stack pointer decrement // Returns : zero if done or (-1) on error { if (stkfield&1) pointstkn--; if (stkfield&2) { namestkn--; curstrval=strvalstk[namestkn]; } if (stkfield&4) boxstkn--; // Return without errors return(0); } int p_designator() // Receive a designator // Returns : zero if done or (-1) on error { curdes=1; incnamespace(NTYP_NAME); // Return without errors return(0); } int p_designatorend() // Receive a designator end // Returns : zero if done or (-1) on error { int len /* String length */; int i,j /* Loop variables */; curdes=0; if (curview!=1 || (curport==0 && curinstance==0 && curcell==0 && instbaproc==0)) { decnamespace(); return(0); } // Store the physical pin names if (curport) { strlower(curstrval); len=strlen(curstrval); if (len==0) curpinl[curpinn].pxl[curpinl[curpinn].pxn++]= curpinl[curpinn].name; for (i=0;i0) { while (curint>0) { curflt*=10.0; curint--; } } else { while (curint<0) { curflt*=0.1; curint++; } } } else { curexp=curflt; } // Return without errors return(0); } int p_false() // Receive a false value // Returns : zero if done or (-1) on error { curbool=0; // Return without errors return(0); } int p_fltcoord() // Receive a coordinate value // Returns : zero if done or (-1) on error { // Convert the value to internal units curflt*=lenconv; // Return without errors return(0); } int p_ident() // Receive an identifier // Returns : zero if done or (-1) on error { // Store the current string curid=synscanstring(); // Return without errors return(0); } int p_incstk(int stkfield) // Receive a stack pointer increment // Returns : zero if done or (-1) on error { if (stkfield&1) { pointstk[pointstkn+1]=pointstk[pointstkn]; pointstkn++; } if (stkfield&2) { strvalstk[namestkn]=curstrval; namestkn++; } if (stkfield&4) { boxstkn++; boxstk[boxstkn].lx=boxstk[boxstkn].ly=0.0; boxstk[boxstkn].ux=boxstk[boxstkn].uy=0.0; } // Return without errors return(0); } int p_instancestart() // Receive an instance start // Returns : zero if done or (-1) on error { incnamespace(NTYP_NAME); return(p_incstk(2)); } int p_instance() // Receive an instance // Returns : zero if done or (-1) on error { curtransx=curtransy=0.0; curtransori=0; curxscale=1.0; curori=0; curjustify=0; curinstance=1; curnameass=0; curvaldisp=0; curcellref=""; curinstl[curinstn].namex=curinstl[curinstn].namey=0.0; curinstl[curinstn].cx=curinstl[curinstn].cy=(-1.0); curinstl[curinstn].namejustify=8; curinstl[curinstn].namedisp=0; if (curportimp) { curinstl[curinstn].name=curportname; curportiref=curinstn; if (curpinnamedisp) { curinstl[curinstn].namex=curpinnamex; curinstl[curinstn].namey=curpinnamey; curinstl[curinstn].nameang=curpinnameori*0.5*PI; curinstl[curinstn].namejustify=curpinnamejustify; curinstl[curinstn].namedisp=1; } } else { curinstl[curinstn].name= gcrename(namestk[namestkn],renamestk[namestkn],NTYP_NAME); } curinstl[curinstn].value=""; curinstl[curinstn].attrn=0; curinstl[curinstn].valdisp=0; instbal[instban].instname=curinstl[curinstn].name; instbal[instban].planname=""; instbal[instban].plcname=""; instbal[instban].backname=""; instbal[instban].plname=""; // Return without errors return(0); } int p_instanceend() // Receive an instance end // Returns : zero if done or (-1) on error { string macro /* Macro name */; int symidx /* Symbol index */; // Reset instance process status curinstance=0; // Check if first view if (curview!=1) { decnamespace(); return(p_decstk(2)); } macro=gcrename(curcellref,curcellref,NTYP_MAC); // Get symbol macro info if ((symidx=findsymbol(macro))<0) { decnamespace(); return(p_decstk(2)); } switch (syml[symidx].typ) { // Tie case 1 : decnamespace(); // Ignore tie symbol return(p_decstk(2)); // Ripper case 2 : break; // Global symbol case 3 : break; // Port symbol case 4 : break; // Title block symbol case 5 : // Check if title block symbol if (curtitledisp==0) { decnamespace(); // Ignore title block symbol return(p_decstk(2)); } break; // Generic case 0 : // Unknown default : } // Store the instance curinstl[curinstn].x=curtransx; curinstl[curinstn].y=curtransy; curinstl[curinstn].cx=(-1.0); curinstl[curinstn].cy=(-1.0); curinstl[curinstn].ori=curtransori; curinstl[curinstn].macro=macro; curinstl[curinstn].typ=(curpage && ddbcheck(ddbfname,DDBCLSSYM,curinstl[curinstn].macro)==(-1) && ddbcheck(ddbfname,DDBCLSCM,curinstl[curinstn].macro)==0) ? 1 : 0 ; curinstn++; instban++; // Transfer cell scale to sheet scale if (cursheetscale==1.0) cursheetscale=1.0/curxscale; curxscale=1.0; decnamespace(); // Return without errors return(p_decstk(2)); } int p_instancerefend() // Receive a instance reference end // Returns : zero if done or (-1) on error { string instname /* Instance name */; int symidx /* Symbol name index */; int i /* Loop control variable */; if (curnet && !curportlist) { instname= gcrename(namestk[namestkn],renamestk[namestkn],NTYP_NAME); for (i=0;i=0 && syml[symidx].typ==2) { if (curmembnum>=0) // Use member index as ripper name curinstl[i].name=itoa(curmembnum); else // Use net name as ripper instance name curinstl[i].name=netnamel[netnamen-1]; curripsym=1; } curmembnum=(-1); } else if (instbaproc) { curinstbaname= gcrename(namestk[namestkn],renamestk[namestkn],NTYP_NAME); } return(p_decstk(2)); } int p_justify(int typ) // Receive a justify specification // Returns : zero if done or (-1) on error { // Store the justify specification curjustify=typ; // Return without errors return(0); } int p_keydispend() // Receive a keyword display end // Returns : zero if done or (-1) on error { if (curview!=1) return(p_decstk(2)); if (curnamedisp) { if (curport || curportimp) { if (curdispgrp=="pinnumber") { curpinnumx=curorgx; curpinnumy=curorgy; curpinnumori=curori; curpinnumjustify=curjustify; curpinnumdisp=1; } else if (curdispgrp=="pinname") { curpinnamex=curorgx; curpinnamey=curorgy; curpinnameori=curori; curpinnamejustify=curjustify; curpinnamedisp=1; } } else if (curcell) { curnamex=curorgx; curnamey=curorgy; curnameang=curori*0.5*PI; curnamejustify=curjustify; } } return(p_decstk(2)); } int p_nameend() // Receive a name end // Returns : zero if done or (-1) on error { if (curview!=1) return(0); if (curport || curportimp) { if (curdispgrp=="pinnumber") { curpinnumx=curorgx; curpinnumy=curorgy; curpinnumori=curori; curpinnumjustify=curjustify; curpinnumdisp=1; } else if (curdispgrp=="pinname" || curdispgrp=="port") { curpinnamex=curorgx; curpinnamey=curorgy; curpinnameori=curori; curpinnamejustify=curjustify; curpinnamedisp=1; } } return(0); } int p_keydispname() // Receive a keyword display name // Returns : zero if done or (-1) on error { string name /* Property name */; if (curview!=1) return(0); // Get the keyword name name=gcrename(namestk[namestkn],renamestk[namestkn],NTYP_KEY); if (name=="designator") curnamedisp=1; curjustify=8; curorgx=curorgy=0.0; // Return without errors return(0); } int p_member() // Receive a member command // Returns : zero if done or (-1) on error { curmember=1; // Return without errors return(0); } int p_membnum() // Receive a member number // Returns : zero if done or (-1) on error { curmembnum=curint; // Return without errors return(0); } int p_name() // Receive a name // Returns : zero if done or (-1) on error { namestk[namestkn]=renamestk[namestkn]=curid; curdispgrp=""; curori=0; curjustify=8; if (curportimp && curview==1 && curportname=="") portpinname(); // Return without errors return(0); } void portpinname() // Receive a port pin name { int i /* Loop control variable */; // Get the port pin name curportname=gcrename(namestk[namestkn],renamestk[namestkn],NTYP_NAME); curportoname=namestk[namestkn]; for (i=0;i4 && pagename[pagenlen-4]=='.' && pagename[pagenlen-3]=='s' && pagename[pagenlen-2]=='c' && pagename[pagenlen-1]=='h') pagename[pagenlen-4]='\0'; if (curpageblock=="") curpageblock=cursymname[0]; renamestk[namestkn]=namestk[namestkn]=curpageblock+"_"+pagename; pageblockbak=curpageblock; // Store the page cell if (p_cellname()) return(-1); curview=viewbak; curcellcode=cellcodebak; curpageblock=pageblockbak; cursymboldone=symdonebak; renamestk[namestkn]=namestk[namestkn]=pagename; curpage=1; // Return without errors return(0); } int p_pageend() // Receive a page end command // Returns : zero if done or (-1) on error { double olx,oly /* Old lower boundary */; double oux,ouy /* Old upper boundary */; if (curpage) { // Get the page size olx=curlx; oly=curly; oux=curux; ouy=curuy; curlx=boxstk[boxstkn].lx; curly=boxstk[boxstkn].ly; curux=boxstk[boxstkn].ux; curuy=boxstk[boxstkn].uy; // Store the last page if (p_cellend()) { decnamespace(); return(-1); } p_incstk(6); curlx=olx; curly=oly; curux=oux; curuy=ouy; curpage=0; curpagedone=1; } decnamespace(); // Return without errors return(p_decstk(6)); } int p_portstart() // Receive a port start // Returns : zero if done or (-1) on error { incnamespace(NTYP_NAME); return(p_incstk(2)); } int p_pinname() // Receive a pin name // Returns : zero if done or (-1) on error { string name /* Pin name */; int pcnt /* Double pin count */; int i /* Loop control variable */; if (curview!=1) return(0); curport=1; // Store the pin data curpinl[curpinn].x=curpinl[curpinn].y=0.0; curpinl[curpinn].ang=0.0; curpinl[curpinn].namex=curpinl[curpinn].namey=0.0; curpinl[curpinn].namejustify=8; curpinl[curpinn].namedisp=0; curpinl[curpinn].numx=curpinl[curpinn].numy=0.0; curpinl[curpinn].numjustify=8; curpinl[curpinn].numdisp=0; curpinnumx=curpinnumy=0.0; curpinnumori=0; curpinnumjustify=8; curpinnumdisp=0; curpinnamex=curpinnamey=0.0; curpinnameori=0; curpinnamejustify=8; curpinnamedisp=0; name=gcrename(namestk[namestkn],renamestk[namestkn],NTYP_NAME); for (i=pcnt=0;icurpointl[pidx+1].x) { if (curpointl[pidx].y>curpointl[pidx+1].y) curinstl[curinstn].macro="xrip0b1y1"; else curinstl[curinstn].macro="xrip0b1m1"; } else { if (curpointl[pidx].y>curpointl[pidx+1].y) curinstl[curinstn].macro="xrip0bm1y1"; else curinstl[curinstn].macro="xrip0bm1m1"; } curinstn++; } else { for (;pidx=curpinn) { if (curvisible) { for (i=pcnt=0;i0 && curpolyl[curpolyn].pl[pn-1].x==x && curpolyl[curpolyn].pl[pn-1].y==y && curpolyl[curpolyn].pl[pn-1].t==t) // Ignore double point return; // Store the point data curpolyl[curpolyn].pl[pn].x=x; curpolyl[curpolyn].pl[pn].y=y; curpolyl[curpolyn].pl[pn].t=t; // Adjust the point count curpolyl[curpolyn].pn=pn+1; } void termpoly(int typ) // Terminate a polygon defintion { // Check if degenerated polygon if (curpolyl[curpolyn].pn<=1) { // Clear this polygon curpolyl[curpolyn].pn=0; curpolyl[curpolyn].ptyp=0; return; } curpolyl[curpolyn].ptyp=typ; curpolyl[curpolyn].netidx=netnamen-1; // Increment polygon count curpolyn++; // Init. next polygon curpolyl[curpolyn].pn=0; curpolyl[curpolyn].ptyp=0; curpolyl[curpolyn].netidx=(-1); } void extractptxy(string valstr,double x,double y) // Terminate a polygon defintion { int len /* String length */; int cidx /* Coordinate sep. index */; len=strlen(valstr); if (strextract(valstr,0,3)!="(pt " || valstr[len-1]!=')') { x=0.0; y=0.0; return; } // Get first coordinate end position cidx=strscannext(valstr," ",5,1)-1; x=atof(strextract(valstr,4,cidx))*lenconv; y=atof(strextract(valstr,cidx+1,len-2))*lenconv; } string gcrename(string oname,string rname,int ntyp) /* // Get or create a rename entry // Return value : // original name // Parameters : // string oname : Orginal name // string rname : Rename name // string ntyp : Namespace type */ { int slb = 0 /* Search lower boundary */; int sub = renamen-1 /* Search upper boundary */; int sidx /* Search index */; int compres /* Compare result */; string cmpname /* Compare name */; // Get the compare names cmpname=oname; strlower(cmpname); strlower(rname); // Loop until search area empty while (slb<=sub) { // Get the search index sidx=(slb+sub)>>1; // Get the comparison result if (ntyp==renamel[sidx].typ) { if ((compres=strcmp(cmpname,renamel[sidx].oname))==0) { if (currename) renamel[sidx].rname=rname; return(convspaces(RENAMEMODE ? renamel[sidx].rname : renamel[sidx].oname)); } } else { compres= ntypslb;sidx--) renamel[sidx]=renamel[sidx-1]; // Insert rename renamel[slb].rname=rname; renamel[slb].oname=cmpname; renamel[slb].typ=ntyp; renamen++; // Return name return(convspaces(RENAMEMODE ? rname : cmpname)); } int findsymbol(string name) /* // Find a symbol macro entry // Return value : // symbol list index or (-1) on not found // Parameters : // string name : Symbol name */ { int slb = 0 /* Search lower boundary */; int sub = symn-1 /* Search upper boundary */; int sidx /* Search index */; int compres /* Compare result */; // Loop until search area empty while (slb<=sub) { // Get the search index sidx=(slb+sub)>>1; // Get the comparison result if ((compres=strcmp(name,syml[sidx].name))==0) return(sidx); if (compres<0) sub=sidx-1; else slb=sidx+1; } inssymidx=slb; // Symbol not found return(-1); } string valstrconv(string vstr) /* // Convert a value string // Return value : // converted value string */ { string result /* Result string */; int sidx /* Search index */; int len /* String length */; // Loop for all characters result=""; len=strlen(vstr); for (sidx=0;sidxlen-4 || vstr[sidx]!='%' || vstr[sidx+1]!='3' || vstr[sidx+2]!='7' || vstr[sidx+3]!='%') { sprintf(result,"%s%c",result,vstr[sidx]); } else { result+="%"; sidx+=3; } // Return value return(result); } string textstrconv(string tstr) /* // Convert a text string // Return value : // converted text string */ { string result /* Result string */; int sidx /* Search index */; int len /* String length */; int code /* ASCII code buffer */; char c /* Character buffer */; // Loop for all characters result=""; len=strlen(tstr); for (sidx=0;sidx0) curnametypen--; } string convspaces(string cstr) /* // Convert all spaces in string to underscores // Return value : // converted string */ { string result /* Result string */; int sidx /* Source string index */; int didx /* Destination string index */; int pairs /* Character pair count */; int len /* Name length */; int backslash = 0 /* Backslash found flag */; char c /* Character buffer */; int i /* Loop control variable */; // Loop for all characters for (sidx=didx=0;(c=cstr[sidx])!='\0';sidx++) switch (c) { case ' ' : case '?' : case '*': case '\'': result[didx]='_'; didx++; break; case '': result[didx]=''; didx++; break; case '': result[didx]=''; didx++; break; case '': result[didx]=''; didx++; break; // Convert backslash escape character case '\\' : if (didx>0) { if (cstr[sidx+1]=='\\') { result[didx+1]=result[didx-1]; result[didx-1]='\\'; result[didx]='/'; didx+=2; sidx++; backslash++; break; } } default : result[didx]=c; didx++; } result[didx]='\0'; if (backslash*3==strlen(result)) { for (i=0;iMAXKEYLEN) { for (sidx=0;(c=result[sidx])!='\0';sidx++) if (c==':') break; if (c!='\0') { didx=sidx+1; for (sidx=0;(c=result[sidx])!='\0';sidx++) if (c=='/' || c=='\\') didx=sidx; result=strextract(result,didx+1,strlen(result)); } } if (strcmp(DELPREFIX,strextract(result,0,strlen(DELPREFIX)-1))==0) result=strextract(result,strlen(DELPREFIX),strlen(result)); if (strlen(result)>MAXKEYLEN) result[MAXKEYLEN]='\0'; // Return value return(backslash ? "/"+result : result); } static void symrename(string oldname,string newname) /* // Rename a symbol keeping the attributes // Returns : 1 if rename successful else zero // Parameters : // string oldname : Old symbol name // string newname : New symbol name */ { index C_FIGURE fig /* Figure list index */; index C_FIGURE nfig /* New figure list index */; index C_FIGURE tfig /* Tag figure list index */; index C_FIGURE ofig /* Old symbol figure list index */; index C_NREF nref /* Named reference index */; index C_ATTRIBUTE attr /* Attribute index */; index C_REFTEXT rmod /* Ref. text modifier index */; index C_MACRO macro /* Macro index */; string macname /* New macro name */; double ang /* Symbol angle */; double x, y /* Symbol coords. */; double tang /* Text angle */; double btx, bty /* Back transf. text coords. */; double asin, acos /* Angle sin, cos values */; int mirr /* Symbol mirror mode */; int tmirr /* Text mirror mode */; string attrname /* Attribute name */; string attrval /* Attribute value */; int attidx = 0 /* Attribute index */; int lastidx = 0 /* Last attribute index */; STRINGS rl /* Rule list */; int i /* Loop control variable */; if (cap_nrefsearch(oldname,fig)!=0) { sprintf(msgl[msgn],ERRRENSYM, ddbclassname(bae_planddbclass()),bae_planename(), oldname,newname); msgn++; // Symbol rename failed return; } macname=fig.NREF.MACRO.NAME; // Store new part if (scm_storepart(newname,macname,fig.X,fig.Y,fig.ANGLE,fig.MIRROR)) { sprintf(msgl[msgn],ERRPLCSYM, ddbclassname(bae_planddbclass()),bae_planename(), newname,macname); msgn++; // Symbol rename failed return; } // Copy the attributes nref=fig.NREF; forall (attr of nref) { attrname=attr.NAME; if (scm_chkattrname(attrname)!=0) continue; if (attrname=="$rpname" || attrname=="$rbname" || attrname=="$vgrp") { inirpname=""; if (cap_scanfelem(fig,0.0,0.0,0.0,1, rpmacfunc,NULL,NULL,rptextfunc)!=0) error_scan(); } lastidx++; } forall (attr of nref) { attrname=attr.NAME; if (scm_chkattrname(attrname)!=0) continue; attrval= ((attrname=="$rpname" || attrname=="$rbname" || attrname=="$vgrp") && inirpname=="$") ? newname : attr.VALUE; attidx++; if (scm_setpartattrib(newname,attrname,attrval, 4|(attidx==1 ? 1 : 0)|(attidx==lastidx ? 2 : 0))) { sprintf(msgl[msgn],ERRSETATTR, ddbclassname(bae_planddbclass()),bae_planename(), newname,attrname,attrval); msgn++; } } // Transfer rules if (fig.RULEOBJID>=0 && cap_nrefsearch("",nfig)==0) // Get rules if (rsc_getfigrules(fig,rl)>0) // Attach rules if (cap_rulefigatt(nfig,rl)) rsc_error(-1); // Get symbol data x=fig.X; y=fig.Y; ang=fig.ANGLE; mirr=fig.MIRROR; macro=nref.MACRO; // Transfer name moves forall (rmod of nref) if (cap_nrefsearch("",nfig)==0) { // Transform rel. to abs. position asin=sin(mirr ? -ang : ang); acos=cos(mirr ? -ang : ang); btx=acos*(rmod.X-macro.MNX)-asin*(rmod.Y-macro.MNY); bty=asin*(rmod.X-macro.MNX)+acos*(rmod.Y-macro.MNY); bty= mirr ? (-bty) : bty ; tmirr=(rmod.MIRROR!=0)!=(mirr!=0) ? 1 : 0 ; tang=rmod.ANGLE; tang+=tmirr ? -ang : ang ; // Store the text position scm_attachtextpos(nfig,rmod.STR, x+btx,y+bty,tang,rmod.SIZE,tmirr); } // Delete old part if (scm_delelem(fig)) { sprintf(msgl[msgn],ERRRENSYM, ddbclassname(bae_planddbclass()),bae_planename(), oldname,newname); msgn++; } // Cleanup part list entry ddbdelelem(bae_planfname(),-DDBCLSPLST,oldname); } static int rpmacfunc(index C_MACRO macro,index C_POOL pool,int macinws, string refname,index C_LEVEL level,index C_LEVEL buslevel) /* // $rpname attribute scan macro function // Return value : // 0 if out of workspace, 1 if inside, 2 if unknown, or (-1) on error // Parameters : // index C_MACRO macro : Macro index // index C_POOL pool : Macro pool index // int macinws : Macro in workspace flag // string refname : Macro reference name // index C_LEVEL level : Macro level // index C_LEVEL buslevel : Macro bus level */ { // Check if symbol macro if (macro.CLASS==DDBCLSSYM) // Continue symbol macro scan return(1); // Abort scan for pins return(0); } static int rptextfunc(index C_TEXT textp,double tx,double ty,double tangle, int mirrflag,double tsize,string tstr,int textinws,int macclass,int varattr) /* // $rpname attribute scan text function // Return value : // zero if done or (-1) on error // Parameters : // index C_TEXT textp : Text index // double tx : Text X coordinate // double ty : Text Y coordinate // double tangle : Text angle // int mirrflag : Text mirror flag // double tsize : Text size // string tstr : Text string // int textinws : Text in workspace flag // int macclass : Text macro class // int varattr : Text variant attribute flag */ { if (textp.STR=="$rpname" || textp.STR=="$rbname" || textp.STR=="$vgrp") // Query the current active default value if (cap_rulequery(RS_OCPOOL,textp,RS_SCMSUBJ,RS_INIVAL, "?s",inirpname)<1) inirpname=""; // Return without errors return(0); } string creatextid() /* // Generate new text ID // Return value : // Text ID */ { string textid /* Text id */; int year,month,day /* Date */; int hour,min,sec /* Time */; // Get date and time get_date(day,month,year); get_time(hour,min,sec); // Build the text ID sprintf(textid,"%04d%02d%02d%02d%02d%02d", year+1900,month+1,day,hour,min,sec); // Return the text ID return(textid); } // User Language program end