|  | // Copyright lowRISC contributors. | 
|  | // Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
|  | // SPDX-License-Identifier: Apache-2.0 | 
|  |  | 
|  | #![allow(dead_code)] | 
|  |  | 
|  | //! This file contains enums and consts for use within the Rust codebase. | 
|  | //! | 
|  | //! These definitions are for information that depends on the top-specific chip | 
|  | //! configuration, which includes: | 
|  | //! - Device Memory Information (for Peripherals and Memory) | 
|  | //! - PLIC Interrupt ID Names and Source Mappings | 
|  | //! - Alert ID Names and Source Mappings | 
|  | //! - Pinmux Pin/Select Names | 
|  | //! - Power Manager Wakeups | 
|  |  | 
|  | % for (inst_name, if_name), region in helper.devices(): | 
|  | <% | 
|  | if_desc = inst_name if if_name is None else '{} device on {}'.format(if_name, inst_name) | 
|  | hex_base_addr = "0x{:X}".format(region.base_addr) | 
|  | hex_size_bytes = "0x{:X}".format(region.size_bytes) | 
|  |  | 
|  | base_addr_name = region.base_addr_name().as_c_define() | 
|  | size_bytes_name = region.size_bytes_name().as_c_define() | 
|  |  | 
|  | %>\ | 
|  | /// Peripheral base address for ${if_desc} in top ${top["name"]}. | 
|  | /// | 
|  | /// This should be used with #mmio_region_from_addr to access the memory-mapped | 
|  | /// registers associated with the peripheral (usually via a DIF). | 
|  | pub const ${base_addr_name}: usize = ${hex_base_addr}; | 
|  |  | 
|  | /// Peripheral size for ${if_desc} in top ${top["name"]}. | 
|  | /// | 
|  | /// This is the size (in bytes) of the peripheral's reserved memory area. All | 
|  | /// memory-mapped registers associated with this peripheral should have an | 
|  | /// address between #${base_addr_name} and | 
|  | /// `${base_addr_name} + ${size_bytes_name}`. | 
|  | pub const ${size_bytes_name}: usize = ${hex_size_bytes}; | 
|  | % endfor | 
|  |  | 
|  | % for name, region in helper.memories(): | 
|  | <% | 
|  | hex_base_addr = "0x{:X}".format(region.base_addr) | 
|  | hex_size_bytes = "0x{:X}".format(region.size_bytes) | 
|  |  | 
|  | base_addr_name = region.base_addr_name().as_c_define() | 
|  | size_bytes_name = region.size_bytes_name().as_c_define() | 
|  |  | 
|  | %>\ | 
|  | /// Memory base address for ${name} in top ${top["name"]}. | 
|  | pub const ${base_addr_name}: usize = ${hex_base_addr}; | 
|  |  | 
|  | /// Memory size for ${name} in top ${top["name"]}. | 
|  | pub const ${size_bytes_name}: usize = ${hex_size_bytes}; | 
|  | % endfor | 
|  |  | 
|  | /// PLIC Interrupt Source Peripheral. | 
|  | /// | 
|  | /// Enumeration used to determine which peripheral asserted the corresponding | 
|  | /// interrupt. | 
|  | ${helper.plic_sources.render()} | 
|  |  | 
|  | /// PLIC Interrupt Source. | 
|  | /// | 
|  | /// Enumeration of all PLIC interrupt sources. The interrupt sources belonging to | 
|  | /// the same peripheral are guaranteed to be consecutive. | 
|  | ${helper.plic_interrupts.render()} | 
|  |  | 
|  | /// PLIC Interrupt Target. | 
|  | /// | 
|  | /// Enumeration used to determine which set of IE, CC, threshold registers to | 
|  | /// access for a given interrupt target. | 
|  | ${helper.plic_targets.render()} | 
|  |  | 
|  | /// Alert Handler Source Peripheral. | 
|  | /// | 
|  | /// Enumeration used to determine which peripheral asserted the corresponding | 
|  | /// alert. | 
|  | ${helper.alert_sources.render()} | 
|  |  | 
|  | /// Alert Handler Alert Source. | 
|  | /// | 
|  | /// Enumeration of all Alert Handler Alert Sources. The alert sources belonging to | 
|  | /// the same peripheral are guaranteed to be consecutive. | 
|  | ${helper.alert_alerts.render()} | 
|  |  | 
|  | /// PLIC Interrupt Source to Peripheral Map | 
|  | /// | 
|  | /// This array is a mapping from `${helper.plic_interrupts.name.as_rust_type()}` to | 
|  | /// `${helper.plic_sources.name.as_rust_type()}`. | 
|  | ${helper.plic_mapping.render_definition()} | 
|  |  | 
|  | /// Alert Handler Alert Source to Peripheral Map | 
|  | /// | 
|  | /// This array is a mapping from `${helper.alert_alerts.name.as_rust_type()}` to | 
|  | /// `${helper.alert_sources.name.as_rust_type()}`. | 
|  | ${helper.alert_mapping.render_definition()} | 
|  |  | 
|  | // PERIPH_INSEL ranges from 0 to NUM_MIO_PADS + 2 -1} | 
|  | //  0 and 1 are tied to value 0 and 1 | 
|  | pub const NUM_MIO_PADS: usize = ${top["pinmux"]["io_counts"]["muxed"]["pads"]}; | 
|  | pub const NUM_DIO_PADS: usize = ${top["pinmux"]["io_counts"]["dedicated"]["inouts"] + \ | 
|  | top["pinmux"]["io_counts"]["dedicated"]["inputs"] + \ | 
|  | top["pinmux"]["io_counts"]["dedicated"]["outputs"] }; | 
|  |  | 
|  | pub const PINMUX_MIO_PERIPH_INSEL_IDX_OFFSET: usize = 2; | 
|  | pub const PINMUX_PERIPH_OUTSEL_IDX_OFFSET: usize = 3; | 
|  |  | 
|  | /// Pinmux Peripheral Input. | 
|  | ${helper.pinmux_peripheral_in.render()} | 
|  |  | 
|  | /// Pinmux MIO Input Selector. | 
|  | ${helper.pinmux_insel.render()} | 
|  |  | 
|  | /// Pinmux MIO Output. | 
|  | ${helper.pinmux_mio_out.render()} | 
|  |  | 
|  | /// Pinmux Peripheral Output Selector. | 
|  | ${helper.pinmux_outsel.render()} | 
|  |  | 
|  | /// Dedicated Pad Selects | 
|  | ${helper.direct_pads.render()} | 
|  |  | 
|  | /// Muxed Pad Selects | 
|  | ${helper.muxed_pads.render()} | 
|  |  | 
|  | /// Power Manager Wakeup Signals | 
|  | ${helper.pwrmgr_wakeups.render()} | 
|  |  | 
|  | /// Reset Manager Software Controlled Resets | 
|  | ${helper.rstmgr_sw_rsts.render()} | 
|  |  | 
|  | /// Power Manager Reset Request Signals | 
|  | ${helper.pwrmgr_reset_requests.render()} | 
|  |  | 
|  | /// Clock Manager Software-Controlled ("Gated") Clocks. | 
|  | /// | 
|  | /// The Software has full control over these clocks. | 
|  | ${helper.clkmgr_gateable_clocks.render()} | 
|  |  | 
|  | /// Clock Manager Software-Hinted Clocks. | 
|  | /// | 
|  | /// The Software has partial control over these clocks. It can ask them to stop, | 
|  | /// but the clock manager is in control of whether the clock actually is stopped. | 
|  | ${helper.clkmgr_hintable_clocks.render()} | 
|  |  | 
|  | /// MMIO Region | 
|  | /// | 
|  | /// MMIO region excludes any memory that is separate from the module | 
|  | /// configuration space, i.e. ROM, main SRAM, and flash are excluded but | 
|  | /// retention SRAM, spi_device memory, or usbdev memory are included. | 
|  | pub const ${helper.mmio.base_addr_name().as_rust_const()}: usize = ${"0x{:X}".format(helper.mmio.base_addr)}; | 
|  | pub const ${helper.mmio.size_bytes_name().as_rust_const()}: usize = ${"0x{:X}".format(helper.mmio.size_bytes)}; |