Ignore:
Timestamp:
Jun 24, 2013, 11:02:31 AM (6 years ago)
Author:
ksherdy
Message:

Ensure visitors are idempotent.

Location:
proto/pabloj/trunk/src/toolchain/pabloS/transformer
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • proto/pabloj/trunk/src/toolchain/pabloS/transformer/Transformer.java

    r3345 r3350  
    6161               
    6262                decoratedTree = CarryIntroXFormer.apply(decoratedTree, getBuiltinEncoder(), getCarrySet2Lang(), finalBlockMode);
     63                decoratedTree = CarryIntroXFormer.apply(decoratedTree, getBuiltinEncoder(), getCarrySet2Lang(), finalBlockMode);
    6364               
    6465                decoratedTree = SurroundConditionsWithBitBlockAny.apply(decoratedTree);
     
    6667                //decoratedTree = InitializeStreamDefaults.apply(decoratedTree);
    6768               
    68         decoratedTree = CombineScopes.apply(decoratedTree);
     69        //decoratedTree = CombineScopes.apply(decoratedTree);
    6970                               
    7071                return decoratedTree;
  • proto/pabloj/trunk/src/toolchain/pabloS/transformer/visitors/carry/CarryIntroXFormer.java

    r3348 r3350  
    136136                }
    137137                public void visitLeave(FuncDefNode node) {
    138                         if(context.isFinalBlockMode()) {
    139                                 ParameterNode EOFMaskParameter = Generators.makeEOFMaskParameter(node, context.getBuiltinEncoder());
    140                                 Generators.appendParameter(node, EOFMaskParameter);
    141                         }
    142                 }               
     138            if(context.isFinalBlockMode()) {
     139
     140                if(!hasEOFMaskParameter(node)) {
     141                      ParameterNode EOFMaskParameter = Generators.makeEOFMaskParameter(node, context.getBuiltinEncoder());
     142                      Generators.appendParameter(node, EOFMaskParameter);
     143                }
     144            }
     145                }
     146
     147        private boolean hasEOFMaskParameter(FuncDefNode node) {
     148            if(Accessors.hasParameters(node)) {
     149                ParameterListNode parameterList = Accessors.parameterListNode(node);
     150                ParameterNode lastParameter = (ParameterNode)parameterList.lastChild();
     151
     152                final String EOF_Mask = context.getBuiltinEncoder().getName(PabloSBuiltin.EOF_MASK);
     153
     154                if(Accessors.variableName(lastParameter).equals(EOF_Mask)) {
     155                    return true;
     156                }
     157            }
     158            return false;
     159        }               
    143160
    144161                private boolean needsCarryAdjustment(int carry1Count) {
     
    168185                    ASTNode rhs = Accessors.rhs(node);
    169186                    if(BuiltinCallUtil.isCarry(rhs)) {
    170                         IdentifierNode lhs = (IdentifierNode) Accessors.lhs(node);
     187                        ASTNode lhs = Accessors.lhs(node);
    171188                       
    172189                FuncCallNode funcCall = (FuncCallNode) rhs;
     
    175192                Counter counter = selectCounter(builtin, carryCounter, advanceNCounter);
    176193                PabloSBuiltinTranslator translator = builtin.getTranslator();
    177                 IdentifierNode returnValue = lhs.deepCopy();
     194                ASTNode returnValue = lhs.deepCopy();
    178195                translator.translate(builtin, funcCall, counter, context, returnValue);
    179196               
  • proto/pabloj/trunk/src/toolchain/pabloS/transformer/visitors/carry/TempifyCarrySetBuiltinCalls.java

    r3348 r3350  
    134134
    135135        public void visitLeave(FuncCallNode node) {
     136           
     137           
    136138            if(BuiltinCallUtil.isCarry(node)) {
    137139               
    138                 BlockStmtNode blockStmt          = getEnclosingBlockStmt(node);
    139                 Locator locator                  = blockStmt;
    140                 IdentifierNode name              = Generators.makeIdentifierNode(locator, labeller.newLabel());
    141                 StreamTypeNode type              = Generators.makeStreamType(locator);
    142                 VarDeclNode varDecl              = Generators.makeVarDeclNode(locator, type, name.deepCopy());
    143                 AssignNode assignStmt            = Generators.makeAssignNode(locator, name.deepCopy(), node.deepCopy());
    144 
    145                 addValueToList(enclBlockStmtTempDecls, blockStmt, varDecl);
    146                 addValueToList(enclBlockStmtTempAssigns, blockStmt, assignStmt);
    147 
    148                 node.updateSelf(name);               
     140                if(!(node.getParent() instanceof AssignNode)) {
     141               
     142                    BlockStmtNode blockStmt          = getEnclosingBlockStmt(node);
     143                    Locator locator                  = blockStmt;
     144                    IdentifierNode name              = Generators.makeIdentifierNode(locator, labeller.newLabel());
     145                    StreamTypeNode type              = Generators.makeStreamType(locator);
     146                    VarDeclNode varDecl              = Generators.makeVarDeclNode(locator, type, name.deepCopy());
     147                    AssignNode assignStmt            = Generators.makeAssignNode(locator, name.deepCopy(), node.deepCopy());
     148
     149                    addValueToList(enclBlockStmtTempDecls, blockStmt, varDecl);
     150                    addValueToList(enclBlockStmtTempAssigns, blockStmt, assignStmt);
     151
     152                    node.updateSelf(name);               
     153                }
    149154            }
    150155        }
Note: See TracChangeset for help on using the changeset viewer.