Esempio n. 1
0
def loadStyles ( stylesTable, fromFile ):
    global displayFile
    displayFile = fromFile

    try:
        # Check for three levels of tuple for a correct <styleTable>.
        if not isinstance(stylesTable,tuple):
            raise ErrorMessage(1,['Malformed <styleTable>, not even a one level deep tuple.'])
        if not isinstance(stylesTable[0],tuple):
            raise ErrorMessage(1,['Malformed <styleTable>, only two level deep tuple.'])

        for styleTuple in stylesTable:
            loadStyleTuple( styleTuple )
    except Exception as e:
        styleTableExample = [ 'Should be a three level deep tuple:'
                            ,'  ( ( (Style, id, description)'
                            ,'    , (Entry1, ...)'
                            ,'    , (Entry2, ...)'
                            ,'    , (EntryN, ...)'
                            ,'    )'
                            ,'  ,)'
                            ,'If only one style is defined, do not forget the last extra comma.'
                            ,'(putting a level of parenthesis do not create a tuple for one item)'
                            ,'In %s:<styleTable>.' % displayFile
                            ]
        ErrorMessage.wrapPrint(e, styleTableExample)
    return
Esempio n. 2
0
def loadGdsLayers ( realLayersTable, confFile ):
    realFile   = confFile
    technology = DataBase.getDB().getTechnology()

    entryNo = 0
    for entry in realLayersTable:
        entryNo += 1

        try:
            if len(entry) != 3:
                raise ErrorMessage(1,['Malformed entry in <realLayersTable>.'
                                     ,'Must have exactly three fields: (symb_name,real_name,GDSII_extnb).'
                                     ,str(entry)
                                     ])
            symbName, realName, gdsiiExtractNumber = entry
            if not isinstance(gdsiiExtractNumber,int):
                raise ErrorMessage(1,['Incoherency in <realLayersTable> entry.'
                                     ,'GDSII exctract number is not of int type (%s).' \
                                          % helpers.stype(gdsiiExtractNumber)
                                     ,str(entry)
                                     ])

            basicLayer = technology.getBasicLayer(symbName)
            if not basicLayer:
                raise ErrorMessage(1,['Incoherency in <realLayersTable> entry.'
                                     ,'The real layer "%s" associated to the GDSII "%s" do not exists.' \
                                          % (symbName,realName)
                                     ,str(entry)
                                     ])
            basicLayer.setRealName     ( realName )
            basicLayer.setExtractNumber( gdsiiExtractNumber )

        except Exception, e:
            ErrorMessage.wrapPrint(e,'In %s:<realLayersTable> at index %d.' % (realFile,entryNo))
Esempio n. 3
0
def loadCellGaugesTable(cellGaugesTable, fromFile):
    global allianceFile
    allianceFile = fromFile

    af = AllianceFramework.get()

    for gaugeName in cellGaugesTable.keys():
        gaugeDatas = cellGaugesTable[gaugeName]
        gauge = None

        try:
            if len(gaugeDatas) != 4:
                raise ErrorMessage(1, [
                    'Malformed gaugeDatas in <cellGaugesTable[%s]>.' %
                    gaugeName,
                    'Parameters list must have exactly four fields:',
                    '  (terminal_metal, xy_common_pitch, slice_height, slice_step)',
                    str(gaugeDatas)
                ])
            gauge = CellGauge.create(
                gaugeName,
                gaugeDatas[0]  # pinLayerName.
                ,
                DbU.fromLambda(gaugeDatas[1])  # pitch.
                ,
                DbU.fromLambda(gaugeDatas[2])  # sliceHeight.
                ,
                DbU.fromLambda(gaugeDatas[3])  # sliceStep.
            )
        except Exception, e:
            ErrorMessage.wrapPrint(
                e, 'In %s:<cellGaugesTable> at index %d.' %
                (allianceFile, gaugeDatasNo))

        if gauge: af.addCellGauge(gauge)
Esempio n. 4
0
def loadRoutingGaugesTable(routingGaugesTable, fromFile):
    global allianceFile
    allianceFile = fromFile

    af = AllianceFramework.get()

    for gaugeName in routingGaugesTable.keys():
        gaugeDatas = routingGaugesTable[gaugeName]

        technology = DataBase.getDB().getTechnology()
        gauge = RoutingGauge.create(gaugeName)

        entryNo = 0
        for entry in gaugeDatas:
            entryNo += 1

            try:
                if len(entry) != 2:
                    raise ErrorMessage(1, [
                        'Malformed entry in <routingGaugesTable[%s]>.' %
                        gaugeName,
                        'Must have exactly two fields ("METAL_LAYER", (parameters_list)).',
                        str(entry)
                    ])
                if len(entry[1]) != 8:
                    raise ErrorMessage(1, [
                        'Malformed entry in <routingGaugesTable[%s]>.' %
                        gaugeName,
                        'Parameters list must have exactly eight fields:',
                        '  (direction, type, depth, density, offset, pitch, wire_width, via_width)',
                        str(entry)
                    ])

                gauge.addLayerGauge(
                    RoutingLayerGauge.create(
                        technology.getLayer(entry[0]),
                        Gauge.toRlGauge(entry[1][0])  # Direction. 
                        ,
                        Gauge.toRlGauge(entry[1][1])  # Type.
                        ,
                        entry[1][2]  # Depth.
                        ,
                        entry[1][3]  # Density.
                        ,
                        DbU.fromLambda(entry[1][4])  # Offset.
                        ,
                        DbU.fromLambda(entry[1][5])  # Pitch.
                        ,
                        DbU.fromLambda(entry[1][6])  # Wire width.
                        ,
                        DbU.fromLambda(entry[1][7])  # Via width.
                    ))

            except Exception, e:
                ErrorMessage.wrapPrint(
                    e, 'In %s:<routingGaugesTable> at index %d.' %
                    (allianceFile, entryNo))

        af.addRoutingGauge(gauge)
Esempio n. 5
0
def loadViewerConfig ( viewerConfig, confFile ):
    global symbolicFile
    symbolicFile = confFile
    try:
        if 'precision' in viewerConfig: DbU.setPrecision(viewerConfig['precision'])
    except Exception as e:
        ErrorMessage.wrapPrint(e,'In %s:<viewerConfig>.')
    return
Esempio n. 6
0
def loadViewerConfig(viewerConfig, confFile):
    global symbolicFile
    symbolicFile = confFile
    try:
        if viewerConfig.has_key('precision'):
            DbU.setPrecision(viewerConfig['precision'])
    except Exception, e:
        ErrorMessage.wrapPrint(e, 'In %s:<viewerConfig>.')
Esempio n. 7
0
def loadSymbolicRules ( symbolicRulesTable, confFile ):
    global symbolicFile
    symbolicFile = confFile
    technology   = DataBase.getDB().getTechnology()

    entryNo = 0
    for rule in symbolicRulesTable:
        entryNo += 1

        try:
            if len(rule) != 2:
                raise ErrorMessage(1,['Malformed entry in <symbolicRulesTable>.'
                                     ,'Must contains exactly two fields: ( rule_path, value ).'
                                     ,str(rule)
                                     ])
            if not isinstance(rule[1],int) and not isinstance(rule[1],float):
                raise ErrorMessage(1,['Invalid entry in <symbolicRulesTable>.'
                                     ,'Rule value must be of integer or float type.'
                                     ,str(rule)
                                     ])

            value    = DbU.fromLambda(rule[1])
            elements = rule[0].split('.')
            if len(elements) < 3:
                raise ErrorMessage(1,['Invalid entry in <symbolicRulesTable>.'
                                     ,'Rule name must contains at least three components: \"LAYER.category.dimension\".'
                                     ,str(rule)
                                     ])

            ruleLayer = layersLUT.lookup( elements[0], LayersLUT.Symbolic|LayersLUT.MissingError  )
            subLayer  = layersLUT.lookup( elements[1], LayersLUT.Real )

            if subLayer: ruleTag  = ".".join(elements[2:])
            else:        ruleTag  = ".".join(elements[1:])

            if   ruleTag == 'extention.cap':   ruleLayer.setExtentionCap  ( subLayer, value )
            elif ruleTag == 'extention.width': ruleLayer.setExtentionWidth( subLayer, value )
            elif ruleTag == 'enclosure':       ruleLayer.setEnclosure     ( subLayer, value )
            elif ruleTag == 'minimum.width':   ruleLayer.setMinimalSize   ( value )
            elif ruleTag == 'minimum.side':    ruleLayer.setMinimalSize   ( value )
            else: 
                raise ErrorMessage(1,['Invalid entry in <symbolicRulesTable>.'
                                     ,'Unknown rule kind: \".%s\", should be any of:' % ruleTag
                                     ,'    * "RULE_HEAD.extention.cap"'
                                     ,'    * "RULE_HEAD.extention.width"'
                                     ,'    * "RULE_HEAD.enclosure"'
                                     ,'    * "RULE_HEAD.minimum.width"'
                                     ,'    * "RULE_HEAD.minimum.side"'
                                     ,str(rule)
                                     ])

        except Exception as e:
            ErrorMessage.wrapPrint(e,'In %s:<symbolicRulesTable> at index %d.' % (symbolicFile,entryNo))
    return
Esempio n. 8
0
def loadWorkingLayers ( workingLayersTable, confFile ):
    global symbolicFile
    symbolicFile = confFile
    technology   = DataBase.getDB().getTechnology()

    entryNo = 0
    for layerName in workingLayersTable:
        entryNo += 1
        try:
           # This call is just to generate an error if the layer is non-existent.
            layersLUT.lookup(layerName,LayersLUT.Real|LayersLUT.Symbolic|LayersLUT.MissingError)
            technology.setWorkingLayer(layerName)
        except Exception as e:
            ErrorMessage.wrapPrint(e,'In %s:<symbolicRulesTable> at index %d.' % (symbolicFile,entryNo))
    return
Esempio n. 9
0
def _loadAllianceConfig ( af, allianceConfig ):
    env = af.getEnvironment()

    entryNo = 0
    for entry in allianceConfig:
        entryNo += 1

        try:
            if len(entry) != 2:
                raise ErrorMessage(1,['Malformed entry in <allianceConfig>.'
                                     ,'Must have exactly two fields ("key", <value>).'
                                     ,str(entry)
                                     ])

            key, value = entry
            if key == 'DISPLAY':             env.setDISPLAY(value)
            if key == 'CATALOG':             env.setCATALOG(value)
            if key == 'SCALE_X':             env.setSCALE_X(value)
            if key == 'IN_LO':               env.setIN_LO(value)
            if key == 'IN_PH':               env.setIN_PH(value)
            if key == 'OUT_PH':              env.setOUT_PH(value)
            if key == 'OUT_LO':              env.setOUT_LO(value)
            if key == 'POWER':               env.setPOWER(value)
            if key == 'GROUND':              env.setGROUND(value)
            if key == 'CLOCK':               env.setCLOCK(value)
            if key == 'BLOCKAGE':            env.setBLOCKAGE(value)
            if key == 'PAD':                 env.setPad(value)
            if key == 'WORKING_LIBRARY':     env.setWORKING_LIBRARY(value)
            if key == 'SYSTEM_LIBRARY':
                for libraryEntry in value:
                    if len(libraryEntry) != 2:
                        raise ErrorMessage(1,['Malformed system library entry in <allianceConfig>.'
                                             ,'Must have exactly two fields ("path", <mode>).'
                                             ,str(libraryEntry)
                                             ])
                    libPath, mode = libraryEntry
                    env.addSYSTEM_LIBRARY(library=libPath,mode=AddMode.toEnvironment(mode))

        except Exception as e:
            ErrorMessage.wrapPrint(e,'In %s:<Alliance> at index %d.' % (allianceFile,entryNo))
    try:
        env.validate()
    except Exception as e:
        ErrorMessage.wrapPrint(e,'In %s:<Alliance>.' % (allianceFile))
        sys.exit(1)
    return
Esempio n. 10
0
    def load(self, allianceConfig, allianceFile):
        entryNo = 0
        for entry in allianceConfig:
            entryNo += 1

            try:
                if len(entry) != 2:
                    raise ErrorMessage(1, [
                        'Malformed entry in <allianceConfig>.',
                        'Must have exactly two fields ("key", <value>).',
                        str(entry)
                    ])

                key, value = entry
                if key == 'ALLIANCE_TOP': self.mbkEnv[key] = value
                if key == 'GRAAL_TECHNO_NAME': self.mbkEnv[key] = value
                if key == 'RDS_TECHNO_NAME': self.mbkEnv[key] = value
                if key == 'CATALOG': self.mbkEnv[key] = value
                if key == 'SCALE_X': self.mbkEnv[key] = value
                if key == 'IN_LO': self.mbkEnv[key] = value
                if key == 'IN_PH': self.mbkEnv[key] = value
                if key == 'OUT_PH': self.mbkEnv[key] = value
                if key == 'OUT_LO': self.mbkEnv[key] = value
                if key == 'POWER': self.mbkEnv[key] = value
                if key == 'GROUND': self.mbkEnv[key] = value
                if key == 'MBK_TARGET_LIB': self.mbkEnv[key] = value
                if key == 'WORKING_LIBRARY': self.mbkEnv[key] = value
                if key == 'SYSTEM_LIBRARY':
                    for libraryEntry in value:
                        if len(libraryEntry) != 2:
                            raise ErrorMessage(1, [
                                'Malformed system library entry in <allianceConfig>.',
                                'Must have exactly two fields ("path", <mode>).',
                                str(libraryEntry)
                            ])
                        libPath, mode = libraryEntry
                        self.mbkEnv['MBK_CATA_LIB'].add(libPath, mode)

            except Exception as e:
                ErrorMessage.wrapPrint(
                    e,
                    'In %s:<Alliance> at index %d.' % (allianceFile, entryNo))

        self.mbkEnv['LD_LIBRARY_PATH'] = self.mbkEnv['ALLIANCE_TOP'] + '/lib'
        return
Esempio n. 11
0
def loadTechnoConfig (  technoConfig, confFile ):
    realFile   = confFile
    technology = DataBase.getDB().getTechnology()

    gridValue = 1
    gridUnit  = DbU.UnitPowerMicro
    for key in [ 'gridUnit', 'gridValue', 'gridsPerLambda' ]:
        try:
            if key == 'gridUnit':
                if key in technoConfig:
                    gridUnit = technoConfig[key]
                    if gridUnit != DbU.UnitPowerPico  and \
                       gridUnit != DbU.UnitPowerNano  and \
                       gridUnit != DbU.UnitPowerMicro and \
                       gridUnit != DbU.UnitPowerMilli and \
                       gridUnit != DbU.UnitPowerUnity and \
                       gridUnit != DbU.UnitPowerKilo:
                        raise ErrorMessage(1,'In <technoConfig>, invalid DbU unit power for gridUnit, reseting to Micro.')
                else:
                    raise ErrorMessage(1,'<technoConfig> has no <gridUnit> defined, assuming Micro.')

            elif key == 'gridValue':
                if 'gridValue' in technoConfig:
                    gridValue = technoConfig['gridValue']
                    if not isinstance(gridUnit,float) and not isinstance(gridUnit,int):
                        raise ErrorMessage(1,['In <technoConfig>, <gridValue> must be of type float (and not: %s).'
                                              % helpers.stype(gridValue)
                                             ])
                    DbU.setPhysicalsPerGrid(gridValue,gridUnit)
                else:
                    raise ErrorMessage(1,'<technoConfig> has no <gridValue> defined.')
    
            elif key == 'gridsPerLambda':
                if 'gridsPerLambda' in technoConfig:
                    gridsPerLambda = technoConfig['gridsPerLambda']
                    if not isinstance(gridsPerLambda,int):
                        raise ErrorMessage(1,['In <technoConfig>, <gridsPerLambda> must be of type int (and not: %s).'
                                            % helpers.stype(gridsPerLambda)
                                           ])
                    DbU.setGridsPerLambda(gridsPerLambda)
    
        except Exception as e:
            ErrorMessage.wrapPrint(e)
    return
Esempio n. 12
0
def loadPatterns(patternsData, fromFile):
    global patternsLUT
    global confFile
    confFile = fromFile

    entryNo = 0
    for entry in patternsData:
        entryNo += 1

        try:
            if not isinstance(entry, dict):
                raise ErrorMessage(1, [
                    'Malformed entry in <patternsTable>.',
                    'Not a dictionary {\'key1\':\'value1\', ...}.',
                    str(entry)
                ])

            if 'name' not in entry:
                raise ErrorMessage(1, [
                    'Malformed entry in <patternsTable>.',
                    'Pattern has no \'name\' key.',
                    str(entry)
                ])
            arguments = {'name': entry['name']}

            if 'bits' in entry:
                arguments['bits'] = entry['bits']

            if 'hexa' in entry:
                if 'bits' in entry:
                    w = WarningMessage(
                        'Pattern <%s> has both bits & hexa, ignoring hexa.' %
                        entry['name'])
                    print(w)
                else:
                    arguments['hexa'] = entry['hexa']

            patternsLUT[entry['name']] = Pattern(**arguments)

        except Exception as e:
            ErrorMessage.wrapPrint(
                e, 'In %s:<patternsTable> at index %d.' % (confFile, entryNo))
    return
Esempio n. 13
0
def loadRealLayers(realLayersTable, confFile):
    global symbolicFile
    symbolicFile = confFile
    technology = DataBase.getDB().getTechnology()

    entryNo = 0
    for entry in realLayersTable:
        entryNo += 1

        try:
            if len(entry) < 2:
                raise ErrorMessage(1, [
                    'Malformed entry in <realLayersTable>.',
                    'Less than two fields: missing name and/or material.',
                    str(entry)
                ])
            if len(entry) > 2:
                if entry[1] != BasicLayer.Material.blockage:
                    raise ErrorMessage(1, [
                        'Invalid entry in <realLayersTable>.',
                        'Only blockage material can have a third field.',
                        str(entry)
                    ])
                routingLayer = technology.getBasicLayer(entry[2])
                if not routingLayer:
                    raise ErrorMessage(1, [
                        'Incoherency in <realLayersTable> entry at.',
                        'The metal <%s> associated to the blockage doesn\'t exist (yet?).'
                        % entry[2],
                        str(entry)
                    ])

            basicLayer = BasicLayer.create(technology, entry[0],
                                           BasicLayer.Material(entry[1]))
            layersLUT.add(basicLayer)
            if len(entry) > 2:
                routingLayer.setBlockageLayer(basicLayer)

        except Exception, e:
            ErrorMessage.wrapPrint(
                e, 'In %s:<symbolicLayersTable> at index %d.' %
                (symbolicFile, entryNo))
Esempio n. 14
0
                        raise ErrorMessage(1, [
                            'Malformed system library entry in <allianceConfig>.',
                            'Must have exactly two fields ("path", <mode>).',
                            str(libraryEntry)
                        ])
                    libPath, mode = libraryEntry
                    env.addSYSTEM_LIBRARY(library=libPath,
                                          mode=AddMode.toEnvironment(mode))

        except Exception, e:
            ErrorMessage.wrapPrint(
                e, 'In %s:<Alliance> at index %d.' % (allianceFile, entryNo))
    try:
        env.validate()
    except Exception, e:
        ErrorMessage.wrapPrint(e, 'In %s:<Alliance>.' % (allianceFile))
        sys.exit(1)
    return


def loadRoutingGaugesTable(routingGaugesTable, fromFile):
    global allianceFile
    allianceFile = fromFile

    af = AllianceFramework.get()

    for gaugeName in routingGaugesTable.keys():
        gaugeDatas = routingGaugesTable[gaugeName]

        technology = DataBase.getDB().getTechnology()
        gauge = RoutingGauge.create(gaugeName)
Esempio n. 15
0
def loadParameters(parametersData, fromFile):
    global confFile
    confFile = fromFile

    entryNo = 0
    for entry in parametersData:
        entryNo += 1

        try:
            if len(entry) < 3:
                raise ErrorMessage(1, [
                    'Malformed entry in <parametersTable>.',
                    'Less than three fields: (path_name, Type, default_value [,options]).',
                    str(entry)
                ])
            if len(entry) == 3:
                pathName, paramType, value = entry
                options = None
            elif len(entry) == 4:
                pathName, paramType, value, options = entry
            else:
                raise ErrorMessage(1, [
                    'Malformed entry in <parametersTable>.',
                    'More than four fields: (path_name, Type, default_value [,options]).',
                    str(entry)
                ])

            if paramType == TypeBool:
                param = Cfg.getParamBool(pathName)
                param.setBool(value)
            if paramType == TypeInt:
                param = Cfg.getParamInt(pathName)
                param.setInt(value)
            if paramType == TypeEnumerate:
                param = Cfg.getParamEnumerate(pathName)
                param.setInt(value)
            if paramType == TypePercentage:
                param = Cfg.getParamPercentage(pathName)
                param.setPercentage(value)
            if paramType == TypeDouble:
                param = Cfg.getParamDouble(pathName)
                param.setDouble(value)
            if paramType == TypeString:
                param = Cfg.getParamString(pathName)
                param.setString(value)

            if options and param:
                for key in options.keys():
                    if key == 'min': param.setMin(options[key])
                    elif key == 'max': param.setMax(options[key])
                    elif key == 'values':
                        for name, value in options[key]:
                            param.addValue(name, value)
                    elif key == 'slaves':
                        for slave in options[key]:
                            param.addSlave(slave)
                    elif key == 'flags':
                        param.flags = options[key]

        except Exception, e:
            ErrorMessage.wrapPrint(
                e,
                'In %s:<parametersTable> at index %d.' % (confFile, entryNo))
Esempio n. 16
0
def loadLayout(layoutData, fromFile):
    global confFile
    confFile = fromFile

    layout = Cfg.Configuration.get().getLayout()
    tabName = None

    entryNo = 0
    for entry in layoutData:
        entryNo += 1

        try:
            if not isinstance(entry, tuple):
                raise ErrorMessage(1, [
                    'Malformed entry in <layoutTable>.',
                    'Not a tuple (a, b, c, ...) or (a,).',
                    str(entry)
                ])
            if entry[0] == TypeTab:
                if len(entry) != 3:
                    raise ErrorMessage(1, [
                        'Malformed entry in <layoutTable>.',
                        'Tab must have exactly three fields: (TypeTab, tab_name, tag).',
                        str(entry)
                    ])
                layoutType, tabName, tagName = entry
                layout.addTab(tabName, tagName)

            if not tabName:
                raise ErrorMessage(1, [
                    'Bad entry order in <layoutTable>.',
                    'First entry must be of Tab type.'
                ])

            if entry[0] == TypeTitle:
                if len(entry) != 2:
                    raise ErrorMessage(1, [
                        'Malformed entry in <layoutTable>.',
                        'Title must have exactly two fields: (TypeTitle, title).',
                        str(entry)
                    ])
                layoutType, title = entry
                layout.addTitle(tabName, title)
            elif entry[0] == TypeSection:
                if len(entry) != 3:
                    raise ErrorMessage(1, [
                        'Malformed entry in <layoutTable>.',
                        'Section must have exactly three fields: (TypeSection, section, column).',
                        str(entry)
                    ])
                layoutType, section, column = entry
                layout.addSection(tabName, section, column)
            elif entry[0] == TypeRule:
                if len(entry) != 1:
                    raise ErrorMessage(1, [
                        'Malformed entry in <layoutTable>.',
                        'Rule must have exactly one fields: (TypeRule,).',
                        str(entry)
                    ])
                layout.addRule(tabName)
            elif entry[0] == TypeOption:
                if len(entry) < 4:
                    raise ErrorMessage(1, [
                        'Malformed entry in <layoutTable>.',
                        'Option must have at least four fields: (TypeOption,path_name,text,column[,span,flags]).',
                        str(entry)
                    ])
                if len(entry) == 4:
                    layoutType, pathName, text, column = entry
                    layout.addParameter(tabName, pathName, text, column)
                elif len(entry) == 5:
                    layoutType, pathName, text, column, span = entry
                    layout.addParameter(tabName, pathName, text, column, span)
                elif len(entry) == 6:
                    layoutType, pathName, text, column, span, flags = entry
                    layout.addParameter(tabName, pathName, text, column, span,
                                        flags)

        except Exception, e:
            ErrorMessage.wrapPrint(
                e, 'In %s:<layoutTable> at index %d.' % (confFile, entryNo))
Esempio n. 17
0
def loadStyleTuple ( styleTuple ):
    style = None
    group = 'NoGroup'

    entryNo = 0
    for styleEntry in styleTuple:
        entryNo += 1
    
        try:
            if styleEntry[0] == Style:
                if len(styleEntry) != 3:
                    raise ErrorMessage(1,['Malformed entry in <styleTable>.'
                                         ,'Style must have exactly three fields: (Style,id,description).'
                                         ,str(styleEntry)
                                         ])
                styleType, styleId, description = styleEntry

                if not isinstance(styleId,str):
                    raise ErrorMessage(1,['The second Style field, <id> must be a string, not a %s.' % helpers.stype(styleId)
                                         ,str(styleEntry)])
                if not isinstance(description,str):
                    raise ErrorMessage(1,['The third Style field, <description> must be a string, not a %s.' % helpers.stype(styleId)
                                         ,str(styleEntry)])

                style = Viewer.DisplayStyle(styleId)
                style.setDescription(description)
    
            if not style:
                raise ErrorMessage(1,['Bad entry order in <styleTable>.'
                                     ,'First entry must be of Style type.'
                                     ])
    
            if styleEntry[0] == Inherit:
                if len(styleEntry) != 2:
                    raise ErrorMessage(1,['Malformed entry in <didplayTable>.'
                                         ,'Inherit must have exactly two fields: (Inherit,id).'
                                         ,str(styleEntry)
                                         ])
                styleType, styleId = styleEntry
                if not isinstance(styleId,str):
                    raise ErrorMessage(1,['The second Inherit field, <id> must be a string, not a %s.' % helpers.stype(styleId)
                                         ,str(styleEntry)])
                style.inheritFrom(styleId)
    
            if styleEntry[0] == Darkening:
                if len(styleEntry) != 4:
                    raise ErrorMessage(1,['Malformed entry in <didplayTable>.'
                                         ,'Darkening (HSV color) must have exactly four fields: (Darkening,hue,value,saturation).'
                                         ,str(styleEntry)
                                         ])
                styleType, hue, value, saturation = styleEntry
                if not isinstance(hue       ,float) or \
                   not isinstance(value     ,float) or \
                   not isinstance(saturation,float) :
                    raise ErrorMessage(1,['<hue>, <val> & <sat> fields of Darkening must be floats.'
                                         ,'%s is (Type, %s, %s, %s)' % (str(styleEntry)
                                                                       ,helpers.stype(hue)
                                                                       ,helpers.stype(value)
                                                                       ,helpers.stype(saturation))
                                         ])
                style.setDarkening(Viewer.DisplayStyle.HSVr( hue, value, saturation ))
    
            elif styleEntry[0] == Group:
                if len(styleEntry) != 2:
                    raise ErrorMessage(1,['Malformed entry in <styleTable>.'
                                         ,'Group must have exactly two fields: (Group,group).'
                                         ,str(styleEntry)
                                         ])
                styleType, group = styleEntry
                if not isinstance(group,str):
                    raise ErrorMessage(1,['The second Group field, <group> must be a string, not a %s.' % helpers.stype(group)
                                         ,str(styleEntry)])
    
            elif styleEntry[0] == Drawing:
                if len(styleEntry) != 3:
                    raise ErrorMessage(1,['Malformed entry in <styleTable>.'
                                         ,'Rule must have exactly three fields: (Drawing,dname,{dict}).'
                                         ,str(styleEntry)
                                         ])
                styleType, name, options = styleEntry
                arguments = { 'group':group, 'name':name }
                for key in list(options.keys()):
                    if key == 'color':
                        arguments[key] = checkColor(options[key])
                        continue
                    elif key == 'border': checkAttribute(options,'border',int)
                    elif key == 'pattern':
                        if options[key] in patternsLUT:
                            arguments[key] = patternsLUT[ options[key] ].hexa
                            continue
                        pass
                    elif key == 'threshold': checkAttribute(options,'threshold',float)
                    elif key == 'goMatched': checkAttribute(options,'goMatched',bool)
                    else:
                        w = WarningMessage( ['Unknown Drawing option: <%s>' % key
                                            ,'In %s:<styleTable>:"%s" at index %d.' \
                                                 % (displayFile,style.getName(),entryNo)] )
                        print(w)
                        continue
                    arguments[key] = options[key]
                style.addDrawingStyle( **arguments )
    
        except Exception as e:
            if style:
                footer = 'In %s:<styleTable>:"%s" at index %d.' % (displayFile,style.getName(),entryNo)
            else:
                footer = 'In %s:<styleTable> at index %d.' % (displayFile,entryNo)
            ErrorMessage.wrapPrint(e,footer)
            if not style: break

    if style != None:
        Viewer.Graphics.addStyle( style )
    return
Esempio n. 18
0
def loadSymbolicLayers ( symbolicLayersData, confFile ):
    global symbolicFile
    symbolicFile = confFile
    technology   = DataBase.getDB().getTechnology()

    entryNo = 0
    for entry in symbolicLayersData:
        entryNo += 1

        try:
            if len(entry) != 3:
                raise ErrorMessage(1,['Malformed entry in <symbolicLayersTable>.'
                                     ,'Must contains exactly three fields: ( name, type, (real_layers,) ).'
                                     ,str(entry)
                                     ])
            name, layerType, realLayers = entry

            if not isinstance(layerType,SymbolicLayerType):
                raise ErrorMessage(1,['Invalid entry in <symbolicLayersTable>.'
                                     ,'The layer type code is not valid, should be any of:'
                                     ,'    * TypeRegular'
                                     ,'    * TypeDiffusion'
                                     ,'    * TypeTransistor'
                                     ,'    * TypeContact'
                                     ,'    * TypeVia'
                                     ,str(entry)
                                     ])
            if layerType.realLayerLength() != len(realLayers):
                raise ErrorMessage(1,['Invalid entry in <symbolicLayersTable>.'
                                     ,'Layer of type <%s> contains %d real layers instead of %d.' \
                                          % (layerType,len(realLayers),layerType.realLayerLength())
                                     ,str(entry)
                                     ])

            realLayersArgs = []
            for layerName in realLayers:
                if layerName:
                    realLayersArgs += [ layersLUT.lookup(layerName
                                                        ,LayersLUT.Real
                                                        |LayersLUT.Symbolic
                                                        |LayersLUT.MissingError) ]
                else:
                    realLayersArgs += [ None ]
    
            symbolicLayer = None
    
            if layerType == TypeRegular:
                symbolicLayer = RegularLayer.create(technology,entry[0])
                symbolicLayer.setBasicLayer( *realLayersArgs )
            elif layerType == TypeDiffusion:
                symbolicLayer = DiffusionLayer.create(technology ,entry[0], *realLayersArgs)
            elif layerType == TypeTransistor:
                symbolicLayer = TransistorLayer.create(technology ,entry[0], *realLayersArgs)
            elif layerType == TypeContact:
                symbolicLayer = ContactLayer.create(technology ,entry[0], *realLayersArgs)
            elif layerType == TypeVia:
                symbolicLayer = ViaLayer.create(technology ,entry[0], *realLayersArgs)
    
            layersLUT.add( symbolicLayer )

        except Exception as e:
            ErrorMessage.wrapPrint(e,'In %s:<symbolicLayersTable> at index %d.' % (symbolicFile,entryNo))
    return