coriolis/stratus1/src/stratus/st_placeAndRoute.py

345 lines
9.8 KiB
Python

#!/usr/bin/python
# This file is part of the Coriolis Project.
# Copyright (C) Laboratoire LIP6 - Departement ASIM
# Universite Pierre et Marie Curie
#
# Main contributors :
# Christophe Alexandre <Christophe.Alexandre@lip6.fr>
# Sophie Belloeil <Sophie.Belloeil@lip6.fr>
# Hugo Clement <Hugo.Clement@lip6.fr>
# Jean-Paul Chaput <Jean-Paul.Chaput@lip6.fr>
# Damien Dupuis <Damien.Dupuis@lip6.fr>
# Christian Masson <Christian.Masson@lip6.fr>
# Marek Sroka <Marek.Sroka@lip6.fr>
#
# The Coriolis Project is free software; you can redistribute it
# and/or modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# The Coriolis Project is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied warranty
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with the Coriolis Project; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
# USA
#
# License-Tag
# Authors-Tag
# ===================================================================
#
# x-----------------------------------------------------------------x
# | |
# | C O R I O L I S |
# | S t r a t u s - Netlists/Layouts Description |
# | |
# | Author : Sophie BELLOEIL |
# | E-mail : Sophie.Belloeil@lip6.fr |
# | =============================================================== |
# | Py Module : "./st_placeAndRoute.py" |
# | *************************************************************** |
# | U p d a t e s |
# | |
# x-----------------------------------------------------------------x
import CRL
from placeandroute import *
from st_net import *
import re, string
global nbCkBuf
nbCkBuf = 0
###############
## PlaceGlue ##
###############
def PlaceGlue ( cell = None, tool = "mistral", greedy = True, nparts = 0 ) :
if not cell :
global CELLS
from st_model import CELLS
cell = CELLS[-1]
if isinstance ( cell, Model ) : # FIXME : a changer, mettre toujours un model et faire utiliser aux etudiants de l'annee prochaine getModel
pyPlaceGlue ( cell._hur_cell )
if isinstance ( cell, Inst ) :
pyPlaceGlue ( cell._st_masterCell._hur_cell )
##################
## PlaceCentric ##
##################
def PlaceCentric ( instance ) :
global CELLS
from st_model import CELLS
cell = CELLS[-1]
pyPlaceCentric ( cell._hur_cell, instance._hur_instance )
######################
## AlimVerticalRail ##
######################
def AlimVerticalRail ( coordonnee ) :
global CELLS
from st_model import CELLS
cell = CELLS[-1]
pyAlimVerticalRail ( cell._hur_cell, coordonnee )
########################
## AlimHorizontalRail ##
########################
def AlimHorizontalRail ( coordonnee ) :
global CELLS
from st_model import CELLS
cell = CELLS[-1]
pyAlimHorizontalRail ( cell._hur_cell, coordonnee )
####################
## AlimConnectors ##
####################
def AlimConnectors () :
global CELLS
from st_model import CELLS
cell = CELLS[-1]
pyAlimConnectors ( cell._hur_cell )
#############
## RouteCk ##
#############
def RouteCk ( net ) :
global CELLS
from st_model import CELLS
cell = CELLS[-1]
pyRouteCk ( cell._hur_cell, net._hur_net[0] )
#################
## GlobalRoute ##
#################
def GlobalRoute ( cell = None ):
if not cell:
global CELLS
from st_model import CELLS
cell = CELLS[-1]
if isinstance ( cell, Model ): # FIXME : a changer, mettre toujours un model et faire utiliser aux etudiants de l'annee prochaine getModel
pyGlobalRoute ( cell._hur_cell )
if isinstance ( cell, Inst ):
pyGlobalRoute ( cell._st_masterCell._hur_cell )
return
###################
## DetailRoute ##
###################
def DetailRoute ( cell = None ):
if not cell:
global CELLS
from st_model import CELLS
cell = CELLS[-1]
if isinstance ( cell, Model ) : # FIXME : a changer, mettre toujours un model et faire utiliser aux etudiants de l'annee prochaine getModel
pyDetailRoute ( cell._hur_cell )
if isinstance ( cell, Inst ) :
pyDetailRoute ( cell._st_masterCell._hur_cell )
return
##########################
## TimingStaticAnalysis ##
##########################
#def TimingStaticAnalysis ( cell = None ):
# if not cell:
# global CELLS
# from st_model import CELLS
#
# cell = CELLS[-1]
#
# if isinstance ( cell, Model ): # FIXME : a changer, mettre toujours un model et faire utiliser aux etudiants de l'annee prochaine getModel
# pyTimingStaticAnalysis ( cell._hur_cell )
# if isinstance ( cell, Inst ):
# pyTimingStaticAnalysis ( cell._st_masterCell._hur_cell )
# return
##############
## PadNorth ##
##############
def PadNorth ( *args ) :
global CELLS
from st_model import CELLS
cell = CELLS[-1]
hur_core = cell.getCore()
hur_args = []
for arg in args :
if not arg :
raise "\n[Stratus ERROR] PadNorth : one instance doesn't exist.\n"
if str ( arg.__class__ ) != "st_instance.Inst" :
raise "\n[Stratus ERROR] PadNorth : one argument is not an instance.\n"
hur_args.append ( arg._hur_instance )
pyPadNorth ( cell._hur_cell, hur_core, hur_args )
##############
## PadSouth ##
##############
def PadSouth ( *args ) :
global CELLS
from st_model import CELLS
cell = CELLS[-1]
hur_core = cell.getCore()
hur_args = []
for arg in args :
if not arg :
raise "\n[Stratus ERROR] PadSouth : one instance doesn't exist.\n"
if str ( arg.__class__ ) != "st_instance.Inst" :
raise "\n[Stratus ERROR] PadSouth : one argument is not an instance.\n"
hur_args.append ( arg._hur_instance )
pyPadSouth ( cell._hur_cell, hur_core, hur_args )
#############
## PasEast ##
#############
def PadEast ( *args ) :
global CELLS
from st_model import CELLS
cell = CELLS[-1]
hur_core = cell.getCore()
hur_args = []
for arg in args :
if not arg :
raise "\n[Stratus ERROR] PadEast : one instance doesn't exist.\n"
if str ( arg.__class__ ) != "st_instance.Inst" :
raise "\n[Stratus ERROR] PadEast : one argument is not an instance.\n"
hur_args.append ( arg._hur_instance )
pyPadEast ( cell._hur_cell, hur_core, hur_args )
#############
## PadWest ##
#############
def PadWest ( *args ) :
global CELLS
from st_model import CELLS
cell = CELLS[-1]
hur_core = cell.getCore()
hur_args = []
for arg in args :
if not arg :
raise "\n[Stratus ERROR] PadWest : one instance doesn't exist.\n"
if str ( arg.__class__ ) != "st_instance.Inst" :
raise "\n[Stratus ERROR] PadWest : one argument is not an instance.\n"
hur_args.append ( arg._hur_instance )
pyPadWest ( cell._hur_cell, hur_core, hur_args )
###############
## PowerRing ##
###############
def PowerRing ( n ) :
global CELLS
from st_model import CELLS
cell = CELLS[-1]
if n < 3 : raise "\n[Stratus ERROR] : PowerRing : must have at least 3 pairs of vdd/vss rings\n"
hur_core = cell.getCore()
pyPowerRing ( cell._hur_cell, hur_core, n )
#################
## ClockBuffer ##
#################
class ClockBuffer :
def __init__ ( self, netname ) :
global CELLS
from st_model import CELLS
global nbCkBuf
self.cell = CELLS[-1]
self.net = self.cell._hur_cell.getNet ( netname )
self.ck_b = Signal ( "ck_b%d"%nbCkBuf, 1 )
modelMasterCell = CRL.AllianceFramework.get().getCell ( "buf_x2", CRL.Catalog.State.Views )
if not modelMasterCell :
err = "Stratus Error : ClockBuffer : Cannot find model cell : buf_x2 in database !\n"
raise err
inst = Instance ( self.cell._hur_cell, "ck_buffer%d"%nbCkBuf, modelMasterCell )
nbCkBuf += 1
##### Connection #####
plugI = inst.getPlug ( modelMasterCell.getNet ( "i" ) )
plugI.setNet ( self.net )
plugQ = inst.getPlug ( modelMasterCell.getNet ( "q" ) )
plugQ.setNet ( self.ck_b._hur_net[0] )
plugGround = inst.getPlug ( iter(modelMasterCell.getGroundNets()).next() )
plugGround.setNet ( iter(self.cell._hur_cell.getGroundNets()).next() )
plugPower = inst.getPlug ( iter(modelMasterCell.getPowerNets()).next() )
plugPower.setNet ( iter(self.cell._hur_cell.getPowerNets()).next() )
def AddFF ( self, netname ) :
net = self.cell._hur_cell.getNet ( netname )
if not net :
err = "AddFF Error net : " + netname + " not found"
raise err
instDrive = None
for plug in net.getPlugs():
if plug.getMasterNet().getDirection() == DirectionOUT :
instDrive = plug.getInstance()
break
if instDrive == None :
err = "AddFF Error no drive instance found for net " + netname + ".\n"
raise err
masterCell = instDrive.getMasterCell()
## ici il vaudrait mieux faire une recherche sur l'ensemble des plugs de l'instDrive et trouver celle accrochee au self.net ##
netCk = masterCell.getNet ( "ck" )
if instDrive.getPlug ( netCk ).getNet() != self.net :
err = "Stratus Error : AddFF : driver Instance of net " + netname + " is not connected to signal " + str ( self.net.getName() ) + ".\n"
raise err
instDrive.getPlug ( netCk ).setNet ( self.ck_b._hur_net[0] )