Updated version to go along with pull request #385 from Qurrat.
Modified the GDS and liberty library builders to accept gzipped
files. Made additional corrections to the device generator file
to correct NPN and PNP device names.
diff --git a/VERSION b/VERSION
index da93f74..4750635 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.0.424
+1.0.425
diff --git a/common/create_gds_library.py b/common/create_gds_library.py
index 9931fd8..6c5235a 100755
--- a/common/create_gds_library.py
+++ b/common/create_gds_library.py
@@ -7,11 +7,16 @@
# of cells, create a single GDL library file named <alllibname> and place
# it in the same directory. This is done for the option "compile" if specified
# for the "-gds" install.
+#
+# Because GDS files are large, this script supports reading gzipped GDS files.
+# The file (de-)compression is handled in Magic; it is only necessary in this
+# script to accept ".gds.gz" as a valid filename extension for GDS files.
#----------------------------------------------------------------------------
import os
import sys
import glob
+import gzip
import fnmatch
import subprocess
import natural_sort
@@ -57,6 +62,8 @@
glist = glob.glob(destlibdir + '/*.gds')
glist.extend(glob.glob(destlibdir + '/*.gdsii'))
glist.extend(glob.glob(destlibdir + '/*.gds2'))
+ glist.extend(glob.glob(destlibdir + '/*.gds.gz'))
+
glist = natural_sort.natural_sort(glist)
if alllibname in glist:
diff --git a/common/create_lib_library.py b/common/create_lib_library.py
index 46bfc47..beba757 100755
--- a/common/create_lib_library.py
+++ b/common/create_lib_library.py
@@ -7,10 +7,14 @@
# of cells, create a single liberty library file named <alllibname> and place
# it in the same directory. This is done for the option "compile" if specified
# for the "-lib" install.
+#
+# Because liberty files tend to be both huge and ASCII, this script supports
+# handling sets of gzipped .lib files (expecting name ".lib.gz").
#----------------------------------------------------------------------------
import sys
import os
+import gzip
import glob
import fnmatch
import natural_sort
@@ -46,6 +50,7 @@
headerfile=None):
headerdone = False
+ compressed = False
# destlib should not have a file extension
destlibroot = os.path.splitext(destlib)[0]
@@ -80,7 +85,11 @@
for rfile in rlist:
llist.append(destlibdir + '/' + rfile)
else:
- llist = glob.glob(destlibdir + '/*.lib')
+ llist = glob.glob(destlibdir + '/*.lib.gz')
+ if len(llist) == 0:
+ llist = glob.glob(destlibdir + '/*.lib')
+ else:
+ compressed = True
llist = natural_sort.natural_sort(llist)
# Create exclude list with glob-style matching using fnmatch
@@ -111,21 +120,26 @@
if not os.path.exists(lfile):
print('Error: File ' + lfile + ' not found (skipping).')
continue
- with open(lfile, 'r') as ifile:
- # print('Adding ' + lfile + ' to library.')
- ltext = ifile.read()
- llines = ltext.splitlines()
- headerseen = False
- for lline in llines:
- if headerdone:
- if not headerseen:
- ltok = lline.split('(')
- if len(ltok) == 0 or not ltok[0].strip() == 'cell':
- continue
- else:
- headerseen = True
- print(lline, file=ofile)
- headerdone = True
+ if compressed:
+ with gzip.open(lfile, 'rb') as ifile:
+ # print('Adding ' + lfile + ' to library.')
+ ltext = ifile.read()
+ else:
+ with open(lfile, 'r') as ifile:
+ # print('Adding ' + lfile + ' to library.')
+ ltext = ifile.read()
+ llines = ltext.splitlines()
+ headerseen = False
+ for lline in llines:
+ if headerdone:
+ if not headerseen:
+ ltok = lline.split('(')
+ if len(ltok) == 0 or not ltok[0].strip() == 'cell':
+ continue
+ else:
+ headerseen = True
+ print(lline, file=ofile)
+ headerdone = True
print('/*--------EOF---------*/\n', file=ofile)
if headerfile:
diff --git a/gf180mcu/magic/gf180mcu.tcl b/gf180mcu/magic/gf180mcu.tcl
index 81de06d..aa68e78 100644
--- a/gf180mcu/magic/gf180mcu.tcl
+++ b/gf180mcu/magic/gf180mcu.tcl
@@ -103,14 +103,14 @@
magic::add_toolkit_command $layoutframe "diode_pd2nw_03v3 - p-diode" "magic::gencell gf180mcu::diode_pd2nw_03v3" pdk1
magic::add_toolkit_separator $layoutframe pdk1
- magic::add_toolkit_command $layoutframe "npn_05p00x05p00 (3.3V) - 5.0um^2 " "magic::gencell gf180mcu::vnpn_2x2" pdk1
- magic::add_toolkit_command $layoutframe "vnpn_5x0p42 (3.3V) - 5.0um x 0.42um " "magic::gencell gf180mcu::vnpn_5x0p42" pdk1
- magic::add_toolkit_command $layoutframe "npn_10p00x10p00 (3.3V) - 10.0um^2 " "magic::gencell gf180mcu::npn_05p00x05p00" pdk1
- magic::add_toolkit_command $layoutframe "vnpn_10x0p42 (3.3V) - 10.0um x 0.42um " "magic::gencell gf180mcu::vnpn_10x0p42" pdk1
- magic::add_toolkit_command $layoutframe "pnp_05p00x05p00 (3.3V) - 5.0um^2 " "magic::gencell gf180mcu::pnp_05p00x05p00" pdk1
- magic::add_toolkit_command $layoutframe "vpnp_5x0p42 (3.3V) - 5.0um^2 x 0.42um " "magic::gencell gf180mcu::vpnp_5x0p42" pdk1
- magic::add_toolkit_command $layoutframe "pnp_10p00x10p00 (3.3V) - 10.0um^2 " "magic::gencell gf180mcu::pnp_10p00x10p00" pdk1
- magic::add_toolkit_command $layoutframe "vpnp_10x0p42 (3.3V) - 10.0um^2 x 0.42um " "magic::gencell gf180mcu::vpnp_10x0p42" pdk1
+ magic::add_toolkit_command $layoutframe "npn_10p00x10p00 (3.3V) - 10.0um x 10.0um " "magic::gencell gf180mcu::npn_05p00x05p00" pdk1
+ magic::add_toolkit_command $layoutframe "npn_05p00x05p00 (3.3V) - 5.0um x 5.0um " "magic::gencell gf180mcu::npn_05p00x05p00" pdk1
+ magic::add_toolkit_command $layoutframe "npn_10p00x10p00 (3.3V) - 0.54um x 4.0um " "magic::gencell gf180mcu::npn_00p54x04p00" pdk1
+ magic::add_toolkit_command $layoutframe "npn_00p54x02p00 (3.3V) - 0.54um x 2.0um " "magic::gencell gf180mcu::npn_00p54x02p00" pdk1
+ magic::add_toolkit_command $layoutframe "pnp_10p00x10p00 (3.3V) - 10.0um x 10.0um " "magic::gencell gf180mcu::pnp_10p00x10p00" pdk1
+ magic::add_toolkit_command $layoutframe "pnp_05p00x05p00 (3.3V) - 5.0um x 5.0um " "magic::gencell gf180mcu::pnp_05p00x05p00" pdk1
+ magic::add_toolkit_command $layoutframe "pnp_10p00x00p42 (3.3V) - 10.0um x 0.42um " "magic::gencell gf180mcu::pnp_10p00x00p42" pdk1
+ magic::add_toolkit_command $layoutframe "pnp_05p00x00p42 (3.3V) - 5.0um x 0.42um " "magic::gencell gf180mcu::pnp_05p00x00p42" pdk1
magic::add_toolkit_separator $layoutframe pdk1
magic::add_toolkit_command $layoutframe "mos capacitor" "magic::gencell gf180mcu::nmoscap_3p3" pdk1
@@ -4272,7 +4272,7 @@
return {nx 1 ny 1 deltax 0 deltay 0 nocell 1 xstep 13.94 ystep 13.94}
}
-proc gf180mcu::vnpn_5x0p42_defaults {} {
+proc gf180mcu::npn_00p54x02p00_defaults {} {
return {nx 1 ny 1 deltax 0 deltay 0 nocell 1 xstep 12.36 ystep 16.22}
}
@@ -4280,7 +4280,7 @@
return {nx 1 ny 1 deltax 0 deltay 0 nocell 1 xstep 16.94 ystep 16.94}
}
-proc gf180mcu::vnpn_10x0p42_defaults {} {
+proc gf180mcu::npn_00p54x04p00_defaults {} {
return {nx 1 ny 1 deltax 0 deltay 0 nocell 1 xstep 12.36 ystep 21.22}
}
@@ -4288,7 +4288,7 @@
return {nx 1 ny 1 deltax 0 deltay 0 nocell 1 xstep 13.94 ystep 13.94}
}
-proc gf180mcu::vpnp_5x0p42_defaults {} {
+proc gf180mcu::pnp_05p00x00p42_defaults {} {
return {nx 1 ny 1 deltax 0 deltay 0 nocell 1 xstep 12.36 ystep 16.22}
}
@@ -4296,7 +4296,7 @@
return {nx 1 ny 1 deltax 0 deltay 0 nocell 1 xstep 16.94 ystep 16.94}
}
-proc gf180mcu::vpnp_10x0p42_defaults {} {
+proc gf180mcu::pnp_10p00x00p42_defaults {} {
return {nx 1 ny 1 deltax 0 deltay 0 nocell 1 xstep 12.36 ystep 21.22}
}
@@ -4322,7 +4322,7 @@
return [gf180mcu::fixed_convert $parameters]
}
-proc gf180mcu::vnpn_5x0p42_convert {parameters} {
+proc gf180mcu::npn_00p54x02p00_convert {parameters} {
return [gf180mcu::fixed_convert $parameters]
}
@@ -4330,7 +4330,7 @@
return [gf180mcu::fixed_convert $parameters]
}
-proc gf180mcu::vnpn_10x0p42_convert {parameters} {
+proc gf180mcu::npn_00p54x04p00_convert {parameters} {
return [gf180mcu::fixed_convert $parameters]
}
@@ -4338,7 +4338,7 @@
return [gf180mcu::fixed_convert $parameters]
}
-proc gf180mcu::vpnp_5x0p42_convert {parameters} {
+proc gf180mcu::pnp_05p00x00p42_convert {parameters} {
return [gf180mcu::fixed_convert $parameters]
}
@@ -4346,7 +4346,7 @@
return [gf180mcu::fixed_convert $parameters]
}
-proc gf180mcu::vpnp_10x0p42_convert {parameters} {
+proc gf180mcu::pnp_10p00x00p42_convert {parameters} {
return [gf180mcu::fixed_convert $parameters]
}
@@ -4399,7 +4399,7 @@
gf180mcu::fixed_dialog $parameters
}
-proc gf180mcu::vnpn_5x0p42_dialog {parameters} {
+proc gf180mcu::npn_00p54x02p00_dialog {parameters} {
gf180mcu::fixed_dialog $parameters
}
@@ -4407,7 +4407,7 @@
gf180mcu::fixed_dialog $parameters
}
-proc gf180mcu::vnpn_10x0p42_dialog {parameters} {
+proc gf180mcu::npn_00p54x04p00_dialog {parameters} {
gf180mcu::fixed_dialog $parameters
}
@@ -4415,7 +4415,7 @@
gf180mcu::fixed_dialog $parameters
}
-proc gf180mcu::vpnp_5x0p42_dialog {parameters} {
+proc gf180mcu::pnp_05p00x00p42_dialog {parameters} {
gf180mcu::fixed_dialog $parameters
}
@@ -4423,7 +4423,7 @@
gf180mcu::fixed_dialog $parameters
}
-proc gf180mcu::vpnp_10x0p42_dialog {parameters} {
+proc gf180mcu::pnp_10p00x00p42_dialog {parameters} {
gf180mcu::fixed_dialog $parameters
}
@@ -4466,35 +4466,35 @@
#----------------------------------------------------------------
proc gf180mcu::npn_05p00x05p00_draw {parameters} {
- return [gf180mcu::fixed_draw npn_05p00x05p00 $parameters]
+ return [gf180mcu::fixed_draw npn_05p00x05p00_0 $parameters]
}
-proc gf180mcu::vnpn_5x0p42_draw {parameters} {
- return [gf180mcu::fixed_draw vnpn_5x0p42 $parameters]
+proc gf180mcu::npn_00p54x02p00_draw {parameters} {
+ return [gf180mcu::fixed_draw npn_00p54x02p00_0 $parameters]
}
proc gf180mcu::npn_10p00x10p00_draw {parameters} {
- return [gf180mcu::fixed_draw npn_10p00x10p00 $parameters]
+ return [gf180mcu::fixed_draw npn_10p00x10p00_0 $parameters]
}
-proc gf180mcu::vnpn_10x0p42_draw {parameters} {
- return [gf180mcu::fixed_draw vnpn_10X0p42 $parameters]
+proc gf180mcu::npn_00p54x04p00_draw {parameters} {
+ return [gf180mcu::fixed_draw npn_00p54x04p00_0 $parameters]
}
proc gf180mcu::pnp_05p00x05p00_draw {parameters} {
- return [gf180mcu::fixed_draw pnp_05p00x05p00 $parameters]
+ return [gf180mcu::fixed_draw pnp_05p00x05p00_0 $parameters]
}
-proc gf180mcu::vpnp_5x0p42_draw {parameters} {
- return [gf180mcu::fixed_draw vpnp_5x0p42 $parameters]
+proc gf180mcu::pnp_05p00x00p42_draw {parameters} {
+ return [gf180mcu::fixed_draw pnp_05p00x00p42_0 $parameters]
}
proc gf180mcu::pnp_10p00x10p00_draw {parameters} {
- return [gf180mcu::fixed_draw pnp_10p00x10p00 $parameters]
+ return [gf180mcu::fixed_draw pnp_10p00x10p00_0 $parameters]
}
-proc gf180mcu::vpnp_10x0p42_draw {parameters} {
- return [gf180mcu::fixed_draw vpnp_10X0p42 $parameters]
+proc gf180mcu::pnp_10p00x00p42_draw {parameters} {
+ return [gf180mcu::fixed_draw pnp_10p00x00p42_0 $parameters]
}
#----------------------------------------------------------------
@@ -4551,7 +4551,7 @@
return [gf180mcu::fixed_check $parameters]
}
-proc gf180mcu::vnpn_5x0p42_check {parameters} {
+proc gf180mcu::npn_00p54x02p00_check {parameters} {
return [gf180mcu::fixed_check $parameters]
}
@@ -4559,7 +4559,7 @@
return [gf180mcu::fixed_check $parameters]
}
-proc gf180mcu::vnpn_10x0p42_check {parameters} {
+proc gf180mcu::npn_00p54x04p00_check {parameters} {
return [gf180mcu::fixed_check $parameters]
}
@@ -4567,7 +4567,7 @@
return [gf180mcu::fixed_check $parameters]
}
-proc gf180mcu::vpnp_5x0p42_check {parameters} {
+proc gf180mcu::pnp_05p00x00p42_check {parameters} {
return [gf180mcu::fixed_check $parameters]
}
@@ -4575,7 +4575,7 @@
return [gf180mcu::fixed_check $parameters]
}
-proc gf180mcu::vpnp_10x0p42_check {parameters} {
+proc gf180mcu::pnp_10p00x00p42_check {parameters} {
return [gf180mcu::fixed_check $parameters]
}