source: proto/pablo/src/compiler/backend/visitors/AssertZeroXFormer.java @ 2710

Last change on this file since 2710 was 2710, checked in by ksherdy, 6 years ago

General refactoring.

File size: 3.0 KB
Line 
1package compiler.backend.visitors;
2
3import ast.*;
4import compiler.ast.Accessors;
5import compiler.ast.Generators;
6import compiler.lang.pablo.Builtins;
7import compiler.lang.pablo.Builtins2Lang;
8import compiler.lang.pablo.BuiltinsUtil;
9import compiler.lang.idisa.BitBlock;
10
11public class AssertZeroXFormer {
12        private ASTNode ASTree; 
13        private Builtins2Lang builtins2Lang;
14
15        public AssertZeroXFormer(ASTNode ASTree, Builtins2Lang builtins2Lang) {
16                this.ASTree = ASTree;
17                this.builtins2Lang = builtins2Lang;
18        }
19       
20        public ASTNode XForm() {
21                XFormer XFormer = new XFormer();
22                ASTree.accept(XFormer);
23                return ASTree;
24        }
25
26//      class AssertCompiler(ast.NodeXFormer):
27//              def __init__(self):
28//                          self.assert_routine = ast.parse(error_routine).body[0].value
29//                        def xfrm(self, t):
30//                          return self.generic_visit(t)
31//                        def visit_Expr(self, node):
32//                          if isinstance(node.value, ast.Call):
33//                              if is_BuiltIn_Call(node.value, "assert_0", 2):
34//                                      err_stream = node.value.args[0]
35//                                      err_code = node.value.args[1]
36//                                      return ast.If(mkCall('bitblock::any', [err_stream]),
37//                                                    [ast.Expr(mkCall(self.assert_routine, [err_code, err_stream]))],
38//                                                    [])
39//                              else: return node
40//                          else: return node
41                               
42        private class XFormer extends VoidVisitor.Default {
43                               
44                public XFormer () {}
45                               
46                public void visitEnter(FuncCallNode node) {
47                       
48                        if (BuiltinsUtil.isCall(node, BuiltinsUtil.BUILTIN_PACKAGE_NAME, Builtins.ASSERTZERO.pabloName(), Builtins.ASSERTZERO.argCount())) {
49                               
50                                assert (node.getParent() instanceof BlockStmtNode);
51
52                                ASTNode errorCode = Accessors.funcCallArgsListNode(node).child(1);
53                                ASTNode errorStream = Accessors.funcCallArgsListNode(node).child(0);
54                               
55                                assert errorCode instanceof StringConstantNode;
56                               
57                                ASTNode anyFuncCallNode = 
58                                                Generators.makeFuncCallNode(BitBlock.ANY.IDISAName(), 
59                                                                                                                                node.getToken(),                               
60                                                                                                                                new ASTNode [] {errorStream});
61
62                                ASTNode assert0FuncCallNode
63                                                = Generators.makeFuncCallNode(builtins2Lang.getCode(Builtins.ASSERTZERO), 
64                                                                                                                                node.getToken(),                               
65                                                                                                                                new ASTNode [] {errorStream, errorCode});
66                               
67                               
68                                BlockStmtNode blockStmt = Generators.makeBlockStmtNode(node.getToken());
69                                blockStmt.appendChild(assert0FuncCallNode);
70                               
71                                IfStmtNode ifStmtNode = Generators.makeIfStmtNode(node.getToken(),
72                                                                                                                                                                anyFuncCallNode, 
73                                                                                                                                                                blockStmt);
74                               
75                                node.updateSelf(ifStmtNode);
76                        }
77                       
78                }               
79               
80                private void addAssertZeroStmt(ASTNode node, ASTNode lhs) {
81                        FuncCallNode printRegisterStmt = 
82                                        Generators.makeFuncCallNode(  builtins2Lang.getCode(Builtins.ASSERTBITBLOCKALIGN), 
83                                                                                                                        node.getToken(),
84                                                                                                                        new ASTNode [] {lhs});
85                       
86                        (node.getParent()).insertAfterChild(node, printRegisterStmt);                           
87                }
88        }       
89}
90
Note: See TracBrowser for help on using the repository browser.