// 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 "mpact/sim/decoder/test/testfiles/include/empty_include.isa"
#include "mpact/sim/decoder/test/testfiles/include/bundle_a.isa"
#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};
    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 *) {}";
}
