blob: 65355b328ba746bfa01e1228431d31798fcdcf1b [file] [log] [blame]
# -------------------------------------------------------------------------------
# identifierreplace.py
#
# Replaces identifier names based on a given dict
#
# Copyright (C) 2015, Shinya Takamaeda-Yamazaki
# License: Apache 2.0
# -------------------------------------------------------------------------------
from __future__ import absolute_import
from __future__ import print_function
import sys
import os
import pyverilog.vparser.ast as vast
from pyverilog.vparser.ast import Node
def replaceIdentifiers(node, ids):
v = IdentifierReplace(ids)
return v.visit(node)
def ischild(node, attr):
if not isinstance(node, Node):
return False
excludes = ('coord', 'attr_names',)
if attr.startswith('__'):
return False
if attr in excludes:
return False
attr_names = getattr(node, 'attr_names')
if attr in attr_names:
return False
attr_test = getattr(node, attr)
if hasattr(attr_test, '__call__'):
return False
return True
def children_items(node):
children = [attr for attr in dir(node) if ischild(node, attr)]
ret = []
for c in children:
ret.append((c, getattr(node, c)))
return ret
class IdentifierReplace(object):
def __init__(self, ids):
self.ids = ids
def visit(self, node):
method = 'visit_' + node.__class__.__name__
visitor = getattr(self, method, self.generic_visit)
ret = visitor(node)
if ret is None:
return node
return ret
def generic_visit(self, node):
for name, child in children_items(node):
ret = None
if child is None:
continue
if (isinstance(child, list) or isinstance(child, tuple)):
r = []
for c in child:
r.append(self.visit(c))
ret = tuple(r)
else:
ret = self.visit(child)
setattr(node, name, ret)
return node
def visit_Identifier(self, node):
if node.name in self.ids:
return vast.Identifier(self.ids[node.name])
return node