;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; File: fixhash.il ; Author: Shiv Sikand ; Created: Aug 18 17:55 00 ; Modified: Aug 18 18:00 00 2314 sikand ; Language: Skill ; Package: nil ; MainFun: N/A ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Copyright (c) 2000, S.S. Sikand, All rights reserved ; ; Redistribution and use in source and binary forms, with or ; without modification, are permitted provided that the following ; conditions are met: ; ; Redistributions of source code must retain the above copyright notice, ; this list of conditions and the following disclaimer. ; ; Redistributions in binary form must reproduce the above copyright ; notice, this list of conditions and the following disclaimer in the ; documentation and/or other materials provided with the distribution. ; ; The names of the contributors may not be used to endorse or promote ; products derived from this software without specific prior written ; permission. ; ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ; ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR ; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;; code to re-name files with # in them ;; ie Cadence namespace mapping and Perforce ;; don't go well together ;; Synchronicity converters: please note, all others ignore this ;; section ;; you must get rid of the Sync artefact files first ;; find . -name .\*sync\* -print -exec rm {} \; ;; expects the filename passed to fixhash ;; to have entries like this ; SSTL_DLL_lay/inv_dll_slow#2binv#2bnmos ; rx_schem/Interp_Logic#2ecell ; Digital/test#2dschem ;; generate them using find ;;find . -name \*#\* -print | sed 's/\.\///g' > ~/hashlog ;; then run ;; fixhash("~/hashlog") ;; renames the bad cells ;; uses _ as the default replacement character ;; AND fixes the cell references in all cells in the library ;; attempts to perform collision detection ;; BACKUP your LIBS first ;; before running this code ;; since it may trash your instance headers ;; if it hits some condition I have not computed CDSP4_NMHex = makeTable("alias" nil) CDSP4_NMHex["1"]=1 CDSP4_NMHex["2"]=2 CDSP4_NMHex["3"]=3 CDSP4_NMHex["4"]=4 CDSP4_NMHex["5"]=5 CDSP4_NMHex["6"]=6 CDSP4_NMHex["7"]=7 CDSP4_NMHex["8"]=8 CDSP4_NMHex["9"]=9 CDSP4_NMHex["a"]=10 CDSP4_NMHex["b"]=11 CDSP4_NMHex["c"]=12 CDSP4_NMHex["d"]=13 CDSP4_NMHex["e"]=14 CDSP4_NMHex["f"]=15 CDSP4_NM= makeTable("nmap" nil) CDSP4_NM["#2f"] = "/" CDSP4_NM["#3c"] = "<" CDSP4_NM["#3e"] = ">" CDSP4_NM["#2e"] = "." CDSP4_NM["#21"] = "!" CDSP4_NM["#7c"] = "|" CDSP4_NM["#5c"] = "\\" CDSP4_NM["#2d"] = "-" CDSP4_NM["#28"]="(" CDSP4_NM["#29"]=")" CDSP4_NM["#5b"]="[" CDSP4_NM["#5d"]="]" CDSP4_NM["#24"]="$" CDSP4_NM["#40"]="@" CDSP4_NM["#7b"]="{" CDSP4_NM["#7d"]="}" CDSP4_NM["#5f"]="_" CDSP4_NM["#7e"]="~" CDSP4_NM["#3a"]=":" CDSP4_NM["#3d"]="=" CDSP4_NM["#3b"]=";" CDSP4_NM["#22"] = "\"" CDSP4_NM["#23"]="#" CDSP4_NM["#25"]="%" CDSP4_NM["#26"]="&" CDSP4_NM["#27"]="'" CDSP4_NM["#2a"]="*" CDSP4_NM["#2b"]="+" CDSP4_NM["#2c"]="," CDSP4_NM["#60"]="`" CDSP4_NM["#5e"]="^" CDSP4_NM["#3f"] = "?" procedure(unmapcdsTable(string) ;_Apr 10 00 sikand 0 let((ind pat org rep) org=string while(ind=nindex(string "#") pat=substring(string ind 3) unless(CDSP4_NM[pat] error("Could not map %s in string: %s\n" pat org)) rexCompile(pat) rep = strcat("\\" CDSP4_NM[pat]) string = rexReplace(string rep 0) when( string == org error("Failed!") ) ) ; ** while ind ** string ) ; ** let ** ) ; ** procedure unmapcdsTable ** procedure(fixhash(filename) ;_Aug 18 00 sikand 3377 let((hf data lib cell cellm fxtable cellu hashcells libid xim xbads cellr repcells x xcollisions fxtable2 celltable fpath celltable2 xrepcell repfpath cmd dontmap fxtable3 uhashcells xcheckneedreplace fxglobal fxglobaltable fixlist) fxtable=makeTable("fx" list()) fxtable2=makeTable("fx2" list()) fxtable3=makeTable("fx3" list()) celltable = makeTable("ct" nil) celltable2 = makeTable("ct2" nil) fxglobaltable=makeTable("fxg" nil) hf=infile(filename) unless(hf error("Couldn't open!") ) println("Fixhash running....") while(gets(lin hf) data=parseString(lin "\n") data=parseString(car(data) "/") lib=car(data) ;; unmapped name cellu = cadr(data) ;; mapped name cellm=unmapcdsTable(cellu) ;; replacement name ;; possibility of a collision with a real name ;; detect it later rexCompile("#[0-9a-f][0-9a-f]") cellr = rexReplace(cellu "_" 0) celltable[cellm] = cellr celltable2[cellm] = cellu ;;printf("lib: %s cell: %s\n" lib cell) fxtable[lib]=cons(cellm fxtable[lib]) fxtable2[lib]=cons(cellr fxtable2[lib]) fxtable3[lib]=cons(cellu fxtable3[lib]) fxglobal=cons(cellm fxglobal) fxglobaltable[cellm]=cellr ) ; ** while gets ** foreach(libkey fxtable ;; get the cells in each library ;; open them up ;; fix any instances printf("Checking %s\n" libkey) hashcells=fxtable[libkey] repcells = fxtable2[libkey] uhashcells = fxtable3[libkey] ;;println(repcells) libid=ddGetObj(libkey) foreach( libcell libid~>cells ;; the cells themselves need to be name mapped ;; as well as the instance headers ;; cell foo.bar contains an instance of bar.foo xrepcell = celltable[libcell~>name] when( xrepcell ;; detected a bad un ;; make sure that the replacement doesn't already ;; exist in the library when( member(xrepcell libid~>cells~>name) error("Collision detect, replacement name hits an existing cell name %s!\n" xrepcell) ) ;; clone it in Unix, delete the original fpath = libcell~>writePath println(fpath) ;; need the unmodified name ;; because that's the real filename ;; and regexp replace it with the replacement name rexCompile(celltable2[libcell~>name]) repfpath = rexReplace(fpath xrepcell 1) println(repfpath) sprintf(cmd "mv %s %s" fpath repfpath) printf("executing %s\n" cmd) sh(cmd) ) ; ** when xrepcell ** ) ; ** foreach libcell ** ;; run the loop again ;; since we've modified the data libid=ddGetObj(libkey) foreach( libcell libid~>cells foreach(viewcell libcell~>views x=dbOpenCellView(libkey libcell~>name viewcell~>name nil "a" nil) unless( x println(libkey) println(libcell~>name) println(viewcell~>name) error("Failed to open cellview, check your input data!!") ) xim=x~>instHeaders when(xim xcheckneedreplace = setof(xx xim member(xx~>cellName uhashcells)) xcollisions = setof(xx xcheckneedreplace member(xx~>cellName repcells)) when( xcollisions println(xcollisions~>cellName) printf("%s %s %s\n" libkey libcell~>name viewcell~>name) warn("Collision detect, replacement name hits an existing instance name!\n") ) xbads=setof(xx xim member(xx~>cellName hashcells)) when(xbads printf("\nLib %s Cell %s View %s\n" libkey libcell~>name viewcell~>name) println(xbads~>cellName) ;; now do the replacement foreach( insth xbads printf("rep %s %s %s\n" libkey celltable[insth~>cellName] insth~>viewName) dbSetInstHeaderMasterName(insth libkey celltable[insth~>cellName] insth~>viewName) dbSave(x) ) dbClose(x) ) ; ** when xbads ** ) ; ** when xim ** ) ; ** foreach viewcell ** ) ; ** foreach libcell ** ) ; ** foreach libkey ** ;; now check all the instance headers in every library foreach(libid ddGetLibList() unless(libid~>name=="sample" printf("P2: Checking %s\n" libid~>name) foreach( libcell libid~>cells foreach(viewcell libcell~>views x=dbOpenCellView(libid libcell~>name viewcell~>name nil "r" nil) if( !x then println(libid~>name) println(libcell~>name) println(viewcell~>name) warn("Failed to open cellview, check your input data!!") else xim=x~>instHeaders when(xim xbads=setof(xx xim member(xx~>cellName fxglobal)) when(xbads ;;printf("\nLib %s Cell %s View %s\n" libid~>name libcell~>name viewcell~>name) fixlist=append(list(list(libid libcell~>name viewcell~>name xbads~>cellName)) fixlist) ;;println(xbads~>cellName) ;; now do the replacement ;;foreach( insth xbads ;; printf("rep %s %s %s\n" libkey celltable[insth~>cellName] insth~>viewName) ;; dbSetInstHeaderMasterName(insth libkey celltable[insth~>cellName] insth~>viewName) ;; dbSave(x) ;;) dbClose(x) ) ; ** when xbads ** ) ; ** when xim ** ) ; ** foreach viewcell ** ) ) ) ) foreach(el fixlist lib=car(el) cell=cadr(el) view=caddr(el) bad=car(cadddr(el)) x=dbOpenCellView(lib cell view nil "a" nil) if( !x then println(lib~>name) println(cell) println(view) warn("Failed to open cellview, check your input data!!") else xim=x~>instHeaders when(xim xbads=setof(xx xim member(xx~>cellName fxglobal)) when(xbads foreach( insth xbads printf("rep {%s %s %s} " insth~>libName fxglobaltable[insth~>cellName] insth~>viewName) printf("in [%s %s %s]\n" lib~>name cell view) dbSetInstHeaderMasterName(insth insth~>libName celltable[insth~>cellName] insth~>viewName) dbSave(x) ) ) ) ) dbClose(x) ) t );; let ) ; ** procedure fixhash **