Changeset 2633


Ignore:
Timestamp:
Nov 13, 2012, 2:09:52 PM (6 years ago)
Author:
ksherdy
Message:

Added partial carryQ visitor support (if statement). Minor fixes to CPP unparser.

Location:
proto/pablo/src/compiler
Files:
1 added
6 edited
1 moved

Legend:

Unmodified
Added
Removed
  • proto/pablo/src/compiler/PabloCompiler.java

    r2632 r2633  
    5252               
    5353                for (Map.Entry<String, ASTNode> entry : streamFunctionMap.entrySet()) {
     54                       
     55                    //AdvanceCombiner advanceCombiner = new AdvanceCombiner(entry.getValue());
     56                    //advanceCombiner.transform();
     57                   
     58                    //CarryCounter carryCounter = new CarryCounter(entry.getValue());
     59                    //AdvanceNCounter advNCounter = new AdvanceNCounter(entry.getValue());
    5460
     61                        /*
     62                    System.out.println();
     63                        System.out.println(entry.getKey());
     64                        System.out.println("Carry Count = " + carryCounter.count());
     65                        System.out.println("Adv n Count = " + advNCounter.count());
     66                        System.out.println();
     67                        */
    5568                       
    56                     AdvanceCombiner advanceCombiner = new AdvanceCombiner(entry.getValue());
    57                     advanceCombiner.transform();
     69                    AugmentedAssignment augmentedAssignment = new AugmentedAssignment(entry.getValue());
     70                        augmentedAssignment.transform();
     71                       
     72                        CarryQIntro carryIf = new CarryQIntro(entry.getValue());
     73                        carryIf.transform(true, false);
     74                       
     75                        Pablo2CarryQ carryIntro = new Pablo2CarryQ(entry.getValue());
     76                        carryIntro.transform(true, false);                 
    5877                   
    59                     CarryCounter carryCounter = new CarryCounter(entry.getValue());
    60                     AdvanceNCounter advNCounter = new AdvanceNCounter(entry.getValue());
    61                        
    62                     //System.out.println();
    63                         //System.out.println(entry.getKey());
    64                         //System.out.println("Carry Count = " + carryCounter.count());
    65                         //System.out.println("Adv n Count = " + advNCounter.count());
    66                         //System.out.println();
    67                                                
    6878                        Bitwise2IDISA bitwiseToIDISA = new Bitwise2IDISA(entry.getValue());
    6979                        bitwiseToIDISA.transform();
    70 
    71                         AugmentedAssignment augmentedAssignment = new AugmentedAssignment(entry.getValue());
    72                         augmentedAssignment.transform();
    73 
    74                         CarryIntro carryIntro = new CarryIntro(entry.getValue());
    75                         carryIntro.transform(true, true);
    76 
     80                       
    7781                        Unparser cPPUnparser = new CPPUnparser(entry.getValue());
    7882                        String code = cPPUnparser.getCode();
    7983                        System.out.print(code);
    80                
     84                       
    8185                }
    8286
  • proto/pablo/src/compiler/PabloCompilerTestHarness.java

    r2621 r2633  
    188188               
    189189                for (Map.Entry<String, ASTNode> entry : streamFunctionMap.entrySet()) {                                         
    190                         CarryIntro carryIntro = new CarryIntro(entry.getValue());
     190                        Pablo2CarryQ carryIntro = new Pablo2CarryQ(entry.getValue());
    191191                        carryIntro.transform(ciMode, coMode);                   
    192192                }   
  • proto/pablo/src/compiler/ast/Accessors.java

    r2632 r2633  
    128128                return (ASTNode) node.child(0);
    129129        }
     130
     131        public static BlockStatementNode ifBlockStatement(IfStatementNode node) {
     132                return (BlockStatementNode) node.child(1);
     133        }       
    130134       
    131135        public static boolean hasElseBlockStatement(IfStatementNode node) {
    132                 return node.getChildren().size() == 3;
     136                return node.nChildren() > 2;
    133137        }
    134138       
  • proto/pablo/src/compiler/visitors/CPPUnparser.java

    r2625 r2633  
    152152                resultVariable.append(")");
    153153               
    154                 code.setResultVariableName(resultVariable.toString()); 
    155                
    156                 code.addLine(resultVariable.toString());
     154                code.setResultVariableName(resultVariable.toString());   // function invocation as an expression       
     155               
     156                code.addFormattedLine("%s;", resultVariable.toString()); // function invocation as a statement
    157157               
    158158                return code;
     
    177177                if(Accessors.hasElseBlockStatement(node)) {
    178178                        CodeStore elseBlockStatement    = childResults.get(2);
    179                         code.addLine("else {");
     179                        code.addLine("else");
     180                        code.addLine("{");
    180181                        code.addAll(elseBlockStatement, 1);
    181182                        code.dedentedLine("}");
     
    265266               
    266267                StringBuffer resultVariable = new StringBuffer();
    267 
    268        
    269                
    270                
    271                
    272                
    273                
    274268               
    275269                if(!Accessors.isTerminal(Accessors.leftOperand(node))) {
     
    403397        public CodeStore visitLeave(StreamTypeNode node, List<CodeStore> childResults) {
    404398                CodeStore code = new CodeStore();
    405                 code.setResultVariableName(Accessors.streamTypeName(node));
    406                
     399                // TODO - Map stream --> BitBlock <-- stream, BitBlock <-- stream<1>
     400                // code.setResultVariableName(Accessors.streamTypeName(node));
     401                code.setResultVariableName("BitBlock");
     402               
     403                /*
     404                 * TODO - 2^k field width types.
     405                 *
    407406                if(Accessors.hasFieldWidth(node)) {
    408407                        CodeStore fieldWidth;
    409408                        fieldWidth = childResults.get(0);
    410409                        code.setResultVariableName(code.getResultVariableName() + "<" + fieldWidth.getResultVariableName() + ">");
    411                 }               
     410                }
     411                *
     412                *
     413                */             
    412414               
    413415                return code;
  • proto/pablo/src/compiler/visitors/CarryCounter.java

    r2632 r2633  
    2727               
    2828                public void visitLeave(FunctionInvocationNode node) {
    29                        
    3029                        if(BuiltinsUtil.isCarryOne(node)) {
    3130                            carryCount += 1;
    32                         }
    33                    
     31                        }                   
    3432                }
    3533               
  • proto/pablo/src/compiler/visitors/Pablo2CarryQ.java

    r2621 r2633  
    1616import ast.*;
    1717
    18 public class CarryIntro {
     18public class Pablo2CarryQ {
    1919               
    2020        private ASTNode ASTTree; // FunctionDefNode     
     
    2525        //    self.carryout = carryout   
    2626       
    27     public CarryIntro(ASTNode node) {
     27    public Pablo2CarryQ(ASTNode node) {
    2828        assert node instanceof FunctionDefNode;
    2929        this.ASTTree = node;
     
    5353                private int currentCarry;
    5454                private int currentAdvN;
    55                 private int lastStmtCarries;
     55                //private int lastStmtCarries;
    5656               
    5757                CarryIntroVisitor(boolean ciMode, boolean coMode) {
     
    6060                        this.currentCarry = 0;
    6161                        this.currentAdvN = 0;
    62                         this.lastStmtCarries = 0;
     62                        //this.lastStmtCarries = 0;
    6363                }
    64 
    65                 //void setCiMode(boolean ciMode) {
    66                 //      this.ciMode = ciMode;
    67                 //}
    68                
    69                 //void setCoMode(boolean coMode) {
    70                 //      this.coMode = coMode;
    71                 //}
    7264               
    7365                //              def xfrm_fndef(self, fndef):
     
    8072                //      #    fndef.body.insert(0, mkCallStmt('CarryDeclare', [self.carryvar, ast.Num(carry_count)]))
    8173                //          return fndef
    82                 public void visitLeave(FunctionDefNode node) {
     74                public void visitLeave(FunctionDefNode node) { // TODO - CarryIf duplicates
    8375                        this.currentCarry = 0;
    8476                        this.currentAdvN = 0;
    85                         this.lastStmtCarries = 0;                       
     77                        //this.lastStmtCarries = 0;                     
    8678                }               
    8779               
     
    323315//                              replacementNode.appendChild(arg2);
    324316//                      }
    325 
     317                       
    326318//                  else:
    327319//                    #dump_Call(callnode)
    328320//                    return callnode
    329321                        else {
    330                                 // do nothing
     322                                // do nothing // TODO - Dump: allow function calls to pass through the compiler.
    331323                        }
    332324                       
    333                 }
    334 
    335                 //def visit_If(self, ifNode):
    336                 //carry_base = self.current_carry
    337                 //carries = CarryCounter().count(ifNode)
    338                 //assert adv_nCounter().count(ifNode) == 0, "Advance(x,n) within if: illegal\n"
    339                 //self.generic_visit(ifNode)
    340                 //if carries == 0 or self.carryin == "": return ifNode
    341                 //#CARRYSET
    342                 //carry_arglist = [ast.Num(carry_base), ast.Num(carries)]
    343                 //new_test = ast.BoolOp(ast.Or(), [ifNode.test, mkCall(ast.Attribute(self.carryvar, 'CarryTest', ast.Load()), carry_arglist)])
    344                 //new_else_part = ifNode.orelse + [mkCallStmt(ast.Attribute(self.carryvar, 'CarryDequeueEnqueue', ast.Load()), carry_arglist)]
    345                 //return ast.If(new_test, ifNode.body, new_else_part)
    346 
    347                
    348                 public void visitLeave(IfStatementNode node) {
    349                         assert (new AdvanceNCounter(node).count() == 0): "Advance(x,n) within if: illegal\n";
    350                        
    351                         int carryBase = this.currentCarry;
    352                         int carryCount = (new CarryCounter(node)).count();
    353                        
    354                         if(carryCount > 0 && this.ciMode) { // De Morgan's
    355 
    356                                 // if test, replace if test
    357                                 String lexeme = Lextant.OR.getPrimaryLexeme();
    358                                 LextantToken binaryOperatorToken = LextantToken.make(node.getToken().getLocation(), lexeme, Lextant.OR);
    359                                
    360                                 ASTNode lhs = Accessors.ifTest(node);
    361        
    362                                 IntegerConstantNode lowerBound = Generators.makeIntegerConstantNode(carryBase, node.getToken());
    363                                 IntegerConstantNode upperBound =  Generators.makeIntegerConstantNode(carryCount, node.getToken());
    364                        
    365                                 FunctionInvocationNode rhs = (FunctionInvocationNode) Generators.makeFunctionInvocationNode(
    366                                                 new String [] {CarryQ.CarryQ_PACKAGE_NAME, CarryQ.CARRYTEST.cPPCode()},
    367                                                 node.getToken(),
    368                                                 new ASTNode [] {lowerBound, upperBound});
    369                                
    370                                 BinaryOperatorNode replacementIfTestNode = Generators.makeBinaryOperatorNode(lhs,
    371                                                                                                                                                 rhs,
    372                                                                                                                                                 binaryOperatorToken);
    373                                
    374                                 Accessors.ifTest(node).updateSelf(replacementIfTestNode);
    375                                
    376                                 // else part, append CarryDequeueEnqueue call
    377                                
    378                                 FunctionInvocationNode carryDequeueEnqueue = (FunctionInvocationNode) Generators.makeFunctionInvocationNode(
    379                                                 new String [] {CarryQ.CarryQ_PACKAGE_NAME, CarryQ.CARRYDEQUEUEENQUEUE.cPPCode()},
    380                                                 node.getToken(),
    381                                                 new ASTNode [] {lowerBound, upperBound});
    382 
    383                                
    384                                 if (Accessors.hasElseBlockStatement(node)) {   
    385                                         Accessors.elseBlockStatement(node).appendChild(carryDequeueEnqueue);
    386                                 } else {
    387                                         BlockStatementNode blockStatementNode = Generators.makeBlockStatementNode(node.getToken());
    388                                         blockStatementNode.appendChild(carryDequeueEnqueue);
    389                                         Accessors.elseBlockStatement(node).appendChild(carryDequeueEnqueue);
    390                                 }
    391                                
    392                         }                       
    393325                }
    394326                                       
     
    413345                        node.updateSelf(replacementNode);
    414346                }
    415        
    416347        }
    417348}
     
    427358//          self.generic_visit(node)
    428359//          return node
    429 
    430360
    431361//def visit_If(self, ifNode):
  • proto/pablo/src/compiler/visitors/ReadMe.txt

    r2622 r2633  
    1 TODO
    2 
    3 CPPUnparser
    4 
     1Compiler Design 
     2 
    531. Negative numbers.
     42. Replace all occurrences of X.getCPPCode() with a generic getCode call
     5   that is configurable based on the target back-end. e.g. C macro syntax
     6   versus C++ template syntax etc.
     73. Function call expressions versus function call statements.
     84. Visitor dependency. Tree transformation, e.g. carry counter depends on
     9   'Advance(x)' function name and argument count.
Note: See TracChangeset for help on using the changeset viewer.