Example #1
0
 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));
   }
 }
Example #2
0
 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));
   }
 }
Example #3
0
  /**
   * 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);
  }