ToolsTp2-2010: contest.py

File contest.py, 23.3 KB (added by jpc, 13 years ago)

AMD2901 netlist with an awfully bad placement

Line 
1#!/usr/bin/env python
2
3from stratus import *
4
5
6class contest ( Model ) :
7
8  def Interface ( self ) :
9
10    # Command for selecting operands R and S.
11    self.ops_mx     = SignalIn    ( "ops_mx",     3 )
12    self.opr_mx     = SignalIn    ( "opr_mx",     2 )
13                                                 
14    # ALU commands and auxiliary terminals.     
15    self.alu_k      = SignalIn    ( "alu_k",      5 )
16    self.alu_cin    = SignalIn    ( "alu_cin",    1 ) 
17    self.alu_cout   = SignalOut   ( "alu_cout",   1 ) 
18    self.alu_over   = SignalInOut ( "alu_over",   1 )
19   
20    # RAM, ACCU shifter commands and auxiliary terminals.
21    self.ram_sh     = SignalIn    ( "ram_sh",     2 ) 
22    self.acc_sh     = SignalIn    ( "acc_sh",     2 ) 
23   
24    # RAM shifter inputs
25    self.ram_i_up   = SignalIn    ( "ram_i_up",   1 )
26    self.ram_i_down = SignalIn    ( "ram_i_down", 1 )
27   
28    # ACCU shifter inputs.
29    self.acc_i_up   = SignalIn    ( "acc_i_up",   1 ) 
30    self.acc_i_down = SignalIn    ( "acc_i_down", 1 ) 
31   
32    # ACCU shifter outputs ("acc_scout" is "acc_q_up").
33    self.acc_q_down = SignalOut   ( "acc_q_down", 1 )
34    self.acc_q_up   = SignalOut   ( "acc_q_up",   1 )
35   
36    # Output multiplexer commnand (for X bus).
37    self.out_mx     = SignalIn    ( "out_mx",     1 )
38   
39    # ACCU controls terminals.
40    self.acc_ck     = SignalIn    ( "acc_ck",     1 )
41    self.acc_wen    = SignalIn    ( "acc_wen",    1 )
42   
43    # Register file controls terminals.
44    self.ram_ck     = SignalIn    ( "ram_ck",    16 )   # Register clocks (ck)
45    self.b_w        = SignalIn    ( "b_w",       16 )   # Write enable
46    self.a          = SignalIn    ( "a",         16 )   # Register A address.
47    self.b          = SignalIn    ( "b",         16 )   # Register B address.
48   
49    # Data buses terminals.
50    self.opr_d      = SignalIn    ( "opr_d",      4 )
51    self.alu_f      = SignalInOut ( "alu_f",      4 )
52    self.alu_np     = SignalOut   ( "alu_np",     4 )
53    self.alu_ng     = SignalOut   ( "alu_ng",     4 )
54    self.out_x      = SignalOut   ( "out_x",      4 )
55     
56    # Power supply connectors.
57    self.vdd = VddIn ( "vdd" )
58    self.vss = VssIn ( "vss" )
59
60
61  def Netlist ( self ) :
62
63    Generate ( "DpgenSff",                    "sff_4bits", param = {'nbit' : 4,                     'physical' : True} )
64    Generate ( "DpgenNbuse",                "nbuse_4bits", param = {'nbit' : 4,                     'physical' : True} )
65    Generate ( "DpgenInv",             "inv_drive8_4bits", param = {'nbit' : 4, 'drive' : 8,        'physical' : True} )
66    Generate ( "DpgenMux2",                  "mux2_4bits", param = {'nbit' : 4,                     'physical' : True} )
67    Generate ( "DpgenNand2mask", "nand2mask_0b0000_4bits", param = {'nbit' : 4, 'const' : "0b0000", 'physical' : True} )
68    Generate ( "DpgenXnor2",                "xnor2_4bits", param = {'nbit' : 4,                     'physical' : True} )
69    Generate ( "DpgenNand2",                "nand2_4bits", param = {'nbit' : 4,                     'physical' : True} )
70    Generate ( "DpgenNor2",                  "nor2_4bits", param = {'nbit' : 4,                     'physical' : True} )
71    Generate ( "DpgenXor2",                  "xor2_4bits", param = {'nbit' : 4,                     'physical' : True} )
72    Generate ( "DpgenXnor2",         "xnor2_drive4_4bits", param = {'nbit' : 4, 'drive' : 4,        'physical' : True} )
73    Generate ( "DpgenBuff",                  "buff_2bits", param = {'nbit' : 2,                     'physical' : True} )
74
75    # List of Signals 
76    ram_d       = Signal ( "ram_d",      4 )
77    ram_nra     = Signal ( "ram_nra",    4 )
78    ram_nrb     = Signal ( "ram_nrb",    4 )
79    ram_ra      = Signal ( "ram_ra",     4 )
80    ram_rb      = Signal ( "ram_rb",     4 )
81                                         
82    mux_shram   = Signal ( "mux_shram",  4 )
83    acc_q       = Signal ( "acc_q",      4 )
84    ops0_out    = Signal ( "ops0_out",   4 )
85    ops1_out    = Signal ( "ops1_out",   4 )
86    opr0_out    = Signal ( "opr0_out",   4 )
87    alu_ns      = Signal ( "alu_ns",     4 )
88    alu_nr      = Signal ( "alu_nr",     4 )
89    alu_int0    = Signal ( "alu_int0",   4 )
90    alu_int1    = Signal ( "alu_int1",   4 )
91    alu_int2    = Signal ( "alu_int2",   4 )
92    alu_int3    = Signal ( "alu_int3",   4 )
93    alu_int4    = Signal ( "alu_int4",   4 )
94    alu_int5    = Signal ( "alu_int5",   4 )
95    alu_int6    = Signal ( "alu_int6",   4 )
96    alu_int7    = Signal ( "alu_int7",   4 )
97    mux_shacc0  = Signal ( "mux_shacc0", 4 )   
98    mux_shacc1  = Signal ( "mux_shacc1", 4 )   
99    carry       = Signal ( "carry",      2 )
100
101    # Array of Signals
102    ram_q = []
103    for i in range ( 16 ) : ram_q += [Signal ( "ram_q%ld" % i, 4 )]
104     
105    # Register file description.
106    self.ram_reg  = {}
107    self.ram_ntsa = {}
108    self.ram_ntsb = {}
109   
110    for i in range ( 16 ) :
111      # Register part.
112      self.ram_reg[i] = Inst ( "sff_4bits", "ram_reg%ld" % i
113                             , map   = { 'wen'  : self.b_w[i]
114                                       , 'ck'   : self.ram_ck[i]
115                                       , 'i0'   : ram_d
116                                       , 'q'    : ram_q[i]
117                                       , 'vdd'  : self.vdd
118                                       , 'vss'  : self.vss
119                                       }
120                             )
121     
122      # Tristate for A output.
123      self.ram_ntsa[i] = Inst ( "nbuse_4bits", "ram_ntsa%ld" % i
124                              , map   = { 'cmd'  : self.a[i]
125                                        , 'i0'   : ram_q[i]
126                                        , 'nq'   : ram_nra
127                                        , 'vdd'  : self.vdd
128                                        , 'vss'  : self.vss
129                                        }
130                              )
131
132     
133      # Tristate for B output.
134      self.ram_ntsb[i] = Inst ( "nbuse_4bits", "ram_ntsb%ld" % i
135                              , map   = { 'cmd'  : self.b[i]
136                                        , 'i0'   : ram_q[i]
137                                        , 'nq'   : ram_nrb
138                                        , 'vdd'  : self.vdd
139                                        , 'vss'  : self.vss
140                                        }
141                              )
142
143   
144    # Output drivers for A & B output.
145    self.inv_ra = Inst ( "inv_drive8_4bits", "inv_ra"
146                       , map   = { 'i0'    : ram_nra
147                                 , 'nq'    : ram_ra
148                                 , 'vdd'   : self.vdd
149                                 , 'vss'   : self.vss
150                                 }
151                       )
152
153    self.inv_rb = Inst ( "inv_drive8_4bits", "inv_rb"
154                       , map   = { 'i0'    : ram_nrb
155                                 , 'nq'    : ram_rb
156                                 , 'vdd'   : self.vdd
157                                 , 'vss'   : self.vss
158                                 }
159                       )
160     
161    #  --------------------------------------------------------------
162    #  RAM shifter.
163    self.mx2_ram_sh0 = Inst ( "mux2_4bits", "mx2_ram_sh0"
164                            , map   = { 'i0'   : Cat ( self.alu_f[2:0], self.ram_i_down )
165                                      , 'i1'   : Cat ( self.ram_i_up, self.alu_f[3:1] )
166                                      , 'cmd'  : self.ram_sh[0]
167                                      , 'q'    : mux_shram
168                                      , 'vdd'  : self.vdd
169                                      , 'vss'  : self.vss
170                                      }
171                            )
172    self.mx2_ram_sh1 = Inst ( "mux2_4bits", "mx2_ram_sh1"
173                            , map   = { 'i0'   : mux_shram
174                                      , 'i1'   : self.alu_f
175                                      , 'cmd'  : self.ram_sh[1]
176                                      , 'q'    : ram_d
177                                      , 'vdd'  : self.vdd
178                                      , 'vss'  : self.vss
179                                      } 
180                            )
181   
182
183    # --------------------------------------------------------------
184    # Operand S.
185    self.mx2_ops0 = Inst ( "mux2_4bits", "mx2_ops0"
186                         , map   = { 'i0'   : acc_q
187                                   , 'i1'   : ram_rb
188                                   , 'cmd'  : self.ops_mx[0]
189                                   , 'q'    : ops0_out
190                                   , 'vdd'  : self.vdd
191                                   , 'vss'  : self.vss
192                                   } 
193                         )
194    self.mx2_ops1 = Inst ( "mux2_4bits", "mx2_ops1"
195                         , map   = { 'i0'   : ops0_out
196                                   , 'i1'   : ram_ra
197                                   , 'cmd'  : self.ops_mx[1]
198                                   , 'q'    : ops1_out
199                                   , 'vdd'  : self.vdd
200                                   , 'vss'  : self.vss
201                                   } 
202                         )
203    self.nand2mask_s = Inst ( "nand2mask_0b0000_4bits", "nand2mask_s"
204                            , map   = { 'i0'    : ops1_out
205                                      , 'cmd'   : self.ops_mx[2]
206                                      , 'nq'    : alu_ns
207                                      , 'vdd'   : self.vdd
208                                      , 'vss'   : self.vss
209                                      } 
210                            )
211     
212    # --------------------------------------------------------------
213    # Operand R.
214    self.mx2_opr0 = Inst ( "mux2_4bits", "mx2_opr0"
215                         , map   = { 'i0'   : ram_ra
216                                   , 'i1'   : self.opr_d
217                                   , 'cmd'  : self.opr_mx[0]
218                                   , 'q'    : opr0_out
219                                   , 'vdd'  : self.vdd
220                                   , 'vss'  : self.vss
221                                   } 
222                         )
223    self.nand2mask_r = Inst ( "nand2mask_0b0000_4bits", "nand2mask_r"
224                            , map   = { 'i0'    : opr0_out
225                                      , 'cmd'   : self.opr_mx[1]
226                                      , 'nq'    : alu_nr
227                                      , 'vdd'   : self.vdd
228                                      , 'vss'   : self.vss
229                                      } 
230                            )
231   
232    # --------------------------------------------------------------
233    # ALU Description.
234    self.xnor2_alu0 = Inst ( "xnor2_4bits", "xnor2_alu0"
235                           , map   = { 'i0'   : alu_nr
236                                     , 'i1'   : Cat ( self.alu_k[0]
237                                                    , self.alu_k[0]
238                                                    , self.alu_k[0]
239                                                    , self.alu_k[0]
240                                                    ) 
241                                     , 'nq'   : alu_int0
242                                     , 'vdd'  : self.vdd
243                                     , 'vss'  : self.vss
244                                     } 
245                           )
246     
247    self.xnor2_alu1 = Inst ( "xnor2_4bits", "xnor2_alu1"
248                           , map   = { 'i0'   : alu_ns
249                                     , 'i1'   : Cat ( self.alu_k[1]
250                                                    , self.alu_k[1]
251                                                    , self.alu_k[1]
252                                                    , self.alu_k[1]
253                                                    ) 
254                                     , 'nq'   : alu_int1
255                                     , 'vdd'  : self.vdd
256                                     , 'vss'  : self.vss
257                                     } 
258                           )
259     
260    # Compute of "generate".
261    self.nand2_ng = Inst ( "nand2_4bits", "nand2_ng"
262                         , map   = { 'i0'   : alu_int0
263                                   , 'i1'   : alu_int1
264                                   , 'nq'   : self.alu_ng
265                                   , 'vdd'  : self.vdd
266                                   , 'vss'  : self.vss
267                                   }
268                         )
269
270    # Compute of "propagate".
271    self.nor2_np = Inst ( "nor2_4bits", "nor2_np"
272                        , map   = { 'i0'   : alu_int0
273                                  , 'i1'   : alu_int1
274                                  , 'nq'   : self.alu_np
275                                  , 'vdd'  : self.vdd
276                                  , 'vss'  : self.vss
277                                  }
278                        )
279   
280    # Compute of carry.
281    self.inv_np = Inst ( "inv_drive8_4bits", "inv_np"
282                       , map   = { 'i0'    : self.alu_np
283                                 , 'nq'    : alu_int2
284                                 , 'vdd'   : self.vdd
285                                 , 'vss'   : self.vss
286                                 }
287                       )
288    self.nand2_cout_in = Inst ( "nand2_4bits", "nand2_cout_in"
289                              , map   = { 'i0'   : alu_int2
290                                        , 'i1'   : Cat ( self.alu_over, carry, self.alu_cin )
291                                        , 'nq'   : alu_int3
292                                        , 'vdd'  : self.vdd
293                                        , 'vss'  : self.vss
294                                        }
295                              )
296    self.nand2_cout = Inst ( "nand2_4bits", "nand2_cout"
297                           , map   = { 'i0'   : alu_int3
298                                     , 'i1'   : self.alu_ng
299                                     , 'nq'   : Cat ( self.alu_cout, self.alu_over, carry ) 
300                                     , 'vdd'  : self.vdd
301                                     , 'vss'  : self.vss
302                                     }
303                           )
304   
305    # Logical and arithmetical operators.
306    self.nor2_alu_int7 = Inst ( "nor2_4bits", "nor2_alu_int7"
307                              , map   = { 'i0'   : Cat ( self.alu_over
308                                                       , carry
309                                                       , self.alu_cin
310                                                       ) 
311                                        , 'i1'   : Cat ( self.alu_k[4]
312                                                       , self.alu_k[4]
313                                                       , self.alu_k[4]
314                                                       , self.alu_k[4]
315                                                       )
316                                        , 'nq'   : alu_int7
317                                        , 'vdd'  : self.vdd
318                                        , 'vss'  : self.vss
319                                        }
320                              )
321
322    self.nor2_alu_int4 = Inst ( "nor2_4bits", "nor2_alu_int4"
323                              , map   = { 'i0'   : self.alu_ng
324                                        , 'i1'   : Cat ( self.alu_k[2]
325                                                       , self.alu_k[2]
326                                                       , self.alu_k[2]
327                                                       , self.alu_k[2]
328                                                       ) 
329                                        , 'nq'   : alu_int4
330                                        , 'vdd'  : self.vdd
331                                        , 'vss'  : self.vss
332                                        }
333                              )
334
335    self.nor2_alu_int5 = Inst ( "nor2_4bits", "nor2_alu_int5"
336                              , map   = { 'i0'   : self.alu_np
337                                        , 'i1'   : Cat ( self.alu_k[3]
338                                                       , self.alu_k[3]
339                                                       , self.alu_k[3]
340                                                       , self.alu_k[3]
341                                                       )
342                                        , 'nq'   : alu_int5
343                                        , 'vdd'  : self.vdd
344                                        , 'vss'  : self.vss
345                                        }
346                              )
347   
348    self.xor2_alu_int6 = Inst ("xor2_4bits", "xor2_alu_int6"
349                              , map   = { 'i0'   : alu_int4
350                                        , 'i1'   : alu_int5
351                                        , 'q'    : alu_int6
352                                        , 'vdd'  : self.vdd
353                                        , 'vss'  : self.vss
354                                        } 
355                              )
356     
357    # Output.
358    self.xnor2_alu_f = Inst ( "xnor2_drive4_4bits", "xnor2_alu_f"
359                            , map   = { 'i0'   : alu_int6
360                                      , 'i1'   : alu_int7
361                                      , 'nq'   : self.alu_f
362                                      , 'vdd'  : self.vdd
363                                      , 'vss'  : self.vss
364                                      } 
365                            ) 
366     
367    # --------------------------------------------------------------
368    # ACCU Description.
369    self.mx2_acc_sh0 = Inst ( "mux2_4bits", "mx2_acc_sh0"
370                            , map   = { 'i0'   : Cat ( acc_q[2:0], self.acc_i_down ) 
371                                      , 'i1'   : Cat ( self.acc_i_up, acc_q[3:1] ) 
372                                      , 'cmd'  : self.acc_sh[0]
373                                      , 'q'    : mux_shacc0
374                                      , 'vdd'  : self.vdd
375                                      , 'vss'  : self.vss
376                                      } 
377                            )
378    self.mx2_acc_sh1 = Inst ( "mux2_4bits", "mx2_acc_sh1"
379                            , map   = { 'i0'   : mux_shacc0
380                                      , 'i1'   : self.alu_f
381                                      , 'cmd'  : self.acc_sh[1]
382                                      , 'q'    : mux_shacc1
383                                      , 'vdd'  : self.vdd
384                                      , 'vss'  : self.vss
385                                      } 
386                            )
387    self.acc_reg = Inst ( "sff_4bits", "acc_reg"
388                        , map   = { 'wen'  : self.acc_wen
389                                  , 'ck'   : self.acc_ck
390                                  , 'i0'   : mux_shacc1
391                                  , 'q'    : acc_q
392                                  , 'vdd'  : self.vdd
393                                  , 'vss'  : self.vss
394                                  }
395                        )
396    self.acc_buff = Inst ( "buff_2bits", "acc_buff0"
397                         , map   = { 'i0'   : Cat ( acc_q[0], acc_q[3] ) 
398                                   , 'q'    : Cat ( self.acc_q_down, self.acc_q_up )
399                                   , 'vdd'  : self.vdd
400                                   , 'vss'  : self.vss
401                                   }
402                         )
403     
404    # --------------------------------------------------------------
405    # Output Multiplexer.
406    self.mx2_out = Inst ( "mux2_4bits", "mx2_out"
407                        , map   = { 'i0'   : self.alu_f
408                                  , 'i1'   : ram_ra
409                                  , 'cmd'  : self.out_mx
410                                  , 'q'    : self.out_x
411                                  , 'vdd'  : self.vdd
412                                  , 'vss'  : self.vss
413                                  } 
414                        )
415
416
417  def Layout (self):
418
419    Place      ( self.acc_buff,      NOSYM, XY(0,0) )
420    PlaceRight ( self.acc_reg,       NOSYM )
421    PlaceRight ( self.inv_np,        NOSYM )
422    PlaceRight ( self.inv_ra,        NOSYM )
423    PlaceRight ( self.inv_rb,        NOSYM )
424    PlaceRight ( self.mx2_acc_sh0,   NOSYM )
425    PlaceRight ( self.mx2_acc_sh1,   NOSYM )
426    PlaceRight ( self.mx2_opr0,      NOSYM )
427    PlaceRight ( self.mx2_ops0,      NOSYM )
428    PlaceRight ( self.mx2_ops1,      NOSYM )
429    PlaceRight ( self.mx2_out,       NOSYM )
430    PlaceRight ( self.mx2_ram_sh0,   NOSYM )
431    PlaceRight ( self.mx2_ram_sh1,   NOSYM )
432    PlaceRight ( self.nand2_cout_in, NOSYM )
433    PlaceRight ( self.nand2_cout,    NOSYM )
434    PlaceRight ( self.nand2mask_r,   NOSYM )
435    PlaceRight ( self.nand2mask_s,   NOSYM )
436    PlaceRight ( self.nand2_ng,      NOSYM )
437    PlaceRight ( self.nor2_alu_int4, NOSYM )
438    PlaceRight ( self.nor2_alu_int5, NOSYM )
439    PlaceRight ( self.nor2_alu_int7, NOSYM )
440    PlaceRight ( self.nor2_np,       NOSYM )
441    PlaceRight ( self.ram_ntsa[ 0],  NOSYM )
442    PlaceRight ( self.ram_ntsa[10],  NOSYM )
443    PlaceRight ( self.ram_ntsa[11],  NOSYM )
444    PlaceRight ( self.ram_ntsa[12],  NOSYM )
445    PlaceRight ( self.ram_ntsa[13],  NOSYM )
446    PlaceRight ( self.ram_ntsa[14],  NOSYM )
447    PlaceRight ( self.ram_ntsa[15],  NOSYM )
448    PlaceRight ( self.ram_ntsa[ 1],  NOSYM )
449    PlaceRight ( self.ram_ntsa[ 2],  NOSYM )
450    PlaceRight ( self.ram_ntsa[ 3],  NOSYM )
451    PlaceRight ( self.ram_ntsa[ 4],  NOSYM )
452    PlaceRight ( self.ram_ntsa[ 5],  NOSYM )
453    PlaceRight ( self.ram_ntsa[ 6],  NOSYM )
454    PlaceRight ( self.ram_ntsa[ 7],  NOSYM )
455    PlaceRight ( self.ram_ntsa[ 8],  NOSYM )
456    PlaceRight ( self.ram_ntsa[ 9],  NOSYM )
457    PlaceRight ( self.ram_ntsb[ 0],  NOSYM )
458    PlaceRight ( self.ram_ntsb[10],  NOSYM )
459    PlaceRight ( self.ram_ntsb[11],  NOSYM )
460    PlaceRight ( self.ram_ntsb[12],  NOSYM )
461    PlaceRight ( self.ram_ntsb[13],  NOSYM )
462    PlaceRight ( self.ram_ntsb[14],  NOSYM )
463    PlaceRight ( self.ram_ntsb[15],  NOSYM )
464    PlaceRight ( self.ram_ntsb[ 1],  NOSYM )
465    PlaceRight ( self.ram_ntsb[ 2],  NOSYM )
466    PlaceRight ( self.ram_ntsb[ 3],  NOSYM )
467    PlaceRight ( self.ram_ntsb[ 4],  NOSYM )
468    PlaceRight ( self.ram_ntsb[ 5],  NOSYM )
469    PlaceRight ( self.ram_ntsb[ 6],  NOSYM )
470    PlaceRight ( self.ram_ntsb[ 7],  NOSYM )
471    PlaceRight ( self.ram_ntsb[ 8],  NOSYM )
472    PlaceRight ( self.ram_ntsb[ 9],  NOSYM )
473    PlaceRight ( self.ram_reg[10],   NOSYM )
474    PlaceRight ( self.ram_reg[11],   NOSYM )
475    PlaceRight ( self.ram_reg[12],   NOSYM )
476    PlaceRight ( self.ram_reg[13],   NOSYM )
477    PlaceRight ( self.ram_reg[14],   NOSYM )
478    PlaceRight ( self.ram_reg[15],   NOSYM )
479    PlaceRight ( self.ram_reg[ 0],   NOSYM )
480    PlaceRight ( self.ram_reg[ 1],   NOSYM )
481    PlaceRight ( self.ram_reg[ 2],   NOSYM )
482    PlaceRight ( self.ram_reg[ 3],   NOSYM )
483    PlaceRight ( self.ram_reg[ 4],   NOSYM )
484    PlaceRight ( self.ram_reg[ 5],   NOSYM )
485    PlaceRight ( self.ram_reg[ 6],   NOSYM )
486    PlaceRight ( self.ram_reg[ 7],   NOSYM )
487    PlaceRight ( self.ram_reg[ 8],   NOSYM )
488    PlaceRight ( self.ram_reg[ 9],   NOSYM )
489    PlaceRight ( self.xnor2_alu0,    NOSYM )
490    PlaceRight ( self.xnor2_alu1,    NOSYM )
491    PlaceRight ( self.xnor2_alu_f,   NOSYM )
492    PlaceRight ( self.xor2_alu_int6, NOSYM )
493
494    ResizeAb ( 0, 0, 0, 50 );
495
496
497def StratusScript ():
498  if globals().has_key ( "__editor" ):
499    setEditor ( __editor )
500
501  datapath = contest ( "contest" )
502
503  datapath.Interface()
504  datapath.Netlist  ()
505 #datapath.View     ( message="After Netlist Generation" )
506  datapath.Layout   ()
507 #datapath.View     ( message="After Layout Generation" )
508  datapath.Save     (PHYSICAL)
509
510
511if __name__ == "__main__" :
512  StratusScript ()