예제 #1
0
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))
예제 #2
0
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)
예제 #3
0
 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)
예제 #4
0
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)
예제 #5
0
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)
예제 #6
0
파일: fixed.py 프로젝트: gwsu/veriloggen
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)
예제 #7
0
 def visit_FloatConst(self, node):
     return vtypes.Float(node.value)
예제 #8
0
 def visit_float(self, node):
     return (None, vtypes.Float(node), None, [])