# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0

# A machine readable description of the ISA
#
# This is used for generating documentation, but also for random test
# and decoder generation.

# The relative path to a YAML file defining the different instruction
# encoding schemes
encoding-schemes: enc-schemes.yml

# Instructions are divided into a list of groups (under insn-groups). Each
# group has the following fields, all of which are required.
#
#  key:     An internal name
#  title:   A title used for documentation
#  doc:     Markdown-format documentation for the group
#  insns:   The relative path to the instructions in this group
#
# Groups appear in the documentation in list order. The insns key points at
# another YAML file. That file should contain a list of instruction objects.
# Again, the instructions appear in the documentation in list order.
#
# Each instruction object has the following fields:
#
#  mnemonic:  Instruction mnemonic (required)
#
#  group:     The instruction group in which this instruction should
#             appear. Defaults to the first entry in the insn-groups
#             list. (optional)
#
#  rv32i:     A boolean. If true, this instruction came from the RV32I ISA.
#             Optional, defaults to false.
#
#  synopsis:  A longer name for this instruction. If set, used as a subtitle in
#             the generated documentation. (optional)
#
#  operands:  A list of operand names. These have a special syntax, described
#             below. (required)
#
#  syntax:    The syntax for the operands to the instruction. If not given,
#             this is assumed to be the operands in order, separated by commas.
#             If given, it should be a string with operand names in angle
#             brackets ("<foo>, <bar>"). Any other non-whitespace characters
#             are taken to be required literal syntax. So "foo<bar>" means "the
#             string 'foo', followed by the bar operand".
#
#  glued-ops: A boolean. If true, the first operand in the syntax can appear
#             immediately after the mnemonic (with no space). Optional,
#             defaults to false.
#
#  doc:       Documentation for the instruction in markdown. (optional)
#
#  note:      Text that should appear in a callout banner at the top of the
#             instruction documentation. (optional)
#
#  errs:      A list of errors that might be signalled by this instruction.
#             This should be a list of strings, each of which is interpreted as
#             markdown.
#
#  literal-pseudo-op: This instruction is a pseudo-operation that expands into
#                     a list of underlying RISC-V operations, given as a list.
#                     Optional. Can't be specified with encoding or
#                     python-pseudo-op.
#
#  python-pseudo-op: A boolean. If true then this instruction is a
#                    pseudo-operation but is complicated to describe. The
#                    assembler has some hardcoded logic to deal with it.
#                    Optional, default false. Can't be true if encoding or
#                    literal-pseudo-op is specified.
#
#  lsu:       An optional dictionary. If set, this is an LSU operation,
#             described by the fields of the dictionary (defined below).
#
#  straight-line: A boolean. If true, this instruction has no effect on control
#                 flow. Optional, default true.
#
#  cycles:    A positive integer, giving the number of cycles that the
#             instruction takes to execute. Optional, default 1.
#
# The operands field should be a list, corresponding to the operands in the
# order they will appear in the syntax. Each operand is either a string (the
# operand name) or a dictionary. In the latter case, it has the following
# fields:
#
#  name:      The name of the operand. Required and must be unique.
#
#  abbrev:    An optional shortened name for the operand. If given, it
#             must not match the short name or full name of any other
#             operand.
#
#  type:      The type of the operand. A string. If this can be figured out
#             from the operand name, it is optional. See below for a list of
#             possible operand types and the rules for recognising them
#             automatically.
#
#  doc:       A fragment of markdown that documents the operand
#
#  pc-rel:    Only valid for immediate operands. If true, this operand is
#             encoded relative to the current PC. Optional boolean,
#             defaults to false.
#
# The allowed values for the "type" field are:
#
#  grs    A source GPR. Read and not written.
#
#  grd    A destination GPR. Written and not read.
#
#  wrs    A source WDR. Read and not written.
#
#  wrd    A source WDR. Written and not read.
#
#  wrb    A WDR that is both read and written.
#
#  csr    A CSR (may be read and/or written)
#
#  wsr    A WSR (may be read and/or written)
#
#  simm   A signed immediate operand. The full syntax is simm12<<3 to mean a
#         signed immediate of width 12 which must be divisible by 2**3 and is
#         encoded by shifting right by 3. The syntax simm12 means the same as
#         simm12<<0. If there is no known width (which should be inferred from
#         any encoding scheme), the type can be written as just simm or
#         simm<<3.
#
#  uimm   An unsigned immediate operand. The full syntax is as with simm, but
#         starting with "uimm".
#
#  enum   An immediate with weird syntax. The syntax is "enum(a,b,c,d)" where
#         a..d are the different possible syntaxes that can be used. The values
#         are interpreted as immediates in enumeration order (so a is 0; d is
#         3).
#
#  option A 1-bit immediate with weird syntax. Written "option(foo)" to
#         mean that if the string "foo" appears then the immediate has
#         value 1 and if it doesn't the immediate has value 0.
#
# Operand types are inferred from names as follows:
#
#  grd:        GPR destination (type grd)
#  grs, grs<n> GPR source (type grs)
#  wrd:        WDR destination (type wrd)
#  wrs, wrs<n> WDR source (type wrs)
#  csr         CSR (type csr)
#  wsr         WSR (type wsr)
#  imm, imm<n> Signed immediate (width <n> if specified) (type simm or simm<n>)
#  offset      Signed immediate (unspecified width) (type simm)
#
# If specified, the lsu field for an instruction should be a dictionary with
# the following fields:
#
#  type:    A string. "mem-load", "mem-store", "wsr-load", "wsr-store" or "csr"
#
#  target:  A string or list of strings, which should be operand names. If a
#           single string, this means that the named operand contains the
#           target address. If the operand is an immediate, it is the target
#           address. If the operand is a register, the value it contains is the
#           target address. For a list of strings, the associated values are
#           summed.
#
#  bytes:   An integer giving the width of the operation in bytes. This is
#           required if type is mem-* and cannot be used otherwise.

insn-groups:
  - key: base
    title: Base Instruction Subset
    doc: |
      The base instruction set of OTBN is a limited 32b instruction set.
      It is used together with the 32b wide General Purpose Register file.
      The primary use of the base instruction set is the control flow in applications.

      The base instruction set is an extended subset of RISC-V's RV32I_Zcsr.
      Refer to the [RISC-V Unprivileged Specification](https://github.com/riscv/riscv-isa-manual/releases/download/Ratified-IMAFDQC/riscv-spec-20191213.pdf) for a detailed instruction specification.
      Not all RV32 instructions are implemented.
      The implemented subset is shown below.
    insns: base-insns.yml

  - key: bignum
    title: Big Number Instruction Subset
    doc: |
      All Big Number (BN) instructions operate on the Wide Data Registers (WDRs).
    insns: bignum-insns.yml
