Skip to content

Commit

Permalink
gf180 / 3LM, 4LM, 5LM
Browse files Browse the repository at this point in the history
  • Loading branch information
gadfort committed Dec 8, 2023
1 parent 9e85d00 commit 65b048e
Show file tree
Hide file tree
Showing 620 changed files with 400,960 additions and 48,596 deletions.
2 changes: 1 addition & 1 deletion .flake8
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[flake8]
max-line-length = 100
extend-exclude = build, dist, lambdapdk/gf180/base/klayout
extend-exclude = build, dist, lambdapdk/gf180/base/setup/klayout

1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ Supported PDKs:
* [ASAP7](lambdapdk/asap7/README.md)
* [FreePDK45](lambdapdk/freepdk45/base/README.md)
* [Skywater130](lambdapdk/sky130/base/README.md)
* [Global Foundries 180](lambdapdk/gf180/README.md)

# License

Expand Down
7 changes: 7 additions & 0 deletions lambdapdk/gf180/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
This is a refactored copy of the GLobalFoundries 180 library that is compatible with the Silicon Compiler Collection and industry practices. The golden version which might be updated fron time to time can be found at:

volare enable --pdk gf180mcu 3af133706e554a740cfe60f21e773d9eaa41838c
gf180mcuA

https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts/tree/bba05379e6de0e3f7ab818d9052a2dd80d9f5dea/flow/platforms/gf180
https://github.com/google/gf180mcu-pdk
131 changes: 131 additions & 0 deletions lambdapdk/gf180/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@

import siliconcompiler
from lambdapdk import register_data_source


####################################################
# PDK Setup
####################################################
def setup(chip):
'''
...
... Process Highlights:
* ...
PDK content:
* ...
More information:
* ...
Sources:
* ...
'''

foundry = 'globalfoundries'
process = 'gf180'
stackup = '5LM_1TM'

node = 180

pdkdir = "lambdapdk/gf180/base/"

register_data_source(chip)
pdk = siliconcompiler.PDK(chip, process, package='lambdapdk')

# process name
pdk.set('pdk', process, 'foundry', foundry)
pdk.set('pdk', process, 'node', node)
pdk.set('pdk', process, 'stackup', stackup)
pdk.set('pdk', process, 'wafersize', 200)

for stackup in ("3LM_1TM_6K",
"3LM_1TM_9K",
"3LM_1TM_11K",
"3LM_1TM_30K",
"4LM_1TM_6K",
"4LM_1TM_9K",
"4LM_1TM_11K",
"4LM_1TM_30K",
"5LM_1TM_9K",
"5LM_1TM_11K",
"6LM_1TM_9K"):
for libtype in ("7t", "9t"):
# APR Setup
for tool in ('openroad', 'klayout', 'magic'):
pdk.set('pdk', process, 'aprtech', tool, stackup, libtype, 'lef',
pdkdir + f'/apr/gf180mcu_{stackup}_{libtype}_tech.lef')
max_layer = int(stackup[0])

pdk.set('pdk', process, 'minlayer', stackup, 'Metal1')
pdk.set('pdk', process, 'maxlayer', stackup, f'Metal{max_layer}')

# Layer map and display file
pdk.set('pdk', process, 'layermap', 'klayout', 'def', 'klayout', stackup,
pdkdir + '/setup/klayout/tech/gf180mcu.lyt')
pdk.set('pdk', process, 'display', 'klayout', stackup,
pdkdir + '/setup/klayout/tech/gf180mcu.lyp')

# Openroad global routing grid derating
openroad_layer_adjustments = {
'Metal1': 0.0,
'Metal2': 0.0,
'Metal3': 0.0,
'Metal4': 0.0,
'Metal5': 0.0,
'Metal6': 0.0,
'MetalTop': 1.0
}
for layer, adj in openroad_layer_adjustments.items():
pdk.set('pdk', process, 'var', 'openroad', f'{layer}_adjustment', stackup, str(adj))
if layer == pdk.get('pdk', process, 'maxlayer', stackup):
break

if max_layer == 2:
pdk.set('pdk', process, 'var', 'openroad', 'rclayer_signal', stackup, 'Metal2')
pdk.set('pdk', process, 'var', 'openroad', 'rclayer_clock', stackup, 'Metal2')

pdk.set('pdk', process, 'var', 'openroad', 'pin_layer_vertical', stackup, 'Metal2')
pdk.set('pdk', process, 'var', 'openroad', 'pin_layer_horizontal', stackup, 'Metal1')
elif max_layer == 3:
pdk.set('pdk', process, 'var', 'openroad', 'rclayer_signal', stackup, 'Metal2')
pdk.set('pdk', process, 'var', 'openroad', 'rclayer_clock', stackup, 'Metal2')

pdk.set('pdk', process, 'var', 'openroad', 'pin_layer_vertical', stackup, 'Metal2')
pdk.set('pdk', process, 'var', 'openroad', 'pin_layer_horizontal', stackup, 'Metal3')
elif max_layer == 4:
pdk.set('pdk', process, 'var', 'openroad', 'rclayer_signal', stackup, 'Metal2')
pdk.set('pdk', process, 'var', 'openroad', 'rclayer_clock', stackup, 'Metal3')

pdk.set('pdk', process, 'var', 'openroad', 'pin_layer_vertical', stackup, 'Metal4')
pdk.set('pdk', process, 'var', 'openroad', 'pin_layer_horizontal', stackup, 'Metal3')
elif max_layer >= 5:
pdk.set('pdk', process, 'var', 'openroad', 'rclayer_signal', stackup, 'Metal3')
pdk.set('pdk', process, 'var', 'openroad', 'rclayer_clock', stackup, 'Metal4')

pdk.set('pdk', process, 'var', 'openroad', 'pin_layer_vertical', stackup, 'Metal4')
pdk.set('pdk', process, 'var', 'openroad', 'pin_layer_horizontal', stackup, 'Metal3')

# PEX
for corner in ["bst", "typ", "wst"]:
if stackup in ('3LM_1TM_6K', '3LM_1TM_9K', '3LM_1TM_11K', '3LM_1TM_30K', '4LM_1TM_6K'):
continue
base_name = f'gf180mcu_1p{stackup.replace("L", "").lower()}_sp_smim_OPTB_{corner}'
pdk.set('pdk', process, 'pexmodel', 'openroad', stackup, corner,
pdkdir + '/pex/openroad/' + base_name + '.tcl')
pdk.set('pdk', process, 'pexmodel', 'openroad-openrcx', stackup, corner,
pdkdir + '/pex/openroad/' + base_name + '.rules')

return pdk


#########################
if __name__ == "__main__":
pdk = setup(siliconcompiler.Chip('<pdk>'))
pdk.write_manifest(f'{pdk.top()}.json')
pdk.check_filepaths()
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,12 @@ UNITS
RESISTANCE OHMS 1 ;
END UNITS

SITE GF018hv5v_mcu_sc7
SYMMETRY X Y ;
CLASS core ;
SIZE 0.56 BY 3.92 ;
END GF018hv5v_mcu_sc7

PROPERTYDEFINITIONS
LAYER LEF58_EOLENCLOSURE STRING ;
LAYER LEF58_TYPE STRING ;
Expand Down
Loading

0 comments on commit 65b048e

Please sign in to comment.