protected void standardPrimePumpProcessing() { JMethodDeclaration primePump = joiner_code.getPrimePumpMethod(); if (primePump != null && !codeStore.hasMethod(primePump)) { // Add method -- but only once codeStore.addMethod(primePump); } if (primePump != null) { // for each time this method is called, it adds another call // to the primePump routine to the initialization. codeStore.addInitStatement( new JExpressionStatement( null, new JMethodCallExpression( null, new JThisExpression(null), primePump.getName(), new JExpression[0]), null)); } }
protected void standardInitProcessing() { // Have the main function for the CodeStore call our init if any codeStore.addInitFunctionCall(joiner_code.getInitMethod()); JMethodDeclaration workAtInit = joiner_code.getInitStageMethod(); if (workAtInit != null) { // if there are calls to work needed at init time then add // method to general pool of methods codeStore.addMethod(workAtInit); // and add call to list of calls made at init time. // Note: these calls must execute in the order of the // initialization schedule -- so caller of this routine // must follow order of init schedule. codeStore.addInitStatement( new JExpressionStatement( null, new JMethodCallExpression( null, new JThisExpression(null), workAtInit.getName(), new JExpression[0]), null)); } }
/** * Make a work function for a joiner * * @param joiner the InputSliceNode that we are generating code for. * @param backEndBits way to refer to other portions of backend * @param joiner_code place to put code */ public static void makeJoinerWork( InputSliceNode joiner, BackEndFactory backEndBits, CodeStoreHelper joiner_code) { JMethodDeclaration joinerWork; // the work function will need a temporary variable ALocalVariable t = ALocalVariable.makeTmp(joiner.getEdgeToNext().getType()); Channel downstream = backEndBits.getChannel(joiner.getEdgeToNext()); // the body of the work method JBlock body = new JBlock(); if (backEndBits.sliceNeedsJoinerCode(joiner.getParent())) { // There should be generated code for the joiner // state machine in the CodeStoreHelper as the only method. // // generated code is // T tmp; // tmp = joiner_code(); // push(tmp); // // TODO: inline the joiner code at the call site, // if inlining, delete joiner code after inlining leaving // only this method in the helper. assert joiner_code.getMethods().length == 1; JMethodDeclaration callable_joiner = joiner_code.getMethods()[0]; body.addStatement(t.getDecl()); body.addStatement( new JExpressionStatement( new JAssignmentExpression( t.getRef(), new JMethodCallExpression(callable_joiner.getName(), new JExpression[0])))); body.addStatement( new JExpressionStatement( new JMethodCallExpression( downstream.pushMethodName(), new JExpression[] {t.getRef()}))); } else { // slice does not need joiner code, so just transfer from upstream // to downstream buffer. // // generated code is // T tmp; // tmp = pop(); // push(tmp); // assert joiner.getWidth() == 1; Channel upstream = backEndBits.getChannel(joiner.getSingleEdge()); body.addStatement(t.getDecl()); body.addStatement( new JExpressionStatement( new JAssignmentExpression( t.getRef(), new JMethodCallExpression(upstream.popMethodName(), new JExpression[0])))); body.addStatement( new JExpressionStatement( new JMethodCallExpression( downstream.pushMethodName(), new JExpression[] {t.getRef()}))); } joinerWork = new JMethodDeclaration( CStdType.Void, "_joinerWork_" + joiner.getNextFilter().getFilter().getName(), JFormalParameter.EMPTY, body); joiner_code.setWorkMethod(joinerWork); joiner_code.addMethod(joinerWork); }