// Copyright 2023 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Define an isa with two bundles.
isa Example {
  namespace sim::example::isa;
  bundles {
    bundle_a;
    bundle_b;
  }
}

int const1 = 1;
int my_const = const1 + 2;

// Try some include files.
// Include file relative to test execution directory.
#include "mpact/sim/decoder/test/testfiles/include/empty_include.isa"
#include "mpact/sim/decoder/test/testfiles/include/bundle_a.isa"

// This file is passed as another source file in invocation arguments.
// #include "mpact/sim/decoder/test/testfiles/bundle_b.isa"

template<int base, int mult>
slot a_side_ops {
  int base_plus_1 = base + 1;
  int mult_plus_2 = mult + my_const;
  default attributes = { one, two = 3, three = base, four = base_plus_1, five = 0};
  opcodes {
    vctsf{(pred : sy : dest(base_plus_1))};
    cvtfs{(pred : sy : dest(base + 1))};
    adds{(pred : sy, sx : dest(base))},
      attributes: {five = 1, six};
    push{(pred : [rlist]: )};
    pop{(pred : : [rlist])};
    addf{(pred : sy, sx : dest(base))};
    subf{(pred : sy, sx : dest(base))};
    mulf{(pred : sy, sx : dest(mult_plus_2))};
    mulu{(pred : sy, sx : dest(mult + 1))};
  }
}

slot a_side  {
  opcodes {
    nop{()};
    delay{(pred : const)};
    settag{()};
    fence{()};
  }
}

slot a_side_0 : a_side, a_side_ops<2, 2> {
  default opcode =
    semfunc: "[](Instruction *) {}";
  opcodes {
    settag = delete;
    addf = delete;
    subf = delete;
    br_abs{()};
    br_rel{()};
    br_ind{()};
    call_abs{()};
    call_rel{()};
    call_ind{()};
  }
}

slot a_side_1 : a_side, a_side_ops<1, 4> {
  default opcode =
    semfunc: "[](Instruction *) {}";
  opcodes {
    ld{(pred : yop : ),(: : dest)},
      disasm:"%dest = sld %pred [smem:%yop]";
    ld_offset{(pred : xop, yop : dest(abs(-2)))};
    st{(pred)};
    mulf = delete;
    mulu = delete;
  }
}

slot other {
  default opcode =
    semfunc: "[](Instruction *) {}";
}

slot b_side_alu[4] {
  default opcode =
    semfunc: "[](Instruction *) {}";
}

slot b_side_store {
  default opcode =
    semfunc: "[](Instruction *) {}";
}

slot b_side_load[2] {
  default opcode =
    semfunc: "[](Instruction *) {}";
}

slot b_side_load_2 {
  default opcode =
    semfunc: "[](Instruction *) {}";
}
