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 _to_fixed_neg_point(value, point): point = -point if isinstance(value, (int, bool, float)) and isinstance(point, int): mag = 2 ** point return int(value / mag) if isinstance(value, (int, bool)): return vtypes.Int(value) >> point if isinstance(value, float): mag = vtypes.Int(2) ** point return vtypes.Float(value) / mag signed = vtypes.get_signed(value) return shift_right(value, point, signed)
def visit_Pointer(self, node): val = self.visit(node.var) if val is None: return None left = vtypes.Pointer(val.left, node.pos) if not isinstance(val.right, (vtypes._Variable, vtypes.Scope)): if isinstance(val.right, (int, bool)): val_right = vtypes.Int(val.right) elif isinstance(val.right, float): val_right = vtypes.Float(val.right) else: raise TypeError("unsupported value type: %s" % str(val.right)) right = (val_right >> node.pos) & 0x1 else: right = vtypes.Pointer(val.right, node.pos) return vtypes.Subst(left, right)
def to_fixed(value, point): if point < 0: return _to_fixed_neg_point(value, point) if point == 0: return value if isinstance(value, (int, bool, float)) and isinstance(point, int): mag = 2 ** point return int(value * mag) if isinstance(value, (int, bool)): mag = vtypes.Int(2) ** point return vtypes.Int(value) * mag if isinstance(value, float): mag = vtypes.Int(2) ** point return vtypes.Float(value) * mag signed = vtypes.get_signed(value) return shift_left(value, point, signed)
def to_fixed(value, point): if point < 0: raise ValueError('point must be more than 0') if point == 0: return value if isinstance(value, (int, bool, float)) and isinstance(point, int): mag = 2 ** point return int(value * mag) if isinstance(value, (int, bool)): mag = vtypes.Int(2) ** point return vtypes.Int(value) * mag if isinstance(value, float): mag = vtypes.Int(2) ** point return vtypes.Float(value) * mag signed = vtypes.get_signed(value) return shift_left(value, point, signed)
def to_fixed(value, point, signed=False): if point < 0: raise ValueError('point must be more than 0') if point == 0: return value if isinstance(value, (int, bool, float)) and isinstance(point, int): mag = 2 ** point return int(value * mag) if isinstance(value, (int, bool)): mag = vtypes.Int(2) ** point return vtypes.Int(value) * mag if isinstance(value, float): mag = vtypes.Int(2) ** point return vtypes.Float(value) * mag if hasattr(value, 'signed') and value.signed: signed = True return shift_left(value, point, signed)
def visit_FloatConst(self, node): return vtypes.Float(node.value)
def visit_float(self, node): return (None, vtypes.Float(node), None, [])