コード例 #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
ファイル: compiler.py プロジェクト: jszheng/codegen
    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
コード例 #3
0
    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))
コード例 #4
0
 def visit_StringConst(self, node):
     return vtypes.Str(node.value)
コード例 #5
0
ファイル: compiler.py プロジェクト: fifoteam/veriloggen
 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)
コード例 #6
0
ファイル: compiler.py プロジェクト: fifoteam/veriloggen
 def visit_Str(self, node):
     return vtypes.Str(node.s)
コード例 #7
0
    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
コード例 #8
0
 def visit_str(self, node):
     return (None, vtypes.Str(node), None, [])
コード例 #9
0
 def visit_Str(self, node):
     # deprecated, merged to visit_Constant
     return vtypes.Str(node.s)