blob: c47dd46a7895f26d1deb7e8b3d9ddfdfb544087b [file] [log] [blame]
# -------------------------------------------------------------------------------
# util.py
#
# utility functions for Pyverilog
#
# Copyright (C) 2013, Shinya Takamaeda-Yamazaki
# License: Apache 2.0
# -------------------------------------------------------------------------------
from __future__ import absolute_import
from __future__ import print_function
import sys
import os
import copy
from pyverilog.utils.scope import ScopeLabel, ScopeChain
def toTermname(name):
if isinstance(name, str):
return toTermname_str(name)
if isinstance(name, list):
return toTermname_list(name)
if isinstance(name, tuple):
return toTermname_list(name)
raise TypeError()
def toTermname_str(name):
scopechain_list = []
for n in name.split('.'):
# fix me: to support "module.scope.signal[ptr]", lexical analyzer is required.
scopechain_list.append(ScopeLabel(n, 'any'))
return ScopeChain(scopechain_list)
def toTermname_list(name):
scopechain_list = []
for n in name:
if not isinstance(n, str):
raise TypeError()
scopechain_list.append(ScopeLabel(n, 'any'))
return ScopeChain(scopechain_list)
def getScope(termname):
return termname[:-1]
def toFlatname(termname):
#flatname = ''
# for t in termname:
# flatname += str(t.scopename) + '__'
# return flatname[:-2]
return termname.tocode()
def splitScopeName(termname):
scope = termname[:-1]
scope_str = ''
for s in scope:
scope_str += s.scopename + '.'
scope_str = scope_str[:-1]
signame_str = termname[-1]
return scope_str, signame_str
def isTopmodule(scope):
if len(scope) == 1:
return True
return False
def dictlistmerge(a, b):
ret = {}
ret.update(a)
for bk, bv in b.items():
if bk in ret:
for bvv in bv:
if bvv not in ret[bk]:
ret[bk].append(bvv)
else:
ret[bk] = bv
return ret
def maxValue(width):
return 2 ** width - 1