experiment with subtractor
[soclayout.git] / experiments5 / doAlu16.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 import sys
5 import re
6 import traceback
7 import os.path
8 import optparse
9 import Cfg
10 import Hurricane
11 from Hurricane import DbU
12 from Hurricane import DataBase
13 from Hurricane import UpdateSession
14 from Hurricane import Breakpoint
15 from Hurricane import Box
16 from Hurricane import Transformation
17 from Hurricane import Instance
18 from Hurricane import Pin
19 import Viewer
20 import CRL
21 import Etesian
22 import Anabatic
23 import Katana
24 import Unicorn
25 from helpers import l, u, n
26 import plugins.RSavePlugin
27 import symbolic.cmos
28
29 af = CRL.AllianceFramework.get()
30
31 #print "af", dir(af)
32 #sys.exit(0)
33
34 Cfg.Configuration.pushDefaultPriority( Cfg.Parameter.Priority.UserFile )
35
36 cellsTop = '~/alliance-check-toolkit/cells'
37 env = af.getEnvironment()
38 env.addSYSTEM_LIBRARY( library=cellsTop+'/nsxlib', mode=CRL.Environment.Prepend )
39 env.addSYSTEM_LIBRARY( library=cellsTop+'/mpxlib', mode=CRL.Environment.Prepend )
40
41
42 Cfg.getParamBool ( 'misc.catchCore' ).setBool ( False )
43 Cfg.getParamBool ( 'misc.info' ).setBool ( False )
44 Cfg.getParamBool ( 'misc.paranoid' ).setBool ( False )
45 Cfg.getParamBool ( 'misc.bug' ).setBool ( False )
46 Cfg.getParamBool ( 'misc.logMode' ).setBool ( True )
47 Cfg.getParamBool ( 'misc.verboseLevel1' ).setBool ( True )
48 Cfg.getParamBool ( 'misc.verboseLevel2' ).setBool ( True )
49 #Cfg.getParamInt ( 'misc.minTraceLevel' ).setInt ( 159 )
50 #Cfg.getParamInt ( 'misc.maxTraceLevel' ).setInt ( 160 )
51 Cfg.getParamEnumerate ( 'etesian.effort' ).setInt ( 2 )
52 Cfg.getParamPercentage( 'etesian.spaceMargin' ).setPercentage( 5.0 )
53 Cfg.getParamPercentage( 'etesian.aspectRatio' ).setPercentage( 100.0 )
54 Cfg.getParamBool ( 'etesian.uniformDensity' ).setBool ( True )
55 Cfg.getParamInt ( 'anabatic.edgeLenght' ).setInt ( 24 )
56 Cfg.getParamInt ( 'anabatic.edgeWidth' ).setInt ( 8 )
57 Cfg.getParamString ( 'anabatic.topRoutingLayer' ).setString ( 'METAL4')
58 Cfg.getParamInt ( 'katana.eventsLimit' ).setInt ( 1000000 )
59 Cfg.getParamInt ( 'katana.hTracksReservedLocal' ).setInt ( 7 )
60 Cfg.getParamInt ( 'katana.vTracksReservedLocal' ).setInt ( 6 )
61 #Cfg.getParamInt ( 'clockTree.minimumSide' ).setInt ( l(1000) )
62
63 env = af.getEnvironment()
64 env.setCLOCK( '^clk$|m_clock' )
65 env.setPOWER( 'vdd' )
66 env.setGROUND( 'vss' )
67
68 Cfg.Configuration.popDefaultPriority()
69
70
71 def add ( **kw ):
72 editor = None
73 if kw.has_key('editor') and kw['editor']:
74 editor = kw['editor']
75
76 db = DataBase.getDB()
77 print db, dir(db)
78 metal2 = DataBase.getDB().getTechnology().getLayer( 'metal2' )
79 metal3 = DataBase.getDB().getTechnology().getLayer( 'metal3' )
80
81 ###################
82 # add
83
84 cell = af.getCell( 'add', CRL.Catalog.State.Logical )
85 print cell.getNet('a(0)')
86
87 if not cell:
88 print '[ERROR] Unable to load cell "alu16.vst", aborting .'
89 return False
90 kw[ 'cell' ] = cell
91
92 ab = Box( l( 0.0 )
93 , l( 0.0 )
94 , l( 1100.0 )
95 , l( 600.0 ) )
96
97 UpdateSession.open()
98 cell.setAbutmentBox( ab )
99
100 for i in range(16):
101 Pin.create( cell.getNet('a(%d)' % i)
102 , 'a(%d).0' % i
103 , Pin.Direction.SOUTH
104 , Pin.PlacementStatus.PLACED
105 , metal3
106 , l( 60.0*i + 20.0 ) , l( 0.0 ) # Position.
107 , l( 2.0 ) , l( 2.0 ) # Size.
108 )
109 if False:
110 Pin.create( cell.getNet('b(%d)' % i)
111 , 'b(%d).0' % i
112 , Pin.Direction.SOUTH
113 , Pin.PlacementStatus.PLACED
114 , metal2
115 , l( 60.0*i + 40.0 ) , l( 0.0 ) # Position.
116 #, l( 0.0 ), l( 100.0*i + 50.0 ) # Position.
117 , l( 2.0 ) , l( 2.0 ) # Size.
118 )
119 if True:
120 Pin.create( cell.getNet('o(%d)' % i)
121 , 'o(%d).0' % i
122 , Pin.Direction.SOUTH
123 , Pin.PlacementStatus.FIXED
124 , metal2
125 , l( 60.0*i + 60.0 ) , l( 0.0 ) # Position.
126 , l( 2.0 ) , l( 2.0 ) # Size.
127 )
128
129 if False:
130 Pin.create( cell.getNet('rst')
131 , 'p_reset.0'
132 , Pin.Direction.WEST
133 , Pin.PlacementStatus.FIXED
134 , metal2
135 , l( 0.0 )
136 , l( 140.0 )
137 , l( 2.0 )
138 , l( 2.0 )
139 )
140 UpdateSession.close()
141
142 if editor: editor.setCell( cell )
143
144 etesian = Etesian.EtesianEngine.create(cell)
145 etesian.place()
146
147 katana = Katana.KatanaEngine.create(cell)
148 katana.digitalInit ()
149 #katana.runNegociatePreRouted()
150 print dir(katana)
151 katana.runGlobalRouter (0)
152 katana.loadGlobalRouting ( Anabatic.EngineLoadGrByNet )
153 katana.layerAssign ( Anabatic.EngineNoNetLayerAssign )
154 katana.runNegociate ( Katana.Flags.NoFlags )
155 katana.finalizeLayout ()
156 print dir(katana)
157 success = katana.getSuccessState()
158 katana.destroy()
159
160 #af.saveCell( cell, CRL.Catalog.State.Views )
161 plugins.RSavePlugin.ScriptMain( **kw )
162
163 def sub(**kw):
164
165 editor = None
166 if kw.has_key('editor') and kw['editor']:
167 editor = kw['editor']
168
169 db = DataBase.getDB()
170 print db, dir(db)
171 metal2 = DataBase.getDB().getTechnology().getLayer( 'metal2' )
172 metal3 = DataBase.getDB().getTechnology().getLayer( 'metal3' )
173
174 ###################
175 # sub
176
177 cell = af.getCell( 'sub', CRL.Catalog.State.Logical )
178 print cell.getNet('a(0)')
179
180 if not cell:
181 print '[ERROR] Unable to load cell "alu16.vst", aborting .'
182 return False
183 kw[ 'cell' ] = cell
184
185 ab = Box( l( 0.0 )
186 , l( 0.0 )
187 , l( 2000.0 )
188 , l( 600.0 ) )
189
190 UpdateSession.open()
191 cell.setAbutmentBox( ab )
192
193 for i in range(16):
194 Pin.create( cell.getNet('a(%d)' % i)
195 , 'a(%d).0' % i
196 , Pin.Direction.SOUTH
197 , Pin.PlacementStatus.FIXED
198 , metal3
199 , l( 100.0*i + 50.0 ) , l( 0.0 ) # Position.
200 , l( 2.0 ) , l( 2.0 ) # Size.
201 )
202 if False:
203 Pin.create( cell.getNet('b(%d)' % i)
204 , 'b(%d).0' % i
205 , Pin.Direction.EAST
206 , Pin.PlacementStatus.FIXED
207 , metal3
208 , l( 0.0 ), l( 100.0*i + 50.0 ) # Position.
209 , l( 2.0 ) , l( 2.0 ) # Size.
210 )
211 Pin.create( cell.getNet('o(%d)' % i)
212 , 'o(%d).0' % i
213 , Pin.Direction.SOUTH
214 , Pin.PlacementStatus.FIXED
215 , metal3
216 , l( 100.0*i + 20.0 ) , l( 0.0 ) # Position.
217 , l( 2.0 ) , l( 2.0 ) # Size.
218 )
219
220 if False:
221 Pin.create( cell.getNet('rst')
222 , 'p_reset.0'
223 , Pin.Direction.WEST
224 , Pin.PlacementStatus.FIXED
225 , metal2
226 , l( 0.0 )
227 , l( 140.0 )
228 , l( 2.0 )
229 , l( 2.0 )
230 )
231 UpdateSession.close()
232
233 if editor: editor.setCell( cell )
234
235 etesian = Etesian.EtesianEngine.create(cell)
236 etesian.place()
237
238 katana = Katana.KatanaEngine.create(cell)
239 katana.digitalInit ()
240 #katana.runNegociatePreRouted()
241 print dir(katana)
242 katana.runGlobalRouter (0)
243 katana.loadGlobalRouting ( Anabatic.EngineLoadGrByNet )
244 katana.layerAssign ( Anabatic.EngineNoNetLayerAssign )
245 katana.runNegociate ( Katana.Flags.NoFlags )
246 katana.finalizeLayout ()
247 print dir(katana)
248 success = katana.getSuccessState()
249 katana.destroy()
250
251 #af.saveCell( cell, CRL.Catalog.State.Views )
252 plugins.RSavePlugin.ScriptMain( **kw )
253
254 print "done with add and sub"
255
256 def alu_hier(**kw):
257
258 editor = None
259 if kw.has_key('editor') and kw['editor']:
260 editor = kw['editor']
261
262 db = DataBase.getDB()
263 print db, dir(db)
264 metal2 = DataBase.getDB().getTechnology().getLayer( 'metal2' )
265 metal3 = DataBase.getDB().getTechnology().getLayer( 'metal3' )
266
267 ################# SNX
268 #
269
270 cell = af.getCell( 'add', CRL.Catalog.State.Views )
271 cell = af.getCell( 'sub', CRL.Catalog.State.Views )
272 cell = af.getCell( 'alu_hier', CRL.Catalog.State.Logical )
273 if not cell:
274 print '[ERROR] Unable to load cell "snx.vst", aborting .'
275 return False
276 kw[ 'cell' ] = cell
277
278 ab = Box( l( 0.0 )
279 , l( 0.0 )
280 , l( 3100.0 )
281 , l( 4100.0 ) )
282
283 UpdateSession.open()
284 cell.setAbutmentBox( ab )
285
286 for i in range(16):
287 Pin.create( cell.getNet('a(%d)' % i)
288 , 'a(%d).0' % i
289 , Pin.Direction.SOUTH
290 , Pin.PlacementStatus.FIXED
291 , metal3
292 , l( 100.0*i + 50.0 ) , l( 0.0 ) # Position.
293 , l( 2.0 ) , l( 2.0 ) # Size.
294 )
295 Pin.create( cell.getNet('b(%d)' % i)
296 , 'b(%d).0' % i
297 , Pin.Direction.SOUTH
298 , Pin.PlacementStatus.FIXED
299 , metal3
300 , l( 100.0*i + 50.0 ) , l( 0.0 ) # Position.
301 , l( 2.0 ) , l( 2.0 ) # Size.
302 )
303 Pin.create( cell.getNet('o(%d)' % i)
304 , 'o(%d).0' % i
305 , Pin.Direction.NORTH
306 , Pin.PlacementStatus.FIXED
307 , metal3
308 , l( 100.0*i + 25.0 ) , l( 0.0 ) # Position.
309 , l( 2.0 ) , l( 2.0 ) # Size.
310 )
311
312 Pin.create( cell.getNet('rst')
313 , 'p_reset.0'
314 , Pin.Direction.WEST
315 , Pin.PlacementStatus.FIXED
316 , metal2
317 , l( 0.0 )
318 , l( 140.0 )
319 , l( 2.0 )
320 , l( 2.0 )
321 )
322 UpdateSession.close()
323
324 if editor: editor.setCell( cell )
325
326 print "editor", editor, dir(editor)
327
328 etesian = Etesian.EtesianEngine.create(cell)
329 etesian.place()
330
331 katana = Katana.KatanaEngine.create(cell)
332 katana.digitalInit ()
333 #katana.runNegociatePreRouted()
334 print dir(katana)
335 katana.runGlobalRouter (0)
336 katana.loadGlobalRouting ( Anabatic.EngineLoadGrByNet )
337 katana.layerAssign ( Anabatic.EngineNoNetLayerAssign )
338 katana.runNegociate ( Katana.Flags.NoFlags )
339 katana.finalizeLayout ()
340 print dir(katana)
341 success = katana.getSuccessState()
342 katana.destroy()
343
344 #af.saveCell( cell, CRL.Catalog.State.Views )
345 plugins.RSavePlugin.ScriptMain( **kw )
346
347 return success
348
349
350 if __name__ == '__main__':
351 success = add()
352 #success = alu_hier()
353 shellSuccess = 0
354 if not success: shellSuccess = 1
355
356 sys.exit( shellSuccess )
357