// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
//
// Register Package auto-generated by `reggen` containing data structure

package gpio_reg_pkg;

  // Param list
  parameter int GPIOCount = 32;

  // Address widths within the block
  parameter int BlockAw = 11;

  ////////////////////////////
  // Typedefs for registers //
  ////////////////////////////

  typedef struct packed {
    struct packed {
      logic        q;
    } glbl_intrpt_mode;
    struct packed {
      logic        q;
    } pin_lvl_intrpt_mode;
  } gpio_reg2hw_cfg_reg_t;

  typedef struct packed {
    logic [1:0]  q;
  } gpio_reg2hw_gpio_mode_mreg_t;

  typedef struct packed {
    logic        q;
  } gpio_reg2hw_gpio_en_mreg_t;

  typedef struct packed {
    logic        q;
  } gpio_reg2hw_gpio_out_mreg_t;

  typedef struct packed {
    logic        q;
    logic        qe;
  } gpio_reg2hw_gpio_set_mreg_t;

  typedef struct packed {
    logic        q;
    logic        qe;
  } gpio_reg2hw_gpio_clear_mreg_t;

  typedef struct packed {
    logic        q;
    logic        qe;
  } gpio_reg2hw_gpio_toggle_mreg_t;

  typedef struct packed {
    logic        q;
  } gpio_reg2hw_intrpt_rise_en_mreg_t;

  typedef struct packed {
    logic        q;
  } gpio_reg2hw_intrpt_fall_en_mreg_t;

  typedef struct packed {
    logic        q;
  } gpio_reg2hw_intrpt_lvl_high_en_mreg_t;

  typedef struct packed {
    logic        q;
  } gpio_reg2hw_intrpt_lvl_low_en_mreg_t;

  typedef struct packed {
    logic        q;
    logic        qe;
  } gpio_reg2hw_intrpt_status_mreg_t;

  typedef struct packed {
    logic        q;
  } gpio_reg2hw_intrpt_rise_status_mreg_t;

  typedef struct packed {
    logic        q;
  } gpio_reg2hw_intrpt_fall_status_mreg_t;

  typedef struct packed {
    logic        q;
  } gpio_reg2hw_intrpt_lvl_high_status_mreg_t;

  typedef struct packed {
    logic        q;
  } gpio_reg2hw_intrpt_lvl_low_status_mreg_t;

  typedef struct packed {
    struct packed {
      logic [9:0] d;
    } gpio_cnt;
    struct packed {
      logic [9:0] d;
    } version;
  } gpio_hw2reg_info_reg_t;

  typedef struct packed {
    logic        d;
  } gpio_hw2reg_gpio_in_mreg_t;

  typedef struct packed {
    logic        d;
    logic        de;
  } gpio_hw2reg_gpio_out_mreg_t;

  typedef struct packed {
    logic        d;
  } gpio_hw2reg_intrpt_status_mreg_t;

  typedef struct packed {
    logic        d;
    logic        de;
  } gpio_hw2reg_intrpt_rise_status_mreg_t;

  typedef struct packed {
    logic        d;
    logic        de;
  } gpio_hw2reg_intrpt_fall_status_mreg_t;

  typedef struct packed {
    logic        d;
    logic        de;
  } gpio_hw2reg_intrpt_lvl_high_status_mreg_t;

  typedef struct packed {
    logic        d;
    logic        de;
  } gpio_hw2reg_intrpt_lvl_low_status_mreg_t;

  // Register -> HW type
  typedef struct packed {
    gpio_reg2hw_cfg_reg_t cfg; // [641:640]
    gpio_reg2hw_gpio_mode_mreg_t [31:0] gpio_mode; // [639:576]
    gpio_reg2hw_gpio_en_mreg_t [31:0] gpio_en; // [575:544]
    gpio_reg2hw_gpio_out_mreg_t [31:0] gpio_out; // [543:512]
    gpio_reg2hw_gpio_set_mreg_t [31:0] gpio_set; // [511:448]
    gpio_reg2hw_gpio_clear_mreg_t [31:0] gpio_clear; // [447:384]
    gpio_reg2hw_gpio_toggle_mreg_t [31:0] gpio_toggle; // [383:320]
    gpio_reg2hw_intrpt_rise_en_mreg_t [31:0] intrpt_rise_en; // [319:288]
    gpio_reg2hw_intrpt_fall_en_mreg_t [31:0] intrpt_fall_en; // [287:256]
    gpio_reg2hw_intrpt_lvl_high_en_mreg_t [31:0] intrpt_lvl_high_en; // [255:224]
    gpio_reg2hw_intrpt_lvl_low_en_mreg_t [31:0] intrpt_lvl_low_en; // [223:192]
    gpio_reg2hw_intrpt_status_mreg_t [31:0] intrpt_status; // [191:128]
    gpio_reg2hw_intrpt_rise_status_mreg_t [31:0] intrpt_rise_status; // [127:96]
    gpio_reg2hw_intrpt_fall_status_mreg_t [31:0] intrpt_fall_status; // [95:64]
    gpio_reg2hw_intrpt_lvl_high_status_mreg_t [31:0] intrpt_lvl_high_status; // [63:32]
    gpio_reg2hw_intrpt_lvl_low_status_mreg_t [31:0] intrpt_lvl_low_status; // [31:0]
  } gpio_reg2hw_t;

  // HW -> register type
  typedef struct packed {
    gpio_hw2reg_info_reg_t info; // [403:384]
    gpio_hw2reg_gpio_in_mreg_t [31:0] gpio_in; // [383:352]
    gpio_hw2reg_gpio_out_mreg_t [31:0] gpio_out; // [351:288]
    gpio_hw2reg_intrpt_status_mreg_t [31:0] intrpt_status; // [287:256]
    gpio_hw2reg_intrpt_rise_status_mreg_t [31:0] intrpt_rise_status; // [255:192]
    gpio_hw2reg_intrpt_fall_status_mreg_t [31:0] intrpt_fall_status; // [191:128]
    gpio_hw2reg_intrpt_lvl_high_status_mreg_t [31:0] intrpt_lvl_high_status; // [127:64]
    gpio_hw2reg_intrpt_lvl_low_status_mreg_t [31:0] intrpt_lvl_low_status; // [63:0]
  } gpio_hw2reg_t;

  // Register offsets
  parameter logic [BlockAw-1:0] GPIO_INFO_OFFSET = 11'h 0;
  parameter logic [BlockAw-1:0] GPIO_CFG_OFFSET = 11'h 4;
  parameter logic [BlockAw-1:0] GPIO_GPIO_MODE_0_OFFSET = 11'h 8;
  parameter logic [BlockAw-1:0] GPIO_GPIO_MODE_1_OFFSET = 11'h c;
  parameter logic [BlockAw-1:0] GPIO_GPIO_EN_OFFSET = 11'h 80;
  parameter logic [BlockAw-1:0] GPIO_GPIO_IN_OFFSET = 11'h 100;
  parameter logic [BlockAw-1:0] GPIO_GPIO_OUT_OFFSET = 11'h 180;
  parameter logic [BlockAw-1:0] GPIO_GPIO_SET_OFFSET = 11'h 200;
  parameter logic [BlockAw-1:0] GPIO_GPIO_CLEAR_OFFSET = 11'h 280;
  parameter logic [BlockAw-1:0] GPIO_GPIO_TOGGLE_OFFSET = 11'h 300;
  parameter logic [BlockAw-1:0] GPIO_INTRPT_RISE_EN_OFFSET = 11'h 380;
  parameter logic [BlockAw-1:0] GPIO_INTRPT_FALL_EN_OFFSET = 11'h 400;
  parameter logic [BlockAw-1:0] GPIO_INTRPT_LVL_HIGH_EN_OFFSET = 11'h 480;
  parameter logic [BlockAw-1:0] GPIO_INTRPT_LVL_LOW_EN_OFFSET = 11'h 500;
  parameter logic [BlockAw-1:0] GPIO_INTRPT_STATUS_OFFSET = 11'h 580;
  parameter logic [BlockAw-1:0] GPIO_INTRPT_RISE_STATUS_OFFSET = 11'h 600;
  parameter logic [BlockAw-1:0] GPIO_INTRPT_FALL_STATUS_OFFSET = 11'h 680;
  parameter logic [BlockAw-1:0] GPIO_INTRPT_LVL_HIGH_STATUS_OFFSET = 11'h 700;
  parameter logic [BlockAw-1:0] GPIO_INTRPT_LVL_LOW_STATUS_OFFSET = 11'h 780;

  // Reset values for hwext registers and their fields
  parameter logic [19:0] GPIO_INFO_RESVAL = 20'h 800;
  parameter logic [9:0] GPIO_INFO_VERSION_RESVAL = 10'h 2;
  parameter logic [31:0] GPIO_GPIO_IN_RESVAL = 32'h 0;
  parameter logic [31:0] GPIO_GPIO_SET_RESVAL = 32'h 0;
  parameter logic [31:0] GPIO_GPIO_CLEAR_RESVAL = 32'h 0;
  parameter logic [31:0] GPIO_GPIO_TOGGLE_RESVAL = 32'h 0;
  parameter logic [31:0] GPIO_INTRPT_STATUS_RESVAL = 32'h 0;

  // Register index
  typedef enum int {
    GPIO_INFO,
    GPIO_CFG,
    GPIO_GPIO_MODE_0,
    GPIO_GPIO_MODE_1,
    GPIO_GPIO_EN,
    GPIO_GPIO_IN,
    GPIO_GPIO_OUT,
    GPIO_GPIO_SET,
    GPIO_GPIO_CLEAR,
    GPIO_GPIO_TOGGLE,
    GPIO_INTRPT_RISE_EN,
    GPIO_INTRPT_FALL_EN,
    GPIO_INTRPT_LVL_HIGH_EN,
    GPIO_INTRPT_LVL_LOW_EN,
    GPIO_INTRPT_STATUS,
    GPIO_INTRPT_RISE_STATUS,
    GPIO_INTRPT_FALL_STATUS,
    GPIO_INTRPT_LVL_HIGH_STATUS,
    GPIO_INTRPT_LVL_LOW_STATUS
  } gpio_id_e;

  // Register width information to check illegal writes
  parameter logic [3:0] GPIO_PERMIT [19] = '{
    4'b 0111, // index[ 0] GPIO_INFO
    4'b 0001, // index[ 1] GPIO_CFG
    4'b 1111, // index[ 2] GPIO_GPIO_MODE_0
    4'b 1111, // index[ 3] GPIO_GPIO_MODE_1
    4'b 1111, // index[ 4] GPIO_GPIO_EN
    4'b 1111, // index[ 5] GPIO_GPIO_IN
    4'b 1111, // index[ 6] GPIO_GPIO_OUT
    4'b 1111, // index[ 7] GPIO_GPIO_SET
    4'b 1111, // index[ 8] GPIO_GPIO_CLEAR
    4'b 1111, // index[ 9] GPIO_GPIO_TOGGLE
    4'b 1111, // index[10] GPIO_INTRPT_RISE_EN
    4'b 1111, // index[11] GPIO_INTRPT_FALL_EN
    4'b 1111, // index[12] GPIO_INTRPT_LVL_HIGH_EN
    4'b 1111, // index[13] GPIO_INTRPT_LVL_LOW_EN
    4'b 1111, // index[14] GPIO_INTRPT_STATUS
    4'b 1111, // index[15] GPIO_INTRPT_RISE_STATUS
    4'b 1111, // index[16] GPIO_INTRPT_FALL_STATUS
    4'b 1111, // index[17] GPIO_INTRPT_LVL_HIGH_STATUS
    4'b 1111  // index[18] GPIO_INTRPT_LVL_LOW_STATUS
  };

endpackage

