# Copyright 2019 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.

-- This is the Emboss Prelude.
--
-- This is a special file whose names are imported into (and therefore usable
-- in) every Emboss module.  The IR for the Prelude module is included in every
-- Emboss IR as the second element of the `module` list.

# This namespace needs to match the namespace in emboss_prelude.h.
# TODO(bolms): Move back-end-specific declarations to a separate file.
[(cpp) namespace: "emboss::prelude"]


external UInt:
  -- UInt is an automatically-sized unsigned integer.
  [static_requirements: $is_statically_sized && 1 <= $static_size_in_bits <= 64]
  [is_integer: true]
  [addressable_unit_size: 1]


external Int:
  -- Int is an automatically-sized signed 2's-complement integer.
  [static_requirements: $is_statically_sized && 1 <= $static_size_in_bits <= 64]
  [is_integer: true]
  [addressable_unit_size: 1]


external Bcd:
  -- `Bcd` is an automatically-sized unsigned integer stored in Binary-Coded
  -- Decimal (BCD) format.  https://en.wikipedia.org/wiki/Binary-coded_decimal
  --
  -- `Bcd` can be used in `bits` constructs.  If its size is not a multiple of
  -- 4 bits, the value will be padded out to a multiple of 4 bits using 0s, and
  -- then the resulting bit pattern will be treated as BCD.  Thus, a 7-bit `Bcd`
  -- will have a range of 0..79, a 10-bit `Bcd` will have a range of 0..399, and
  -- so on.
  [static_requirements: $is_statically_sized && 1 <= $static_size_in_bits <= 64]
  [is_integer: true]
  [addressable_unit_size: 1]


external Flag:
  -- `Flag` is a boolean value, with `0` meaning `false` and `1` meaning `true`.
  [static_requirements: $is_statically_sized && $static_size_in_bits == 1]
  [fixed_size_in_bits: 1]
  # Flags are not integers; if a user wants a 1-bit integer, they should use a
  # 1-bit UInt.
  [is_integer: false]
  [addressable_unit_size: 1]


external Float:
  -- `Float` is a number in an IEEE 754 binaryNN format.
  [static_requirements: $is_statically_sized && ($static_size_in_bits == 32 || $static_size_in_bits == 64)]
  [is_integer: false]
  [addressable_unit_size: 1]


# TODO(bolms): Add Fixed-point.
