def makeASTTree(node): if isinstance(node, DFBranch): return Cond(makeASTTree(node.condnode), makeASTTree(node.truenode), makeASTTree(node.falsenode)) if isinstance(node, DFIntConst): return vtypes.Int(int(node.value)) if isinstance(node, DFFloatConst): return vtypes.Float(float(node.value)) if isinstance(node, DFStringConst): return vtypes.Str(node.value) if isinstance(node, DFEvalValue): if isinstance(node.value, int): return vtypes.Int(node.value) if isinstance(node.value, float): return vtypes.Float(node.value) if isinstance(node.value, DFStringConst): return vtypes.Str(node.value) raise TypeError('Unknown constant') if isinstance(node, DFTerminal): return node.original if isinstance(node, DFUndefined): return vtypes.IntX() if isinstance(node, DFHighImpedance): return vtypes.IntZ() if isinstance(node, DFOperator): if len(node.nextnodes) == 1: return getOp(node.operator)(makeASTTree(node.nextnodes[0])) return getOp(node.operator)(makeASTTree(node.nextnodes[0]), makeASTTree(node.nextnodes[1])) if isinstance(node, DFSyscall): return vtypes.SystemTask( node.syscall, tuple([makeASTTree(n) for n in node.nextnodes])) raise TypeError("Unsupported DFNode %s" % type(node))
def visit_Print(self, node): # for Python 2.x # prepare the argument values argvalues = [] formatstring_list = [] for arg in node.values: if (isinstance(arg, ast.BinOp) and isinstance(arg.op, ast.Mod) and isinstance(arg.left, ast.Str)): # format string in print statement values, form = self._print_binop_mod(arg) argvalues.extend(values) formatstring_list.append(form) formatstring_list.append(" ") elif isinstance(arg, ast.Tuple): for e in arg.elts: value = self.visit(e) if isinstance(value, vtypes.Str): formatstring_list.append(value.value) formatstring_list.append(" ") else: argvalues.append(value) formatstring_list.append("%d") formatstring_list.append(" ") else: value = self.visit(arg) if isinstance(value, vtypes.Str): formatstring_list.append(value.value) formatstring_list.append(" ") else: argvalues.append(value) formatstring_list.append("%d") formatstring_list.append(" ") formatstring_list = formatstring_list[:-1] args = [] args.append(vtypes.Str(''.join(formatstring_list))) args.extend(argvalues) left = None right = vtypes.SystemTask('display', *args) self.setBind(left, right) self.setFsm() self.incFsmCount() return right
def visit_Constant(self, node): if isinstance(node.value, int): return node.value if isinstance(node.value, float): v = FixedConst(None, node.value, self.point) v.orig_value = node.value return v if isinstance(node.value, str): return vtypes.Str(node.value) if node.value == True: return vtypes.Int(1) if node.value == False: return vtypes.Int(0) if node.value == None: return vtypes.Int(0) raise TypeError("%s in Const.value is not supported." % str(node.value))
def visit_StringConst(self, node): return vtypes.Str(node.value)
def _string_operation_plus(self, left, right): if not isinstance(left, vtypes.Str) or not isinstance( right, vtypes.Str): raise TypeError("'+' operation requires two string arguments") return vtypes.Str(left.value + right.value)
def visit_Str(self, node): return vtypes.Str(node.s)
def _call_Name_print(self, node): # prepare the argument values argvalues = [] formatstring_list = [] for arg in node.args: if (isinstance(arg, ast.BinOp) and isinstance(arg.op, ast.Mod) and isinstance(arg.left, ast.Str)): # format string in print statement values, form = self._print_binop_mod(arg) for value in values: if isinstance(value, fxd._FixedBase): if value.point >= 0: argvalues.append( vtypes.Div(vtypes.SystemTask('itor', value), 1.0 * (2**value.point))) else: argvalues.append( vtypes.Times(value, 2**-value.point)) else: argvalues.append(value) formatstring_list.append(form) formatstring_list.append(" ") elif isinstance(arg, ast.Tuple): for e in arg.elts: value = self.visit(e) if isinstance(value, vtypes.Str): formatstring_list.append(value.value) formatstring_list.append(" ") elif isinstance(value, fxd._FixedBase): if value.point >= 0: argvalues.append( vtypes.Div(vtypes.SystemTask('itor', value), 1.0 * (2**value.point))) else: argvalues.append( vtypes.Times(value, 2**value.point)) formatstring_list.append("%f") formatstring_list.append(" ") else: argvalues.append(value) formatstring_list.append("%d") formatstring_list.append(" ") else: value = self.visit(arg) if isinstance(value, vtypes.Str): formatstring_list.append(value.value) formatstring_list.append(" ") elif isinstance(value, fxd._FixedBase): if value.point >= 0: argvalues.append( vtypes.Div(vtypes.SystemTask('itor', value), 1.0 * (2**value.point))) else: argvalues.append(vtypes.Times(value, 2**value.point)) formatstring_list.append("%f") formatstring_list.append(" ") else: argvalues.append(value) formatstring_list.append("%d") formatstring_list.append(" ") formatstring_list = formatstring_list[:-1] args = [] args.append(vtypes.Str(''.join(formatstring_list))) args.extend(argvalues) left = None right = vtypes.SystemTask('display', *args) self.setBind(left, right) self.setFsm() self.incFsmCount() return right
def visit_str(self, node): return (None, vtypes.Str(node), None, [])
def visit_Str(self, node): # deprecated, merged to visit_Constant return vtypes.Str(node.s)