Adding files
This commit is contained in:
@@ -0,0 +1,9 @@
|
||||
# Ignore virtual environment directory
|
||||
mpq/.venv/
|
||||
|
||||
# Ignore Python cache directory
|
||||
mpq/__pycache__/
|
||||
|
||||
# Ignore generated image file
|
||||
mpq/pareto_space.png
|
||||
|
||||
@@ -0,0 +1,333 @@
|
||||
# Mixed-precision Neural Networks on RISC-V Cores
|
||||
|
||||
- [Overview](#Overview)
|
||||
- [Build the RISC-V Toolchain](#Build-the-RISC-V-Toolchain)
|
||||
- [Mixed Precision Quantization](#Mixed-Precision-Quantization)
|
||||
- [RISC-V Architecture](#RISC-V-Architecture)
|
||||
- [Inference Simulation Using Verilator](#Inference-Simulation-Using-Verilator)
|
||||
|
||||
## Overview
|
||||
|
||||
The growing interest in deploying machine learning (ML) applications on devices with restricted processing power and energy capacity underscores the necessity for computing solutions that not only excel in power and memory efficiency but also ensure low latency for time-sensitive applications. Research has shown that individual parameters with varying low precision, can attain accuracies comparable to full-precision counterparts. However, modern embedded microprocessors provide very limited support for mixed-precision Neural Networks regarding both Instruction Set Architecture (ISA) extensions and their hardware design for efficient execution of mixed-precision operations, i.e. introducing several performance bottlenecks due to numerous instructions for data packing and unpacking, arithmetic unit under-utilizations etc.
|
||||
|
||||
In this work, we propose ISA extensions tailored to mixed precision hardware optimizations, targeting energy-efficient Deep Neural Network inference on leading RISC-V CPU architectures. To this end, we introduce a hardware-software co-design framework that enables cooperative hardware design, mixed-precision quantization, ISA extensions and inference in cycle-accurate emulations.
|
||||
|
||||
This repository includes:
|
||||
1. Instructions for updating the RISC-V toolchain with new custom instructions.
|
||||
2. Examples demonstrating the quantization of neural networks using mixed-precision variables. Techniques such as Post-Training Quantization (PTQ) and Quantization-Aware Training (QAT) are employed, leveraging the Brevitas library.
|
||||
3. Details on the RISC-V architecture, which extends the lowRISC Ibex core (written in SystemVerilog).
|
||||
4. Inference codes written in C, both with and without the integration of new instructions. These codes were simulated on the RISC-V processor with the use of Verilator. The repository provides comprehensive instructions for building the simulations and testing the results.
|
||||
|
||||
<!-- - Instructions on mapping the processor onto an FPGA board or an ASIC design using tools like Vivado and Synopsys, along with procedures for retrieving data regarding area, timing, and power consumption.
|
||||
-->
|
||||
|
||||
A brief overview of the whole process can be seen in the following flowchart:
|
||||
|
||||
<p align="center">
|
||||
<img width="55%" alt="workflow" src="https://github.com/alexmr09/ISA-extensions-for-Multi-Pumped-Soft-SIMD-Operations/blob/main/assets/figures/workflow_page-0001.jpg">
|
||||
</p>
|
||||
|
||||
## Build the RISC-V Toolchain
|
||||
To get started, we'll first build the RISC-V toolchain. Before proceeding, ensure that all necessary dependencies are installed on the system:
|
||||
```
|
||||
sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk \
|
||||
build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev
|
||||
```
|
||||
|
||||
Next, clone the toolchain from the official repository:
|
||||
|
||||
```
|
||||
git clone https://github.com/riscv/riscv-gnu-toolchain
|
||||
cd riscv-gnu-toolchain
|
||||
git submodule update --init --recursive
|
||||
```
|
||||
|
||||
To implement the modifications in the RISC-V GNU toolchain, adhere to the changes outlined for the following files:
|
||||
|
||||
1. **File Path**: `path/to/riscv-gnu-toolchain/riscv-binutils-gdb/include/opcode/riscv-opc.h`
|
||||
|
||||
```c
|
||||
#ifndef RISCV_ENCODING_H
|
||||
#define RISCV_ENCODING_H
|
||||
|
||||
#define MATCH_NEUR_INIT 0x1047
|
||||
#define MASK_NEUR_INIT 0xfe00707f
|
||||
|
||||
#define MATCH_NEUR_MACC_8B 0x10002047
|
||||
#define MASK_NEUR_MACC_8B 0xfe00707f
|
||||
|
||||
#define MATCH_NEUR_MACC_4B 0x08002047
|
||||
#define MASK_NEUR_MACC_4B 0xfe00707f
|
||||
|
||||
#define MATCH_NEUR_MACC_2B 0x04002047
|
||||
#define MASK_NEUR_MACC_2B 0xfe00707f
|
||||
|
||||
#define MATCH_NEUR_RES 0x4047
|
||||
#define MASK_NEUR_RES 0xfe00707f
|
||||
|
||||
...
|
||||
#endif /* RISCV_ENCODING_H */
|
||||
|
||||
#ifdef DECLARE_INSN
|
||||
|
||||
DECLARE_INSN(neur_init, MATCH_NEUR_INIT, MASK_NEUR_INIT)
|
||||
|
||||
DECLARE_INSN(nn_mac_8b, MATCH_NEUR_MACC_8B, MASK_NEUR_MACC_8B
|
||||
DECLARE_INSN(nn_mac_4b, MATCH_NEUR_MACC_4B, MASK_NEUR_MACC_4B)
|
||||
DECLARE_INSN(nn_mac_2b, MATCH_NEUR_MACC_2B, MASK_NEUR_MACC_2B)
|
||||
|
||||
DECLARE_INSN(neur_res, MATCH_NEUR_RES, MASK_NEUR_RES)
|
||||
|
||||
#endif /* DECLARE_INSN */
|
||||
```
|
||||
|
||||
2. **File Path**: `path/to/riscv-gnu-toolchain/riscv-binutils-gdb/opcodes/riscv-opc.c`
|
||||
|
||||
```c
|
||||
...
|
||||
|
||||
const struct riscv_opcode riscv_opcodes[] =
|
||||
{
|
||||
|
||||
{"neur_init", 0, INSN_CLASS_I, "d,s,t", MATCH_NEUR_INIT, MASK_NEUR_INIT, match_opcode, 0},
|
||||
|
||||
{"nn_mac_8b", 0, INSN_CLASS_I, "d,s,t", MATCH_NEUR_MACC_8B, MASK_NEUR_MACC_8B, match_opcode, 0},
|
||||
{"nn_mac_4b", 0, INSN_CLASS_I, "d,s,t", MATCH_NEUR_MACC_4B, MASK_NEUR_MACC_4B, match_opcode, 0},
|
||||
{"nn_mac_2b", 0, INSN_CLASS_I, "d,s,t", MATCH_NEUR_MACC_2B, MASK_NEUR_MACC_2B, match_opcode, 0},
|
||||
|
||||
{"neur_res", 0, INSN_CLASS_I, "d,s,t", MATCH_NEUR_RES, MASK_NEUR_RES, match_opcode, 0},
|
||||
...
|
||||
```
|
||||
|
||||
Now, let's configure and install the toolchain, with the custom instructions included. For the Ibex core, we require the RV32IMC instruction set:
|
||||
|
||||
```
|
||||
./configure --prefix=/opt/riscv --with-arch=rv32imc --with-abi=ilp32 --with-isa-spec=2.2
|
||||
sudo make && make install
|
||||
sudo make clean
|
||||
```
|
||||
|
||||
We will need to make sure that the directories containing the RISC-V tools are included in the **PATH** environment variable. Since our binaries are located in **'/opt/riscv/bin'** , we must add it to our PATH in the shell configuration file (**'~/.bashrc'** or **'~/.bash_profile'**):
|
||||
|
||||
```
|
||||
export PATH=$PATH:/opt/riscv/bin
|
||||
```
|
||||
|
||||
After adding this line, apply the changes:
|
||||
|
||||
```
|
||||
source ~/.bashrc
|
||||
```
|
||||
|
||||
Finally, we should verify that the RISC-V GCC compiler and other tools are accessible. Run the following command to check the RISC-V GCC compiler version:
|
||||
|
||||
```
|
||||
riscv32-unknown-elf-gcc --version
|
||||
```
|
||||
|
||||
You should see output similar to:
|
||||
|
||||
```
|
||||
riscv32-unknown-elf-gcc (gc891d8dc23e) 13.2.0
|
||||
Copyright (C) 2023 Free Software Foundation, Inc.
|
||||
This is free software; see the source for copying conditions. There is NO
|
||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
```
|
||||
|
||||
## Mixed Precision Quantization
|
||||
|
||||
The next step involves creating the Quantized Model using the [Brevitas](https://github.com/Xilinx/brevitas) Library. To begin, we must acquire the full-precision model, either by importing a pre-trained version or training it from scratch. Once we have the model, we will evaluate its accuracy on the given dataset. Following this, we will replicate the model's architecture and substitute its layers with the corresponding quantized versions available in the Brevitas library. Finally, we need to determine the appropriate weight precision for each layer. Two options can be explored:
|
||||
|
||||
1. "**Exhaustive**" Design Space Exploration. This method allows us to observe how our network behaves when utilizing different weight configurations. It's suitable for relatively small models (up to 5 or 6 layers) and ensures finding the optimal solution. However, for larger models, efficiency becomes crucial. To expedite the process, we can either uniformly quantize consecutive layers and treat them as a single unit, or we can use a fixed bit-width for the weights of layers with lower workload. While this approach may yield sub-optimal solutions, the results are typically satisfactory. To utilize this approach for a given network, we can set the *max_acc_drop* variable to *None*.
|
||||
|
||||
<p align="center">
|
||||
<img src="https://github.com/alexmr09/ISA-extensions-for-Multi-Pumped-Soft-SIMD-Operations/blob/main/assets/figures/pareto_sols.png" width="65%">
|
||||
</p>
|
||||
|
||||
2. In the second case, the user sets the maximum allowable accuracy degradation. We utilize a binary search algorithm across a pre-sorted array of all potential model configurations, ordered by their projected latencies. This approach significantly enhances efficiency by examining merely `log2(3^L)` configurations, swiftly identifying a solution that conforms to the user's accuracy requirements. To utilize this approach for a specific network we need to set the *max_acc_drop* variable to a specific value.
|
||||
|
||||
Finally, once the optimal configuration aligning with our constraints is determined, we proceed to automatically generate the files that will be utilized for the inference (and simulation) of the QNN on our extended RISC-V core. More specifically, we will create files that contain:
|
||||
- The weights and bias values for each layer.
|
||||
- The scale values for the conversion of the 32-bit accumulated results back to 8-bits. The mathematical equation for this procedure is described on [[1]](#1).
|
||||
- The C code delineating the functionality of the Quantized Network.
|
||||
|
||||
Comprehensive examples that implement the procedure, described above, are provided in this [subfolder](https://github.com/alexmr09/ISA-extensions-for-Multi-Pumped-Soft-SIMD-Operations/tree/main/mpq).
|
||||
|
||||
## RISC-V Architecture
|
||||
### Ibex RISC-V Core
|
||||
|
||||
The base design utilized in this work is a generic microarchitecture
|
||||
implementation of the Ibex, an open-source 32 bit RISC-V CPU
|
||||
core written in SystemVerilog. Ibex was initially developed as part of the [PULP platform](https://www.pulp-platform.org)
|
||||
under the name ["Zero-riscy"](https://doi.org/10.1109/PATMOS.2017.8106976), and has been
|
||||
contributed to [lowRISC](https://www.lowrisc.org) who maintains it and develops it further. It is
|
||||
under active development.
|
||||
The CPU core is heavily parametrizable and well suited for
|
||||
embedded control applications. Ibex is being extensively verified and has
|
||||
seen multiple tape-outs. Ibex supports the Integer (I) or Embedded (E),
|
||||
Integer Multiplication and Division (M), Compressed (C), and B (Bit
|
||||
Manipulation) extensions.
|
||||
|
||||
<p align="center">
|
||||
<img src="https://github.com/alexmr09/ISA-extensions-for-Multi-Pumped-Soft-SIMD-Operations/blob/main/assets/figures/ibex_page-0001.jpg" width="50%">
|
||||
</p>
|
||||
|
||||
You can explore the codebase for the Ibex repository on GitHub by visiting [lowRISC/ibex](https://github.com/lowRISC/ibex).
|
||||
|
||||
### Modifications on the Ibex Core
|
||||
|
||||
#### Decoder extensions for Mixed-precision
|
||||
|
||||
Given that the system’s decoder is initially not configured to recognize the newly introduced instructions, modifications to the decoder are imperative, alongside the integration of the accelerator. By updating the decoder, we ensure it can accurately interpret the opcode and function code fields of these new instructions. This modification enables the decoder to correctly identify and differentiate the new instructions, extract the necessary values from the source registers, and subsequently feed forward this information to the newly added unit.
|
||||
|
||||
#### Mixed precision Arithmetic Logic Unit Design
|
||||
|
||||
The overarching objective is to amplify the throughput of MAC operations per cycle, a critical metric for computational efficiency in NN processing, while simultaneously minimizing resource utilization and power consumption. These optimizations will enable us to activate the system’s prefetcher and utilize the advanced optimization flags of the GCC compiler resulting in the generation of faster and more efficient code, without having to stall the processor’s pipeline. The most notable ones are:
|
||||
|
||||
- The exploitation of the processor's resource, and more specifically its multipliers
|
||||
- The use of a pipeline inside the structure of the unit to make the system more robust and increase throughput.
|
||||
- **Multi-Pumping**: We utilize a clock of double frequency for the implementation of the components with the heavier workload.
|
||||
- **Soft SIMD** : We pack 2 multiplications inside a single multiplier, when asked to calculate the products between 2-bit weights and the 8-bit inputs of each layer.
|
||||
|
||||
<p align="center">
|
||||
<img src="https://github.com/alexmr09/ISA-extensions-for-Multi-Pumped-Soft-SIMD-Operations/blob/main/assets/figures/micro_page-0001.jpg" width="50%">
|
||||
</p>
|
||||
|
||||
## Inference Simulation Using Verilator
|
||||
|
||||
For the simulation of our QNNs on the modified Ibex core, with Verilator, we can build and test either:
|
||||
|
||||
- [Ibex Simple System](https://github.com/lowRISC/ibex/tree/master/examples/simple_system), which an Ibex based system that can run stand-alone binaries and contains the core, a single memory for instructions and data, and a basic peripheral to write ASCII output.
|
||||
|
||||
- [Ibex Demo System](https://github.com/lowrisc/ibex-demo-system), which is an example RISC-V SoC targeting the Arty-A7 FPGA board that includes core alongside UART, GPIO, PWM, Timer, SPI and debug support.
|
||||
|
||||
All the necessary files for the 2 designs are located on the [extended_ibex](https://github.com/alexmr09/ISA-extensions-for-Multi-Pumped-Soft-SIMD-Operations/tree/main/extended_ibex) folder.
|
||||
|
||||
### Building Simulation
|
||||
|
||||
#### Prerequisites
|
||||
- [Verilator](https://www.veripool.org/verilator/) (we recommend building version 5.008). In brief to install from git:
|
||||
```
|
||||
# Prerequisites:
|
||||
sudo apt-get install git help2man perl python3 make autoconf g++ flex bison ccache
|
||||
sudo apt-get install libgoogle-perftools-dev numactl perl-doc
|
||||
sudo apt-get install libelf-dev
|
||||
sudo apt-get install srecord
|
||||
sudo apt-get install libfl2 # Ubuntu only (ignore if gives error)
|
||||
sudo apt-get install libfl-dev # Ubuntu only (ignore if gives error)
|
||||
sudo apt-get install zlibc zlib1g zlib1g-dev # Ubuntu only (ignore if gives error)
|
||||
|
||||
git clone http://git.veripool.org/git/verilator
|
||||
|
||||
# Every time you need to build:
|
||||
unsetenv VERILATOR_ROOT # For csh; ignore error if on bash
|
||||
unset VERILATOR_ROOT # For bash
|
||||
cd verilator
|
||||
|
||||
git pull # Make sure we're up-to-date
|
||||
git checkout v5.008
|
||||
|
||||
autoconf
|
||||
./configure
|
||||
make -j$(nproc)
|
||||
sudo make install
|
||||
```
|
||||
|
||||
At the end you can ensure that Verilator was successfully installed by checking its version:
|
||||
|
||||
```
|
||||
verilator --version
|
||||
```
|
||||
The output should be the following:
|
||||
|
||||
```
|
||||
Verilator 5.008 2023-03-04 rev v5.008
|
||||
```
|
||||
|
||||
- [FuseSoC](https://github.com/olofk/fusesoc), an award-winning package manager and a set of build tools for HDL (Hardware Description Language) code, to automate the process of building the simulations. Ibex uses a [custom fork](https://github.com/lowRISC/fusesoc/tree/ot) of FuseSoC, so we must install it via this method rather than installing FuseSoC separately. For project dependencies, it is more appropriate to use a virtual environment:
|
||||
```
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate
|
||||
pip3 install -U -r python-requirements.txt
|
||||
```
|
||||
|
||||
To build the simulation for the Simple System, run from its directory the following command (while still being inside the virtual environment):
|
||||
|
||||
```
|
||||
cd extended_ibex/ibex_simple_system/
|
||||
fusesoc --cores-root=. run --target=sim --setup --build lowrisc:ibex:ibex_simple_system --RV32E=0 --RV32M=ibex_pkg::RV32MSingleCycle
|
||||
```
|
||||
|
||||
Similarly, in order to build the simulation for the Demo System (the one that we will mapped on the FPGA device) run from its directory the following:
|
||||
|
||||
```
|
||||
cd extended_ibex/ibex_demo_system/
|
||||
fusesoc --cores-root=. run --target=sim --tool=verilator --setup --build lowrisc:ibex:demo_system
|
||||
```
|
||||
When we are done, we can deactivate the virtual environment by running:
|
||||
|
||||
```
|
||||
deactivate
|
||||
```
|
||||
|
||||
### Building Software
|
||||
|
||||
To compile the appropriate C executable for our Quantized Neural Network, we should first make sure that the previously generated C file along with the header files containing the compressed network's parameters and inputs are located in the same folder under the [inference codes](https://github.com/alexmr09/ISA-extensions-for-Multi-Pumped-Soft-SIMD-Operations/tree/main/inference_codes) directory. Within this directory, you'll find compatible software examples that work for both system simulations.
|
||||
Additionally on the [common](https://github.com/alexmr09/ISA-extensions-for-Multi-Pumped-Soft-SIMD-Operations/tree/main/inference_codes/common) subfolder, you'll find the optimized kernels featuring the custom instructions.
|
||||
|
||||
For example, to build the LeNet5 MNIST example, from our root repository run:
|
||||
```
|
||||
make -C inference_codes/lenet5_mnist/optimized
|
||||
```
|
||||
|
||||
The compiled .elf program is available at [inference codes/lenet5_mnist/optimized](https://github.com/alexmr09/ISA-extensions-for-Multi-Pumped-Soft-SIMD-Operations/tree/main/inference_codes/lenet5_mnist/optimized). The same directory also contains a Verilog memory file (vmem file) to be used with some simulators.
|
||||
|
||||
### Running the Simulator
|
||||
|
||||
Having built the simulator and software, to simulate using Verilator we can use the following commands.
|
||||
`<sw_elf_file>` should be a path to an ELF file (or alternatively a vmem file)
|
||||
built as described above. Pass `-t` to get an VCD trace of the execution.
|
||||
|
||||
```
|
||||
# For the Simple System Simuation:
|
||||
./extended_ibex/ibex_simple_system/build/lowrisc_ibex_ibex_simple_system_0/sim-verilator/Vibex_simple_system [-t] --meminit=ram,<sw_elf_file>
|
||||
|
||||
# For the Demo System Simulation:
|
||||
./extended_ibex/ibex_demo_system/build/lowrisc_ibex_demo_system_0/sim-verilator/Vibex_demo_system [-t] --meminit=ram,<sw_elf_file>
|
||||
|
||||
# For example :
|
||||
./extended_ibex/ibex_demo_system/build/lowrisc_ibex_demo_system_0/sim-verilator/Vibex_demo_system \
|
||||
--meminit=ram,./inference_codes/lenet5_mnist/optimized/lenet5_mnist.elf
|
||||
```
|
||||
|
||||
We can utilize the simulation output to extract measurements about the latency of our program and estimate speedup with respect to the original Ibex core.
|
||||
|
||||
```
|
||||
Simulation statistics
|
||||
=====================
|
||||
Executed cycles: 488901
|
||||
Wallclock time: 12.188 s
|
||||
Simulation speed: 40113.3 cycles/s (40.1133 kHz)
|
||||
|
||||
Performance Counters
|
||||
====================
|
||||
Cycles: 480856
|
||||
NONE: 0
|
||||
Instructions Retired: 334753
|
||||
LSU Busy: 121484
|
||||
Fetch Wait: 2168
|
||||
Loads: 117569
|
||||
Stores: 3915
|
||||
Jumps: 7
|
||||
Conditional Branches: 45792
|
||||
Taken Conditional Branches: 8224
|
||||
Compressed Instructions: 43
|
||||
Multiply Wait: 0
|
||||
Divide Wait: 0
|
||||
```
|
||||
|
||||
## References
|
||||
|
||||
<a name="1"> [1] </a> Benoit Jacob, Skirmantas Kligys, Bo Chen, Menglong Zhu, Matthew Tang, Andrew
|
||||
Howard, Hartwig Adam, and Dmitry Kalenichenko. Quantization and training of
|
||||
neural networks for efficient integer-arithmetic-only inference, 2017.
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 88 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 72 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 31 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 66 KiB |
@@ -0,0 +1,3 @@
|
||||
build/
|
||||
.venv/
|
||||
target/
|
||||
@@ -0,0 +1,201 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
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
|
||||
|
||||
http://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.
|
||||
@@ -0,0 +1,434 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright lowRISC contributors.
|
||||
Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
SPDX-License-Identifier: Apache-2.0
|
||||
-->
|
||||
<device schemaVersion="1.1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="CMSIS-SVD.xsd">
|
||||
<vendor>lowRISC</vendor>
|
||||
<name>Ibex Demo System</name>
|
||||
<version>0.1</version>
|
||||
<description>
|
||||
Single-core 3-stage pipeline RISC-V processor,
|
||||
128 KiB on-chip SRAM\n
|
||||
1 x UART, 1 x SPI controller, 1 x PWM channels\n
|
||||
</description>
|
||||
<licenseText>
|
||||
Copyright lowRISC contributors.\n
|
||||
Licensed under the Apache License, Version 2.0, see LICENSE for details.\n
|
||||
SPDX-License-Identifier: Apache-2.0\n
|
||||
</licenseText>
|
||||
<cpu>
|
||||
<name>Ibex</name>
|
||||
<revision>r0p1</revision>
|
||||
<endian>little</endian>
|
||||
<mpuPresent>false</mpuPresent>
|
||||
<fpuPresent>false</fpuPresent>
|
||||
<vtorPresent>1</vtorPresent>
|
||||
<nvicPrioBits>2</nvicPrioBits>
|
||||
<vendorSystickConfig>false</vendorSystickConfig>
|
||||
<deviceNumInterrupts>1</deviceNumInterrupts>
|
||||
</cpu>
|
||||
<addressUnitBits>8</addressUnitBits>
|
||||
<width>32</width>
|
||||
<peripherals>
|
||||
<peripheral>
|
||||
<name>UART0</name>
|
||||
<version>1</version>
|
||||
<baseAddress>0x80001000</baseAddress>
|
||||
<size>32</size>
|
||||
<addressBlock>
|
||||
<offset>0</offset>
|
||||
<size>0x1000</size>
|
||||
<usage>registers</usage>
|
||||
</addressBlock>
|
||||
<interrupt>
|
||||
<name>UART0_IRQ</name>
|
||||
<value>1</value>
|
||||
</interrupt>
|
||||
<registers>
|
||||
<register>
|
||||
<name>RX</name>
|
||||
<description>Rx register, UART_RX</description>
|
||||
<addressOffset>0x0000</addressOffset>
|
||||
<resetValue>0x00000000</resetValue>
|
||||
<fields>
|
||||
<field>
|
||||
<name>DATA</name>
|
||||
<description>Receive (read) data character. Transmit (write) data character.</description>
|
||||
<bitRange>[7:0]</bitRange>
|
||||
<access>read-only</access>
|
||||
</field>
|
||||
</fields>
|
||||
</register>
|
||||
<register>
|
||||
<name>TX</name>
|
||||
<description>Tx register, UART_TX</description>
|
||||
<addressOffset>0x0004</addressOffset>
|
||||
<resetValue>0x00000000</resetValue>
|
||||
<fields>
|
||||
<field>
|
||||
<name>DATA</name>
|
||||
<description>Transmit (write) data character.</description>
|
||||
<bitRange>[7:0]</bitRange>
|
||||
<access>write-only</access>
|
||||
</field>
|
||||
</fields>
|
||||
</register>
|
||||
<register>
|
||||
<name>STATUS</name>
|
||||
<description>Uart Status Register, UART_STATUS</description>
|
||||
<addressOffset>0x0008</addressOffset>
|
||||
<resetValue>0x00000000</resetValue>
|
||||
<fields>
|
||||
<field>
|
||||
<name>TX_FULL</name>
|
||||
<description>1 indicates that the TX FIFO is full.</description>
|
||||
<bitRange>[1:1]</bitRange>
|
||||
<access>read-only</access>
|
||||
</field>
|
||||
<field>
|
||||
<name>RX_EMPTY</name>
|
||||
<description>1 indicates that the RX FIFO is empty.</description>
|
||||
<bitRange>[0:0]</bitRange>
|
||||
<access>read-only</access>
|
||||
</field>
|
||||
</fields>
|
||||
</register>
|
||||
</registers>
|
||||
</peripheral>
|
||||
<peripheral>
|
||||
<name>SPI0</name>
|
||||
<version>1</version>
|
||||
<baseAddress>0x80004000</baseAddress>
|
||||
<size>32</size>
|
||||
<addressBlock>
|
||||
<offset>0</offset>
|
||||
<size>0x1000</size>
|
||||
<usage>registers</usage>
|
||||
</addressBlock>
|
||||
<interrupt>
|
||||
<name>SPI0_IRQ</name>
|
||||
<value>18</value>
|
||||
</interrupt>
|
||||
<registers>
|
||||
<register>
|
||||
<name>TX</name>
|
||||
<description>Tx register, SPI_TX</description>
|
||||
<addressOffset>0x0000</addressOffset>
|
||||
<resetValue>0x00000000</resetValue>
|
||||
<fields>
|
||||
<field>
|
||||
<name>DATA</name>
|
||||
<description>Transmit (write) data character.</description>
|
||||
<bitRange>[7:0]</bitRange>
|
||||
<access>write-only</access>
|
||||
</field>
|
||||
</fields>
|
||||
</register>
|
||||
<register>
|
||||
<name>STATUS</name>
|
||||
<description>SPI Status Register, SPI_STATUS</description>
|
||||
<addressOffset>0x0004</addressOffset>
|
||||
<resetValue>0x00000000</resetValue>
|
||||
<fields>
|
||||
<field>
|
||||
<name>TX_EMPTY</name>
|
||||
<description>1 indicates that the TX FIFO is empty.</description>
|
||||
<bitRange>[1:1]</bitRange>
|
||||
<access>read-only</access>
|
||||
</field>
|
||||
<field>
|
||||
<name>TX_FULL</name>
|
||||
<description>1 indicates that the TX FIFO is full.</description>
|
||||
<bitRange>[0:0]</bitRange>
|
||||
<access>read-only</access>
|
||||
</field>
|
||||
</fields>
|
||||
</register>
|
||||
</registers>
|
||||
</peripheral>
|
||||
<peripheral>
|
||||
<name>PWM0</name>
|
||||
<version>1</version>
|
||||
<description>Simple PWM0</description>
|
||||
<baseAddress>0x80003000</baseAddress>
|
||||
<size>32</size>
|
||||
<addressBlock>
|
||||
<offset>0</offset>
|
||||
<size>0x08</size>
|
||||
<usage>registers</usage>
|
||||
</addressBlock>
|
||||
<interrupt>
|
||||
<name>PWM_IRQ_WRAP</name>
|
||||
<value>4</value>
|
||||
</interrupt>
|
||||
<registers>
|
||||
<register>
|
||||
<name>WIDTH</name>
|
||||
<description>PWM width</description>
|
||||
<addressOffset>0x0000</addressOffset>
|
||||
<resetValue>0x00000000</resetValue>
|
||||
<fields>
|
||||
<field>
|
||||
<name>VALUE</name>
|
||||
<description>Pwm width.</description>
|
||||
<bitRange>[31:0]</bitRange>
|
||||
<access>read-write</access>
|
||||
</field>
|
||||
</fields>
|
||||
</register>
|
||||
<register>
|
||||
<name>COUNTER</name>
|
||||
<description>PWM counter</description>
|
||||
<addressOffset>0x0004</addressOffset>
|
||||
<resetValue>0x00000000</resetValue>
|
||||
<fields>
|
||||
<field>
|
||||
<name>VALUE</name>
|
||||
<description>Pwm counter.</description>
|
||||
<bitRange>[31:0]</bitRange>
|
||||
<access>read-write</access>
|
||||
</field>
|
||||
</fields>
|
||||
</register>
|
||||
</registers>
|
||||
</peripheral>
|
||||
<peripheral derivedFrom="PWM0">
|
||||
<name>PWM1</name>
|
||||
<baseAddress>0x8000A008</baseAddress>
|
||||
<interrupt>
|
||||
<name>PWM1_IRQ_WRAP</name>
|
||||
<value>22</value>
|
||||
</interrupt>
|
||||
</peripheral>
|
||||
<peripheral derivedFrom="PWM0">
|
||||
<name>PWM2</name>
|
||||
<baseAddress>0x80003010</baseAddress>
|
||||
<interrupt>
|
||||
<name>PWM2_IRQ_WRAP</name>
|
||||
<value>21</value>
|
||||
</interrupt>
|
||||
</peripheral>
|
||||
<peripheral derivedFrom="PWM0">
|
||||
<name>PWM3</name>
|
||||
<baseAddress>0x80003018</baseAddress>
|
||||
<interrupt>
|
||||
<name>PWM3_IRQ_WRAP</name>
|
||||
<value>21</value>
|
||||
</interrupt>
|
||||
</peripheral>
|
||||
<peripheral derivedFrom="PWM0">
|
||||
<name>PWM4</name>
|
||||
<baseAddress>0x80003020</baseAddress>
|
||||
<interrupt>
|
||||
<name>PWM4_IRQ_WRAP</name>
|
||||
<value>21</value>
|
||||
</interrupt>
|
||||
</peripheral>
|
||||
<peripheral derivedFrom="PWM0">
|
||||
<name>PWM5</name>
|
||||
<baseAddress>0x80003028</baseAddress>
|
||||
<interrupt>
|
||||
<name>PWM5_IRQ_WRAP</name>
|
||||
<value>21</value>
|
||||
</interrupt>
|
||||
</peripheral>
|
||||
<peripheral derivedFrom="PWM0">
|
||||
<name>PWM6</name>
|
||||
<baseAddress>0x80003030</baseAddress>
|
||||
<interrupt>
|
||||
<name>PWM6_IRQ_WRAP</name>
|
||||
<value>21</value>
|
||||
</interrupt>
|
||||
</peripheral>
|
||||
<peripheral derivedFrom="PWM0">
|
||||
<name>PWM7</name>
|
||||
<baseAddress>0x80003038</baseAddress>
|
||||
<interrupt>
|
||||
<name>PWM7_IRQ_WRAP</name>
|
||||
<value>21</value>
|
||||
</interrupt>
|
||||
</peripheral>
|
||||
<peripheral derivedFrom="PWM0">
|
||||
<name>PWM8</name>
|
||||
<baseAddress>0x80003040</baseAddress>
|
||||
<interrupt>
|
||||
<name>PWM8_IRQ_WRAP</name>
|
||||
<value>21</value>
|
||||
</interrupt>
|
||||
</peripheral>
|
||||
<peripheral derivedFrom="PWM0">
|
||||
<name>PWM9</name>
|
||||
<baseAddress>0x80003048</baseAddress>
|
||||
<interrupt>
|
||||
<name>PWM9_IRQ_WRAP</name>
|
||||
<value>21</value>
|
||||
</interrupt>
|
||||
</peripheral>
|
||||
<peripheral derivedFrom="PWM0">
|
||||
<name>PWM10</name>
|
||||
<baseAddress>0x80003050</baseAddress>
|
||||
<interrupt>
|
||||
<name>PWM10_IRQ_WRAP</name>
|
||||
<value>21</value>
|
||||
</interrupt>
|
||||
</peripheral>
|
||||
<peripheral derivedFrom="PWM0">
|
||||
<name>PWM11</name>
|
||||
<baseAddress>0x80003058</baseAddress>
|
||||
<interrupt>
|
||||
<name>PWM11_IRQ_WRAP</name>
|
||||
<value>21</value>
|
||||
</interrupt>
|
||||
</peripheral>
|
||||
<peripheral>
|
||||
<name>TIMER0</name>
|
||||
<version>1</version>
|
||||
<description>Controls timer</description>
|
||||
<baseAddress>0x80002000</baseAddress>
|
||||
<size>32</size>
|
||||
<addressBlock>
|
||||
<offset>0</offset>
|
||||
<size>0x1000</size>
|
||||
<usage>registers</usage>
|
||||
</addressBlock>
|
||||
<interrupt>
|
||||
<name>TIMER_IRQ_0</name>
|
||||
<value>7</value>
|
||||
</interrupt>
|
||||
<registers>
|
||||
<register>
|
||||
<name>MTIMEL</name>
|
||||
<description>mtime low</description>
|
||||
<addressOffset>0x0000</addressOffset>
|
||||
<resetValue>0x00000000</resetValue>
|
||||
<fields>
|
||||
<field>
|
||||
<name>VALUE</name>
|
||||
<description>mtime low</description>
|
||||
<bitRange>[31:0]</bitRange>
|
||||
<access>read-write</access>
|
||||
</field>
|
||||
</fields>
|
||||
</register>
|
||||
<register>
|
||||
<name>MTIMEH</name>
|
||||
<description>mtime high</description>
|
||||
<addressOffset>0x0004</addressOffset>
|
||||
<resetValue>0x00000000</resetValue>
|
||||
<fields>
|
||||
<field>
|
||||
<name>VALUE</name>
|
||||
<description>mtime high</description>
|
||||
<bitRange>[31:0]</bitRange>
|
||||
<access>read-write</access>
|
||||
</field>
|
||||
</fields>
|
||||
</register>
|
||||
<register>
|
||||
<name>MTIMECMPL</name>
|
||||
<description>mtime cmp low</description>
|
||||
<addressOffset>0x0008</addressOffset>
|
||||
<resetValue>0x00000000</resetValue>
|
||||
<fields>
|
||||
<field>
|
||||
<name>VALUE</name>
|
||||
<description>mtime cmp low</description>
|
||||
<bitRange>[31:0]</bitRange>
|
||||
<access>read-write</access>
|
||||
</field>
|
||||
</fields>
|
||||
</register>
|
||||
<register>
|
||||
<name>MTIMECMPH</name>
|
||||
<description>mtime cmp high</description>
|
||||
<addressOffset>0x000C</addressOffset>
|
||||
<resetValue>0x00000000</resetValue>
|
||||
<fields>
|
||||
<field>
|
||||
<name>VALUE</name>
|
||||
<description>mtime cmp high</description>
|
||||
<bitRange>[31:0]</bitRange>
|
||||
<access>read-write</access>
|
||||
</field>
|
||||
</fields>
|
||||
</register>
|
||||
</registers>
|
||||
</peripheral>
|
||||
<peripheral>
|
||||
<name>GPIOA</name>
|
||||
<version>1</version>
|
||||
<description>Gpio port a</description>
|
||||
<baseAddress>0x80000000</baseAddress>
|
||||
<size>32</size>
|
||||
<addressBlock>
|
||||
<offset>0</offset>
|
||||
<size>0x1000</size>
|
||||
<usage>registers</usage>
|
||||
</addressBlock>
|
||||
<interrupt>
|
||||
<name>GPIOA_IRQ</name>
|
||||
<value>0</value>
|
||||
</interrupt>
|
||||
<registers>
|
||||
<register>
|
||||
<name>OUT</name>
|
||||
<description>Write to control the gpio state</description>
|
||||
<addressOffset>0x0000</addressOffset>
|
||||
<resetValue>0x00000000</resetValue>
|
||||
<fields>
|
||||
<field>
|
||||
<name>PINS</name>
|
||||
<description>Pins.</description>
|
||||
<bitRange>[31:0]</bitRange>
|
||||
<access>read-write</access>
|
||||
</field>
|
||||
</fields>
|
||||
</register>
|
||||
<register>
|
||||
<name>IN</name>
|
||||
<description>Read the gpio state</description>
|
||||
<addressOffset>0x0004</addressOffset>
|
||||
<resetValue>0x00000000</resetValue>
|
||||
<fields>
|
||||
<field>
|
||||
<name>PINS</name>
|
||||
<description>Pins.</description>
|
||||
<bitRange>[31:0]</bitRange>
|
||||
<access>read-only</access>
|
||||
</field>
|
||||
</fields>
|
||||
</register>
|
||||
<register>
|
||||
<name>IN_DBNC</name>
|
||||
<description>DBNC</description>
|
||||
<addressOffset>0x0008</addressOffset>
|
||||
<resetValue>0x00000000</resetValue>
|
||||
<fields>
|
||||
<field>
|
||||
<name>VALUE</name>
|
||||
<description>DBNC.</description>
|
||||
<bitRange>[31:0]</bitRange>
|
||||
<access>read-write</access>
|
||||
</field>
|
||||
</fields>
|
||||
</register>
|
||||
<register>
|
||||
<name>OUT_SHIFT</name>
|
||||
<description>Shift register</description>
|
||||
<addressOffset>0x000C</addressOffset>
|
||||
<resetValue>0x00000000</resetValue>
|
||||
<fields>
|
||||
<field>
|
||||
<name>VALUE</name>
|
||||
<description>Shift.</description>
|
||||
<bitRange>[31:0]</bitRange>
|
||||
<access>read-write</access>
|
||||
</field>
|
||||
</fields>
|
||||
</register>
|
||||
</registers>
|
||||
</peripheral>
|
||||
</peripherals>
|
||||
</device>
|
||||
@@ -0,0 +1,12 @@
|
||||
╓╗Φ╬╬╫╫╬╬Æ╗w
|
||||
╔╬╫╫╫╫╫╫╫╫M "╣╬╗
|
||||
╔╣╫╫╫╫╣╝╝╣╫╫╕ ╬╫╫╫╗
|
||||
╬╫Å╝╝╝╛ ╟╫╫╬ ß╣╫╫╫╫╫▌ .╓,
|
||||
╔╜╓╬╬╬╬N ,╣╫╫╫⌐╢╫╫╫╫╫╫╣^ ║█▌ ║█████▓⌐ ╫█▌ ╓▓████▌ ▄▓████▌
|
||||
╔╬╫╫Å╜╙╝╫╫╫╫╫╫╫Å,╬╫╫╫╫▌"╔╣ ║█▌ ╓▄▓▓# Φ▓⌐ ▓▓ ▓▓ ╫█▌ ▓█▌ ▓█▌ ▀█▌▄╓, ▓█▌
|
||||
╣╫╫M ╟╫╫╫╫M,Φ╫╫╫╫Å`╔╣╫╫ ║█▌ █▌ '█M╙█▌╓██▌║█▌ ╫█████▀ ▓█▌ `╙▀██▓ ██▌
|
||||
╙╫╣╜╓,,╔╣╫╣╜╓╬╫╫╫╫M,╗▓╫╫╫M ║█▌ ▀█▄▄▓█ ╢██▌╙██▌ ╫█▌ ╙██▄ ▓█▌ ╣▓▄▄▓█▀ ╙██▓▄▓▓▌
|
||||
"╔╣╫╫╫╫▌╨╔╬╫Å╝╣╜╓╬╫╫╫╫╫Å `` `` `` `` ``` ` ``` ``` """`
|
||||
╙╣╫╫Å"╔╣╫╬ ╙╫╫╫╫╫╫╜
|
||||
"`╗╣╫╫╫╬, ╔╫╫╫╣╜
|
||||
`╙╝╝Φ╣╣ΦÅ╝╜"
|
||||
@@ -0,0 +1,223 @@
|
||||
## Based on https://github.com/Digilent/digilent-xdc/blob/master/Arty-A7-100-Master.xdc
|
||||
## This file is a general .xdc for the Arty A7-100 Rev. D
|
||||
## To use it in a project:
|
||||
## - uncomment the lines corresponding to used pins
|
||||
## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project
|
||||
|
||||
## Clock signal
|
||||
set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { IO_CLK }]; #IO_L12P_T1_MRCC_35 Sch=gclk[100]
|
||||
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports { IO_CLK }];
|
||||
|
||||
## Switches
|
||||
set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { SW[0] }]; #IO_L12N_T1_MRCC_16 Sch=sw[0]
|
||||
set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { SW[1] }]; #IO_L13P_T2_MRCC_16 Sch=sw[1]
|
||||
set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { SW[2] }]; #IO_L13N_T2_MRCC_16 Sch=sw[2]
|
||||
set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { SW[3] }]; #IO_L14P_T2_SRCC_16 Sch=sw[3]
|
||||
|
||||
## RGB LEDs
|
||||
set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { RGB_LED[0] }]; #IO_L18N_T2_35 Sch=led0_b
|
||||
set_property -dict { PACKAGE_PIN F6 IOSTANDARD LVCMOS33 } [get_ports { RGB_LED[1] }]; #IO_L19N_T3_VREF_35 Sch=led0_g
|
||||
set_property -dict { PACKAGE_PIN G6 IOSTANDARD LVCMOS33 } [get_ports { RGB_LED[2] }]; #IO_L19P_T3_35 Sch=led0_r
|
||||
set_property -dict { PACKAGE_PIN G4 IOSTANDARD LVCMOS33 } [get_ports { RGB_LED[3] }]; #IO_L20P_T3_35 Sch=led1_b
|
||||
set_property -dict { PACKAGE_PIN J4 IOSTANDARD LVCMOS33 } [get_ports { RGB_LED[4] }]; #IO_L21P_T3_DQS_35 Sch=led1_g
|
||||
set_property -dict { PACKAGE_PIN G3 IOSTANDARD LVCMOS33 } [get_ports { RGB_LED[5] }]; #IO_L20N_T3_35 Sch=led1_r
|
||||
set_property -dict { PACKAGE_PIN H4 IOSTANDARD LVCMOS33 } [get_ports { RGB_LED[6] }]; #IO_L21N_T3_DQS_35 Sch=led2_b
|
||||
set_property -dict { PACKAGE_PIN J2 IOSTANDARD LVCMOS33 } [get_ports { RGB_LED[7] }]; #IO_L22N_T3_35 Sch=led2_g
|
||||
set_property -dict { PACKAGE_PIN J3 IOSTANDARD LVCMOS33 } [get_ports { RGB_LED[8] }]; #IO_L22P_T3_35 Sch=led2_r
|
||||
set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { RGB_LED[9] }]; #IO_L23P_T3_35 Sch=led3_b
|
||||
set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { RGB_LED[10] }]; #IO_L24P_T3_35 Sch=led3_g
|
||||
set_property -dict { PACKAGE_PIN K1 IOSTANDARD LVCMOS33 } [get_ports { RGB_LED[11] }]; #IO_L23N_T3_35 Sch=led3_r
|
||||
|
||||
## LEDs
|
||||
set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { LED[0] }]; #IO_L24N_T3_35 Sch=led[4]
|
||||
set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { LED[1] }]; #IO_25_35 Sch=led[5]
|
||||
set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { LED[2] }]; #IO_L24P_T3_A01_D17_14 Sch=led[6]
|
||||
set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { LED[3] }]; #IO_L24N_T3_A00_D16_14 Sch=led[7]
|
||||
|
||||
## Buttons
|
||||
set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { BTN[0] }]; #IO_L6N_T0_VREF_16 Sch=btn[0]
|
||||
set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { BTN[1] }]; #IO_L11P_T1_SRCC_16 Sch=btn[1]
|
||||
set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { BTN[2] }]; #IO_L11N_T1_SRCC_16 Sch=btn[2]
|
||||
set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { BTN[3] }]; #IO_L12P_T1_MRCC_16 Sch=btn[3]
|
||||
|
||||
## Pmod Header JA
|
||||
#set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 } [get_ports { ja[0] }]; #IO_0_15 Sch=ja[1]
|
||||
#set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { ja[1] }]; #IO_L4P_T0_15 Sch=ja[2]
|
||||
#set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { ja[2] }]; #IO_L4N_T0_15 Sch=ja[3]
|
||||
#set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { ja[3] }]; #IO_L6P_T0_15 Sch=ja[4]
|
||||
#set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 } [get_ports { ja[4] }]; #IO_L6N_T0_VREF_15 Sch=ja[7]
|
||||
#set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVCMOS33 } [get_ports { ja[5] }]; #IO_L10P_T1_AD11P_15 Sch=ja[8]
|
||||
#set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVCMOS33 } [get_ports { ja[6] }]; #IO_L10N_T1_AD11N_15 Sch=ja[9]
|
||||
#set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { ja[7] }]; #IO_25_15 Sch=ja[10]
|
||||
|
||||
## Pmod Header JB
|
||||
#set_property -dict { PACKAGE_PIN E15 IOSTANDARD LVCMOS33 } [get_ports { jb[0] }]; #IO_L11P_T1_SRCC_15 Sch=jb_p[1]
|
||||
#set_property -dict { PACKAGE_PIN E16 IOSTANDARD LVCMOS33 } [get_ports { jb[1] }]; #IO_L11N_T1_SRCC_15 Sch=jb_n[1]
|
||||
#set_property -dict { PACKAGE_PIN D15 IOSTANDARD LVCMOS33 } [get_ports { jb[2] }]; #IO_L12P_T1_MRCC_15 Sch=jb_p[2]
|
||||
#set_property -dict { PACKAGE_PIN C15 IOSTANDARD LVCMOS33 } [get_ports { jb[3] }]; #IO_L12N_T1_MRCC_15 Sch=jb_n[2]
|
||||
#set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { jb[4] }]; #IO_L23P_T3_FOE_B_15 Sch=jb_p[3]
|
||||
#set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { jb[5] }]; #IO_L23N_T3_FWE_B_15 Sch=jb_n[3]
|
||||
#set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { jb[6] }]; #IO_L24P_T3_RS1_15 Sch=jb_p[4]
|
||||
#set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { jb[7] }]; #IO_L24N_T3_RS0_15 Sch=jb_n[4]
|
||||
|
||||
## Pmod Header JC
|
||||
#set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { jc[0] }]; #IO_L20P_T3_A08_D24_14 Sch=jc_p[1]
|
||||
#set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { jc[1] }]; #IO_L20N_T3_A07_D23_14 Sch=jc_n[1]
|
||||
#set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { jc[2] }]; #IO_L21P_T3_DQS_14 Sch=jc_p[2]
|
||||
#set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { jc[3] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=jc_n[2]
|
||||
#set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { jc[4] }]; #IO_L22P_T3_A05_D21_14 Sch=jc_p[3]
|
||||
#set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { jc[5] }]; #IO_L22N_T3_A04_D20_14 Sch=jc_n[3]
|
||||
#set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { jc[6] }]; #IO_L23P_T3_A03_D19_14 Sch=jc_p[4]
|
||||
#set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { jc[7] }]; #IO_L23N_T3_A02_D18_14 Sch=jc_n[4]
|
||||
|
||||
## Pmod Header JD
|
||||
#set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { JTAG_TDO }]; #IO_L11N_T1_SRCC_35 Sch=jd[1]
|
||||
#set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { JTAG_TRST_N }]; #IO_L12N_T1_MRCC_35 Sch=jd[2]
|
||||
#set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { JTAG_TCK }]; #IO_L13P_T2_MRCC_35 Sch=jd[3]
|
||||
##set_property -dict { PACKAGE_PIN F3 IOSTANDARD LVCMOS33 } [get_ports { jd[3] }]; #IO_L13N_T2_MRCC_35 Sch=jd[4]
|
||||
#set_property -dict { PACKAGE_PIN E2 IOSTANDARD LVCMOS33 } [get_ports { JTAG_TDI }]; #IO_L14P_T2_SRCC_35 Sch=jd[7]
|
||||
#set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { JTAG_TMS }]; #IO_L14N_T2_SRCC_35 Sch=jd[8]
|
||||
#set_property -dict { PACKAGE_PIN H2 IOSTANDARD LVCMOS33 } [get_ports { JTAG_RESET_N }]; #IO_L15P_T2_DQS_35 Sch=jd[9]
|
||||
#set_property -dict { PACKAGE_PIN G2 IOSTANDARD LVCMOS33 } [get_ports { jd[7] }]; #IO_L15N_T2_DQS_35 Sch=jd[10]
|
||||
|
||||
#set_property PULLUP true [get_ports { JTAG_TRST_N }];
|
||||
#set_property PULLUP true [get_ports { JTAG_TCK }];
|
||||
#set_property PULLUP true [get_ports { JTAG_TDI }];
|
||||
#set_property PULLUP true [get_ports { JTAG_TMS }];
|
||||
#set_property PULLUP true [get_ports { JTAG_RESET_N }];
|
||||
|
||||
## USB-UART Interface
|
||||
set_property -dict { PACKAGE_PIN D10 IOSTANDARD LVCMOS33 } [get_ports { UART_TX }]; #IO_L19N_T3_VREF_16 Sch=uart_rxd_out
|
||||
set_property -dict { PACKAGE_PIN A9 IOSTANDARD LVCMOS33 } [get_ports { UART_RX }]; #IO_L14N_T2_SRCC_16 Sch=uart_txd_in
|
||||
|
||||
## ChipKit Outer Digital Header
|
||||
#set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { ck_io0 }]; #IO_L16P_T2_CSI_B_14 Sch=ck_io[0]
|
||||
#set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { ck_io1 }]; #IO_L18P_T2_A12_D28_14 Sch=ck_io[1]
|
||||
#set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { ck_io2 }]; #IO_L8N_T1_D12_14 Sch=ck_io[2]
|
||||
#set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { ck_io3 }]; #IO_L19P_T3_A10_D26_14 Sch=ck_io[3]
|
||||
#set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { ck_io4 }]; #IO_L5P_T0_D06_14 Sch=ck_io[4]
|
||||
#set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { ck_io5 }]; #IO_L14P_T2_SRCC_14 Sch=ck_io[5]
|
||||
#set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { ck_io6 }]; #IO_L14N_T2_SRCC_14 Sch=ck_io[6]
|
||||
#set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { ck_io7 }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=ck_io[7]
|
||||
#set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { ck_io8 }]; #IO_L11P_T1_SRCC_14 Sch=ck_io[8]
|
||||
#set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { ck_io9 }]; #IO_L10P_T1_D14_14 Sch=ck_io[9]
|
||||
#set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { ck_io10 }]; #IO_L18N_T2_A11_D27_14 Sch=ck_io[10]
|
||||
#set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { ck_io11 }]; #IO_L17N_T2_A13_D29_14 Sch=ck_io[11]
|
||||
#set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { ck_io12 }]; #IO_L12N_T1_MRCC_14 Sch=ck_io[12]
|
||||
#set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { ck_io13 }]; #IO_L12P_T1_MRCC_14 Sch=ck_io[13]
|
||||
|
||||
## ChipKit Inner Digital Header
|
||||
#set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { ck_io26 }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=ck_io[26]
|
||||
#set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { ck_io27 }]; #IO_L16N_T2_A15_D31_14 Sch=ck_io[27]
|
||||
#set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { ck_io28 }]; #IO_L6N_T0_D08_VREF_14 Sch=ck_io[28]
|
||||
#set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { ck_io29 }]; #IO_25_14 Sch=ck_io[29]
|
||||
#set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { ck_io30 }]; #IO_0_14 Sch=ck_io[30]
|
||||
#set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { ck_io31 }]; #IO_L5N_T0_D07_14 Sch=ck_io[31]
|
||||
#set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { ck_io32 }]; #IO_L13N_T2_MRCC_14 Sch=ck_io[32]
|
||||
#set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { ck_io33 }]; #IO_L13P_T2_MRCC_14 Sch=ck_io[33]
|
||||
#set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { ck_io34 }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=ck_io[34]
|
||||
#set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { ck_io35 }]; #IO_L11N_T1_SRCC_14 Sch=ck_io[35]
|
||||
#set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { ck_io36 }]; #IO_L8P_T1_D11_14 Sch=ck_io[36]
|
||||
#set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { ck_io37 }]; #IO_L17P_T2_A14_D30_14 Sch=ck_io[37]
|
||||
#set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { ck_io38 }]; #IO_L7N_T1_D10_14 Sch=ck_io[38]
|
||||
#set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { ck_io39 }]; #IO_L7P_T1_D09_14 Sch=ck_io[39]
|
||||
#set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { ck_io40 }]; #IO_L9N_T1_DQS_D13_14 Sch=ck_io[40]
|
||||
#set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { ck_io41 }]; #IO_L9P_T1_DQS_14 Sch=ck_io[41]
|
||||
|
||||
## ChipKit Outer Analog Header - as Single-Ended Analog Inputs
|
||||
## NOTE: These ports can be used as single-ended analog inputs with voltages from 0-3.3V (ChipKit analog pins A0-A5) or as digital I/O.
|
||||
## WARNING: Do not use both sets of constraints at the same time!
|
||||
## NOTE: The following constraints should be used with the XADC IP core when using these ports as analog inputs.
|
||||
#set_property -dict { PACKAGE_PIN C5 IOSTANDARD LVCMOS33 } [get_ports { vaux4_n }]; #IO_L1N_T0_AD4N_35 Sch=ck_an_n[0] ChipKit pin=A0
|
||||
#set_property -dict { PACKAGE_PIN C6 IOSTANDARD LVCMOS33 } [get_ports { vaux4_p }]; #IO_L1P_T0_AD4P_35 Sch=ck_an_p[0] ChipKit pin=A0
|
||||
#set_property -dict { PACKAGE_PIN A5 IOSTANDARD LVCMOS33 } [get_ports { vaux5_n }]; #IO_L3N_T0_DQS_AD5N_35 Sch=ck_an_n[1] ChipKit pin=A1
|
||||
#set_property -dict { PACKAGE_PIN A6 IOSTANDARD LVCMOS33 } [get_ports { vaux5_p }]; #IO_L3P_T0_DQS_AD5P_35 Sch=ck_an_p[1] ChipKit pin=A1
|
||||
#set_property -dict { PACKAGE_PIN B4 IOSTANDARD LVCMOS33 } [get_ports { vaux6_n }]; #IO_L7N_T1_AD6N_35 Sch=ck_an_n[2] ChipKit pin=A2
|
||||
#set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { vaux6_p }]; #IO_L7P_T1_AD6P_35 Sch=ck_an_p[2] ChipKit pin=A2
|
||||
#set_property -dict { PACKAGE_PIN A1 IOSTANDARD LVCMOS33 } [get_ports { vaux7_n }]; #IO_L9N_T1_DQS_AD7N_35 Sch=ck_an_n[3] ChipKit pin=A3
|
||||
#set_property -dict { PACKAGE_PIN B1 IOSTANDARD LVCMOS33 } [get_ports { vaux7_p }]; #IO_L9P_T1_DQS_AD7P_35 Sch=ck_an_p[3] ChipKit pin=A3
|
||||
#set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { vaux15_n }]; #IO_L10N_T1_AD15N_35 Sch=ck_an_n[4] ChipKit pin=A4
|
||||
#set_property -dict { PACKAGE_PIN B3 IOSTANDARD LVCMOS33 } [get_ports { vaux15_p }]; #IO_L10P_T1_AD15P_35 Sch=ck_an_p[4] ChipKit pin=A4
|
||||
#set_property -dict { PACKAGE_PIN C14 IOSTANDARD LVCMOS33 } [get_ports { vaux0_n }]; #IO_L1N_T0_AD0N_15 Sch=ck_an_n[5] ChipKit pin=A5
|
||||
#set_property -dict { PACKAGE_PIN D14 IOSTANDARD LVCMOS33 } [get_ports { vaux0_p }]; #IO_L1P_T0_AD0P_15 Sch=ck_an_p[5] ChipKit pin=A5
|
||||
## ChipKit Outer Analog Header - as Digital I/O
|
||||
## NOTE: The following constraints should be used when using these ports as digital I/O.
|
||||
#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { ck_a0 }]; #IO_0_35 Sch=ck_a[0]
|
||||
#set_property -dict { PACKAGE_PIN D8 IOSTANDARD LVCMOS33 } [get_ports { ck_a1 }]; #IO_L4P_T0_35 Sch=ck_a[1]
|
||||
#set_property -dict { PACKAGE_PIN C7 IOSTANDARD LVCMOS33 } [get_ports { ck_a2 }]; #IO_L4N_T0_35 Sch=ck_a[2]
|
||||
#set_property -dict { PACKAGE_PIN E7 IOSTANDARD LVCMOS33 } [get_ports { ck_a3 }]; #IO_L6P_T0_35 Sch=ck_a[3]
|
||||
#set_property -dict { PACKAGE_PIN D7 IOSTANDARD LVCMOS33 } [get_ports { ck_a4 }]; #IO_L6N_T0_VREF_35 Sch=ck_a[4]
|
||||
#set_property -dict { PACKAGE_PIN D5 IOSTANDARD LVCMOS33 } [get_ports { ck_a5 }]; #IO_L11P_T1_SRCC_35 Sch=ck_a[5]
|
||||
|
||||
## ChipKit Inner Analog Header - as Differential Analog Inputs
|
||||
## NOTE: These ports can be used as differential analog inputs with voltages from 0-1.0V (ChipKit analog pins A6-A11) or as digital I/O.
|
||||
## WARNING: Do not use both sets of constraints at the same time!
|
||||
## NOTE: The following constraints should be used with the XADC core when using these ports as analog inputs.
|
||||
#set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { vaux12_p }]; #IO_L2P_T0_AD12P_35 Sch=ad_p[12] ChipKit pin=A6
|
||||
#set_property -dict { PACKAGE_PIN B6 IOSTANDARD LVCMOS33 } [get_ports { vaux12_n }]; #IO_L2N_T0_AD12N_35 Sch=ad_n[12] ChipKit pin=A7
|
||||
#set_property -dict { PACKAGE_PIN E6 IOSTANDARD LVCMOS33 } [get_ports { vaux13_p }]; #IO_L5P_T0_AD13P_35 Sch=ad_p[13] ChipKit pin=A8
|
||||
#set_property -dict { PACKAGE_PIN E5 IOSTANDARD LVCMOS33 } [get_ports { vaux13_n }]; #IO_L5N_T0_AD13N_35 Sch=ad_n[13] ChipKit pin=A9
|
||||
#set_property -dict { PACKAGE_PIN A4 IOSTANDARD LVCMOS33 } [get_ports { vaux14_p }]; #IO_L8P_T1_AD14P_35 Sch=ad_p[14] ChipKit pin=A10
|
||||
#set_property -dict { PACKAGE_PIN A3 IOSTANDARD LVCMOS33 } [get_ports { vaux14_n }]; #IO_L8N_T1_AD14N_35 Sch=ad_n[14] ChipKit pin=A11
|
||||
## ChipKit Inner Analog Header - as Digital I/O
|
||||
## NOTE: The following constraints should be used when using the inner analog header ports as digital I/O.
|
||||
set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { DISP_CTRL[0] }]; #IO_L2P_T0_AD12P_35 Sch=ad_p[12]
|
||||
set_property -dict { PACKAGE_PIN B6 IOSTANDARD LVCMOS33 } [get_ports { DISP_CTRL[1] }]; #IO_L2N_T0_AD12N_35 Sch=ad_n[12]
|
||||
set_property -dict { PACKAGE_PIN E6 IOSTANDARD LVCMOS33 } [get_ports { DISP_CTRL[2] }]; #IO_L5P_T0_AD13P_35 Sch=ad_p[13]
|
||||
set_property -dict { PACKAGE_PIN E5 IOSTANDARD LVCMOS33 } [get_ports { SPI_TX }]; #IO_L5N_T0_AD13N_35 Sch=ad_n[13]
|
||||
set_property -dict { PACKAGE_PIN A4 IOSTANDARD LVCMOS33 } [get_ports { SPI_SCK }]; #IO_L8P_T1_AD14P_35 Sch=ad_p[14]
|
||||
set_property -dict { PACKAGE_PIN A3 IOSTANDARD LVCMOS33 } [get_ports { DISP_CTRL[3] }]; #IO_L8N_T1_AD14N_35 Sch=ad_n[14]
|
||||
|
||||
## ChipKit SPI
|
||||
#set_property -dict { PACKAGE_PIN G1 IOSTANDARD LVCMOS33 } [get_ports { SPI_RX }]; #IO_L17N_T2_35 Sch=ck_miso
|
||||
#set_property -dict { PACKAGE_PIN H1 IOSTANDARD LVCMOS33 } [get_ports { SPI_TX }]; #IO_L17P_T2_35 Sch=ck_mosi
|
||||
#set_property -dict { PACKAGE_PIN F1 IOSTANDARD LVCMOS33 } [get_ports { SPI_SCK }]; #IO_L18P_T2_35 Sch=ck_sck
|
||||
#set_property -dict { PACKAGE_PIN C1 IOSTANDARD LVCMOS33 } [get_ports { DISP_CTRL[1] }]; #IO_L16N_T2_35 Sch=ck_ss
|
||||
|
||||
## ChipKit I2C
|
||||
#set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { ck_scl }]; #IO_L4P_T0_D04_14 Sch=ck_scl
|
||||
#set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { ck_sda }]; #IO_L4N_T0_D05_14 Sch=ck_sda
|
||||
#set_property -dict { PACKAGE_PIN A14 IOSTANDARD LVCMOS33 } [get_ports { scl_pup }]; #IO_L9N_T1_DQS_AD3N_15 Sch=scl_pup
|
||||
#set_property -dict { PACKAGE_PIN A13 IOSTANDARD LVCMOS33 } [get_ports { sda_pup }]; #IO_L9P_T1_DQS_AD3P_15 Sch=sda_pup
|
||||
|
||||
## Misc. ChipKit Ports
|
||||
#set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { ck_ioa }]; #IO_L10N_T1_D15_14 Sch=ck_ioa
|
||||
set_property -dict { PACKAGE_PIN C2 IOSTANDARD LVCMOS33 } [get_ports { IO_RST_N }]; #IO_L16P_T2_35 Sch=ck_rst
|
||||
|
||||
## SMSC Ethernet PHY
|
||||
#set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { eth_col }]; #IO_L16N_T2_A27_15 Sch=eth_col
|
||||
#set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { eth_crs }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=eth_crs
|
||||
#set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports { eth_mdc }]; #IO_L14N_T2_SRCC_15 Sch=eth_mdc
|
||||
#set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { eth_mdio }]; #IO_L17P_T2_A26_15 Sch=eth_mdio
|
||||
#set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { eth_ref_clk }]; #IO_L22P_T3_A17_15 Sch=eth_ref_clk
|
||||
#set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { eth_rstn }]; #IO_L20P_T3_A20_15 Sch=eth_rstn
|
||||
#set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports { eth_rx_clk }]; #IO_L14P_T2_SRCC_15 Sch=eth_rx_clk
|
||||
#set_property -dict { PACKAGE_PIN G16 IOSTANDARD LVCMOS33 } [get_ports { eth_rx_dv }]; #IO_L13N_T2_MRCC_15 Sch=eth_rx_dv
|
||||
#set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[0] }]; #IO_L21N_T3_DQS_A18_15 Sch=eth_rxd[0]
|
||||
#set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[1] }]; #IO_L16P_T2_A28_15 Sch=eth_rxd[1]
|
||||
#set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[2] }]; #IO_L21P_T3_DQS_15 Sch=eth_rxd[2]
|
||||
#set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[3] }]; #IO_L18N_T2_A23_15 Sch=eth_rxd[3]
|
||||
#set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { eth_rxerr }]; #IO_L20N_T3_A19_15 Sch=eth_rxerr
|
||||
#set_property -dict { PACKAGE_PIN H16 IOSTANDARD LVCMOS33 } [get_ports { eth_tx_clk }]; #IO_L13P_T2_MRCC_15 Sch=eth_tx_clk
|
||||
#set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { eth_tx_en }]; #IO_L19N_T3_A21_VREF_15 Sch=eth_tx_en
|
||||
#set_property -dict { PACKAGE_PIN H14 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[0] }]; #IO_L15P_T2_DQS_15 Sch=eth_txd[0]
|
||||
#set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[1] }]; #IO_L19P_T3_A22_15 Sch=eth_txd[1]
|
||||
#set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[2] }]; #IO_L17N_T2_A25_15 Sch=eth_txd[2]
|
||||
#set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[3] }]; #IO_L18P_T2_A24_15 Sch=eth_txd[3]
|
||||
|
||||
## Quad SPI Flash
|
||||
#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { qspi_cs }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_cs
|
||||
#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[0] }]; #IO_L1P_T0_D00_MOSI_14 Sch=qspi_dq[0]
|
||||
#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1]
|
||||
#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2]
|
||||
#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3]
|
||||
|
||||
## Power Measurements
|
||||
#set_property -dict { PACKAGE_PIN B17 IOSTANDARD LVCMOS33 } [get_ports { vsnsvu_n }]; #IO_L7N_T1_AD2N_15 Sch=ad_n[2]
|
||||
#set_property -dict { PACKAGE_PIN B16 IOSTANDARD LVCMOS33 } [get_ports { vsnsvu_p }]; #IO_L7P_T1_AD2P_15 Sch=ad_p[2]
|
||||
#set_property -dict { PACKAGE_PIN B12 IOSTANDARD LVCMOS33 } [get_ports { vsns5v0_n }]; #IO_L3N_T0_DQS_AD1N_15 Sch=ad_n[1]
|
||||
#set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { vsns5v0_p }]; #IO_L3P_T0_DQS_AD1P_15 Sch=ad_p[1]
|
||||
#set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports { isns5v0_n }]; #IO_L5N_T0_AD9N_15 Sch=ad_n[9]
|
||||
#set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports { isns5v0_p }]; #IO_L5P_T0_AD9P_15 Sch=ad_p[9]
|
||||
#set_property -dict { PACKAGE_PIN A16 IOSTANDARD LVCMOS33 } [get_ports { isns0v95_n }]; #IO_L8N_T1_AD10N_15 Sch=ad_n[10]
|
||||
#set_property -dict { PACKAGE_PIN A15 IOSTANDARD LVCMOS33 } [get_ports { isns0v95_p }]; #IO_L8P_T1_AD10P_15 Sch=ad_p[10]
|
||||
@@ -0,0 +1,32 @@
|
||||
## Clocks
|
||||
set_property -dict { PACKAGE_PIN N13 IOSTANDARD LVCMOS33 } [get_ports { I_pll_clk1 }];
|
||||
set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { I_cw_clkin }];
|
||||
|
||||
create_clock -period 10.000 -name pll_clk1 -waveform {0.000 5.000} [get_nets I_pll_clk1]
|
||||
create_clock -period 10.000 -name cw_clkin -waveform {0.000 5.000} [get_nets I_cw_clkin]
|
||||
|
||||
## Switches
|
||||
set_property -dict { PACKAGE_PIN J16 IOSTANDARD LVCMOS33 } [get_ports { J16 }]; #IO_L12N_T1_MRCC_16 Sch=sw[0]
|
||||
set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { K16 }]; #IO_L13P_T2_MRCC_16 Sch=sw[1]
|
||||
set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { L14 }]; #IO_L13N_T2_MRCC_16 Sch=sw[2]
|
||||
set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { K15 }]; #IO_L14P_T2_SRCC_16 Sch=sw[3]
|
||||
|
||||
## LEDs
|
||||
set_property -dict { PACKAGE_PIN T2 IOSTANDARD LVCMOS33 } [get_ports { LED[0] }]; #IO_L24N_T3_35 Sch=led[4]
|
||||
set_property -dict { PACKAGE_PIN T3 IOSTANDARD LVCMOS33 } [get_ports { LED[1] }]; #IO_25_35 Sch=led[5]
|
||||
set_property -dict { PACKAGE_PIN T4 IOSTANDARD LVCMOS33 } [get_ports { LED[2] }]; #IO_L24P_T3_A01_D17_14 Sch=led[6]
|
||||
|
||||
set_property DRIVE 8 [get_ports LED*]
|
||||
|
||||
## UART
|
||||
set_property -dict { PACKAGE_PIN P16 IOSTANDARD LVCMOS33 } [get_ports { UART_TX }]; #CW IO1
|
||||
set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { UART_RX }]; #CW IO2
|
||||
|
||||
# IO3-4:
|
||||
set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { IO3 }]; #IO3
|
||||
set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { IO4 }]; #IO4
|
||||
|
||||
|
||||
set_property -dict { PACKAGE_PIN R1 IOSTANDARD LVCMOS33 } [get_ports { IO_RST_N }]; #IO_L16P_T2_35 Sch=ck_rst
|
||||
|
||||
set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
|
||||
@@ -0,0 +1,24 @@
|
||||
## Clock signal
|
||||
set_property -dict { PACKAGE_PIN D15 IOSTANDARD LVCMOS33 } [get_ports { IO_CLK }]; # HS2 pin
|
||||
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports { IO_CLK }];
|
||||
|
||||
## Switches
|
||||
# IO3-4:
|
||||
set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { IO3 }]; #IO3
|
||||
set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { IO4 }]; #IO4
|
||||
|
||||
## LEDs
|
||||
set_property -dict { PACKAGE_PIN R1 IOSTANDARD LVCMOS33 } [get_ports { LED[0] }];
|
||||
set_property -dict { PACKAGE_PIN V2 IOSTANDARD LVCMOS33 } [get_ports { LED[1] }];
|
||||
set_property -dict { PACKAGE_PIN V5 IOSTANDARD LVCMOS33 } [get_ports { LED[2] }];
|
||||
|
||||
set_property DRIVE 8 [get_ports LED*]
|
||||
|
||||
## UART
|
||||
set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { UART_TX }]; #CW IO1
|
||||
set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { UART_RX }]; #CW IO2
|
||||
|
||||
set_property -dict { PACKAGE_PIN A16 IOSTANDARD LVCMOS33 } [get_ports { IO_RST_N }];
|
||||
|
||||
set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
{ lib, buildPythonPackage, fetchPypi,
|
||||
jinja2, setuptools_scm, simplesat
|
||||
}:
|
||||
buildPythonPackage rec {
|
||||
pname = "edalize";
|
||||
version = "0.3.3";
|
||||
src = fetchPypi {
|
||||
inherit pname version;
|
||||
sha256 = "1734aprwzm0z2l60xapqrfxxw747n9h9fflv3n0x4iaradf75abj";
|
||||
};
|
||||
SETUPTOOLS_SCM_PRETEND_VERSION = "${version}";
|
||||
nativeBuildInputs = [ setuptools_scm ];
|
||||
propagatedBuildInputs = [ jinja2 simplesat ];
|
||||
doCheck = false;
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
{
|
||||
"nodes": {
|
||||
"lowrisc_edalize_src": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1649340101,
|
||||
"narHash": "sha256-iIf7bUBE2SeS/TByUNL9wI1LswlHTmgHYGJltWXNUWE=",
|
||||
"owner": "lowRISC",
|
||||
"repo": "edalize",
|
||||
"rev": "5ae2c3e1ca306e27d81ce5fcc769f62cb7ac42d0",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "lowRISC",
|
||||
"ref": "ot-0.2",
|
||||
"repo": "edalize",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"lowrisc_fusesoc_src": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1646915773,
|
||||
"narHash": "sha256-HFrx6vjthNbhrIeV4vNW3YmmqBwqb6lX8lu0dcmQnQM=",
|
||||
"owner": "lowRISC",
|
||||
"repo": "fusesoc",
|
||||
"rev": "c64ca392382b0c432c893d5ce4a93b77af213fdf",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "lowRISC",
|
||||
"ref": "ot-0.2",
|
||||
"repo": "fusesoc",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1673439286,
|
||||
"narHash": "sha256-CHlGzPceL90wBLD7wt8ZGvulHtf5ZfbXfR37DR10eRs=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "9c8bff77b5d51380f5da349d0a6fc515da6244b0",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixos-22.11",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"lowrisc_edalize_src": "lowrisc_edalize_src",
|
||||
"lowrisc_fusesoc_src": "lowrisc_fusesoc_src",
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
@@ -0,0 +1,104 @@
|
||||
{
|
||||
description = "ibex simple_system dependencies";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-22.11";
|
||||
lowrisc_fusesoc_src = { url = "github:lowRISC/fusesoc?ref=ot-0.2"; flake = false; };
|
||||
lowrisc_edalize_src = { url = "github:lowRISC/edalize?ref=ot-0.2"; flake = false; };
|
||||
};
|
||||
|
||||
outputs = {self, nixpkgs,
|
||||
lowrisc_fusesoc_src, lowrisc_edalize_src,
|
||||
}:
|
||||
let
|
||||
system = "x86_64-linux";
|
||||
pkgs = import nixpkgs {
|
||||
inherit system;
|
||||
config = { allowUnfree = true; };
|
||||
};
|
||||
|
||||
lowRISC_python_overrides = pfinal: pprev: {
|
||||
fusesoc = pprev.fusesoc.overridePythonAttrs (oldAttrs: {
|
||||
version = "0.3.3.dev";
|
||||
src = lowrisc_fusesoc_src;
|
||||
});
|
||||
edalize = pprev.edalize.overridePythonAttrs (oldAttrs: {
|
||||
version = "0.3.3.dev";
|
||||
src = lowrisc_edalize_src;
|
||||
});
|
||||
};
|
||||
|
||||
lowRISC_spike_override = final: prev: {
|
||||
riscv-isa-sim = prev.riscv-isa-sim.overrideAttrs (oldAttrs: rec {
|
||||
version = "ibex-cosim-v0.3";
|
||||
src = pkgs.fetchFromGitHub {
|
||||
owner = "lowrisc";
|
||||
repo = oldAttrs.pname;
|
||||
rev = version;
|
||||
sha256 = "sha256-pKuOpzybOI8UqWV1TSFq4hqTHf7Bft/3WL19fRpwmfU=";
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
# Using requireFile prevents rehashing each time.
|
||||
# This saves much seconds during rebuilds.
|
||||
vivado_bundled_installer_src = pkgs.requireFile rec {
|
||||
name = "vivado_bundled.tar.gz";
|
||||
sha256 = "1yxx6crvawhzvary9js0m8bzm35vv6pzfqdkv095r84lb13fyp7b";
|
||||
# Print the following message if the name / hash are not
|
||||
# found in the store.
|
||||
message = ''
|
||||
requireFile :
|
||||
file/dir not found in /nix/store
|
||||
file = ${name}
|
||||
hash = ${sha256}
|
||||
|
||||
This nix expression requires that ${name} is already part of the store.
|
||||
- Login to xilinx.com
|
||||
- Download Unified Installer from https://www.xilinx.com/support/download.html,
|
||||
- Run installer, specify a 'Download Image (Install Seperately)'
|
||||
- Gzip the bundled installed image directory
|
||||
- Rename the file to ${name}
|
||||
- Add it to the nix store with
|
||||
nix-prefetch-url --type sha256 file:/path/to/${name}
|
||||
- Change the sha256 key above to $HASH
|
||||
'';
|
||||
};
|
||||
|
||||
vivado = pkgs.callPackage (import ./vivado.nix) {
|
||||
# We need to prepare the pre-downloaded installer to
|
||||
# execute within a nix build. Make use of the included java deps,
|
||||
# but we still need to do a little patching to make it work.
|
||||
vivado-src = pkgs.stdenv.mkDerivation rec {
|
||||
pname = "vivado_src";
|
||||
version = "2022.2";
|
||||
src = vivado_bundled_installer_src;
|
||||
postPatch = ''
|
||||
patchShebangs .
|
||||
patchelf \
|
||||
--set-interpreter $(cat ${pkgs.stdenv.cc}/nix-support/dynamic-linker) \
|
||||
tps/lnx64/jre*/bin/java
|
||||
'';
|
||||
dontBuild = true; dontFixup = true;
|
||||
installPhase = ''
|
||||
mkdir -p $out
|
||||
cp -R * $out
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
in
|
||||
{
|
||||
overlay_pkgs = pkgs.lib.composeManyExtensions [
|
||||
(import ./overlay.nix)
|
||||
lowRISC_spike_override
|
||||
(final: prev: {
|
||||
inherit vivado;
|
||||
})
|
||||
];
|
||||
overlay_python = pkgs.lib.composeManyExtensions [
|
||||
(import ./python-overlay.nix)
|
||||
lowRISC_python_overrides
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{ lib, buildPythonPackage, fetchPypi,
|
||||
setuptools_scm, pyparsing, pyyaml, simplesat, ipyxact, edalize
|
||||
}:
|
||||
buildPythonPackage rec {
|
||||
pname = "fusesoc";
|
||||
version = "1.12.0";
|
||||
src = fetchPypi {
|
||||
inherit pname version;
|
||||
sha256 = "1065arwk1hylf4lqmgqb77fw9izgh7jaib5qnl2dqwdic11c2w44";
|
||||
};
|
||||
SETUPTOOLS_SCM_PRETEND_VERSION = "${version}"; # Hack
|
||||
nativeBuildInputs = [ setuptools_scm ];
|
||||
propagatedBuildInputs = [ pyparsing pyyaml simplesat ipyxact edalize ];
|
||||
doCheck = false;
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{ lib, buildPythonPackage, fetchPypi,
|
||||
pyyaml }:
|
||||
buildPythonPackage rec {
|
||||
pname = "ipyxact";
|
||||
version = "0.3.1";
|
||||
src = fetchPypi {
|
||||
inherit pname version;
|
||||
sha256 = "09rv8zn6gqwhdnwgx246mz9biln0q71hsxjf6sb9ilhan75fsn0z";
|
||||
};
|
||||
propagatedBuildInputs = [ pyyaml ];
|
||||
doCheck = false;
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{ lib, buildPythonPackage, fetchPypi,
|
||||
attrs, jsonschema, six, zipfile2, distro }:
|
||||
buildPythonPackage rec {
|
||||
pname = "okonomiyaki";
|
||||
version = "1.3.2";
|
||||
src = fetchPypi {
|
||||
inherit pname version;
|
||||
sha256 = "1dw9di7s92z201lwq7aqy5h9h53af73ffx6pnl5iz3lnfi0zf85p";
|
||||
};
|
||||
propagatedBuildInputs = [ attrs jsonschema six zipfile2 distro ];
|
||||
doCheck = false;
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
final: prev: {
|
||||
riscv-gcc-toolchain-lowrisc = prev.callPackage ./riscv-gcc-toolchain-lowrisc.nix {};
|
||||
riscv-isa-sim = prev.callPackage ./riscv-isa-sim.nix {};
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
pfinal: pprev: {
|
||||
ipyxact = pfinal.callPackage ./ipyxact.nix {};
|
||||
zipfile2 = pfinal.callPackage ./zipfile2.nix {};
|
||||
simplesat = pfinal.callPackage ./simplesat.nix {};
|
||||
okonomiyaki = pfinal.callPackage ./okonomiyaki.nix {};
|
||||
fusesoc = pfinal.callPackage ./fusesoc.nix {};
|
||||
edalize = pfinal.callPackage ./edalize.nix {};
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
{ pkgs, lib, stdenv,
|
||||
fetchzip, zlib, ncurses5,
|
||||
}:
|
||||
|
||||
# Used for reference...
|
||||
# https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/compilers/gcc-arm-embedded/10/default.nix
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
name = "riscv-gcc-toolchain";
|
||||
version = "20220210-1";
|
||||
src = fetchzip {
|
||||
url = "https://github.com/lowRISC/lowrisc-toolchains/releases/download/${version}/lowrisc-toolchain-gcc-rv32imc-${version}.tar.xz";
|
||||
sha256 = "1m708xfdzf3jzclm2zw51my3nryvlsfwqkgps3xxa0xnhq4ly1bl";
|
||||
};
|
||||
|
||||
dontConfigure = true;
|
||||
dontBuild = true;
|
||||
dontPatchELF = true; # We will do this manually in preFixup
|
||||
dontStrip = true;
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p $out
|
||||
cp -R * $out
|
||||
'';
|
||||
preFixup = ''
|
||||
find $out -type f ! -name ".o" | while read f; do
|
||||
patchelf "$f" > /dev/null 2>&1 || continue
|
||||
patchelf --set-interpreter $(cat ${stdenv.cc}/nix-support/dynamic-linker) "$f" || true
|
||||
patchelf --set-rpath ${lib.makeLibraryPath [ "$out" stdenv.cc.cc ncurses5 ]} "$f" || true
|
||||
done
|
||||
'';
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
{ lib, stdenv, fetchFromGitHub,
|
||||
dtc
|
||||
}:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
name = "spike";
|
||||
pname = "riscv-isa-sim";
|
||||
version = "1.1.1-dev";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "riscv-software-src";
|
||||
repo = pname;
|
||||
rev = "ac466a21df442c59962589ba296c702631e041b5";
|
||||
sha256 = "sha256-1OLGEdj0dGnNREKZOrkAyKET7d2L+VFebOGm2oxtkHw=";
|
||||
};
|
||||
|
||||
enableParallelBuilding = true;
|
||||
# buildInputs = [ ];
|
||||
nativeBuildInputs = [ dtc ];
|
||||
configureFlags = [ "--enable-commitlog" "--enable-misaligned" ];
|
||||
|
||||
doCheck = false;
|
||||
dontInstall = false;
|
||||
|
||||
meta = with lib; {
|
||||
description = "Riscv golden-reference simulator Spike";
|
||||
homepage = "https://github.com/riscv-software-src/riscv-isa-sim";
|
||||
license = with licenses; [];
|
||||
platforms = platforms.unix;
|
||||
maintainers = with maintainers; [];
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
{ # Chosen toolchain subarchitecture, e.g. 'rv32imc'
|
||||
riscv-arch
|
||||
|
||||
# Package set
|
||||
, pkgs
|
||||
}:
|
||||
|
||||
# --------------------------
|
||||
# RISC-V GCC Toolchain Setup
|
||||
|
||||
let
|
||||
riscv-toolchain-ver = "8.2.0";
|
||||
riscv-src = pkgs.fetchFromGitHub {
|
||||
owner = "lowRISC";
|
||||
repo = "lowrisc-toolchains";
|
||||
rev = "2cac2b9797d96a5c46d86d463c71e0a66926f473";
|
||||
sha256 = "sha256-DNEkdJ5G8wpN2nQbD+nzvAQixWWGCG5RbJrXg5IRteg=";
|
||||
};
|
||||
#
|
||||
# given an architecture like 'rv32i', this will generate the given
|
||||
# toolchain derivation based on the above source code.
|
||||
make-riscv-toolchain = arch:
|
||||
pkgs.stdenv.mkDerivation rec {
|
||||
name = "riscv-${arch}-toolchain-${version}";
|
||||
version = "${riscv-toolchain-ver}-${builtins.substring 0 7 src.rev}";
|
||||
src = riscv-src;
|
||||
|
||||
configureFlags = [ "--with-arch=${arch}" ];
|
||||
installPhase = ":"; # 'make' installs on its own
|
||||
# installPhase = ''
|
||||
# mkdir -p $out
|
||||
# cp -r * $out
|
||||
# '';
|
||||
hardeningDisable = [ "all" ];
|
||||
enableParallelBuilding = true;
|
||||
|
||||
# Stripping/fixups break the resulting libgcc.a archives, somehow.
|
||||
# Maybe something in stdenv that does this...
|
||||
dontStrip = true;
|
||||
dontFixup = true;
|
||||
|
||||
nativeBuildInputs = with pkgs; [ curl gawk texinfo bison flex gperf ];
|
||||
buildInputs = with pkgs; [ libmpc mpfr gmp expat ];
|
||||
};
|
||||
|
||||
in make-riscv-toolchain riscv-arch
|
||||
@@ -0,0 +1,13 @@
|
||||
{ lib, buildPythonPackage, fetchPypi,
|
||||
okonomiyaki, attrs, six, enum34
|
||||
}:
|
||||
buildPythonPackage rec {
|
||||
pname = "simplesat";
|
||||
version = "0.8.2";
|
||||
src = fetchPypi {
|
||||
inherit pname version;
|
||||
sha256 = "0n6qm2gzwji19ykp3i6wm6vjw7dnn92h2flm42708fxh6lkz6hqr";
|
||||
};
|
||||
propagatedBuildInputs = [ okonomiyaki attrs six enum34 ];
|
||||
doCheck = false;
|
||||
}
|
||||
@@ -0,0 +1,126 @@
|
||||
{ stdenv, lib, breakpointHook
|
||||
, fetchurl, patchelf, makeWrapper
|
||||
, vivado-src
|
||||
, coreutils
|
||||
, procps
|
||||
, zlib
|
||||
, ncurses5
|
||||
, libxcrypt
|
||||
, libuuid
|
||||
, libSM
|
||||
, libICE
|
||||
, libX11
|
||||
, libXrender
|
||||
, libxcb
|
||||
, libXext
|
||||
, libXtst
|
||||
, libXi
|
||||
, glib
|
||||
, gtk2
|
||||
, freetype
|
||||
}:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "vivado";
|
||||
version = "2022.2";
|
||||
|
||||
# src = vivado-src;
|
||||
|
||||
nativeBuildInputs = [
|
||||
vivado-src
|
||||
makeWrapper
|
||||
breakpointHook
|
||||
];
|
||||
|
||||
buildInputs = [
|
||||
procps
|
||||
ncurses5
|
||||
libxcrypt
|
||||
];
|
||||
|
||||
dontUnpack = true;
|
||||
dontBuild = true;
|
||||
dontStrip = true;
|
||||
|
||||
libPath = lib.makeLibraryPath [
|
||||
stdenv.cc.cc
|
||||
ncurses5 zlib libxcrypt
|
||||
libuuid libSM libICE libX11 libXrender libxcb libXext libXtst libXi
|
||||
glib gtk2 freetype
|
||||
];
|
||||
|
||||
installPhase = ''
|
||||
cat <<EOF > install_config.txt
|
||||
Edition=Vivado ML Standard
|
||||
Product=Vivado
|
||||
Destination=$out/opt
|
||||
Modules=Spartan-7:1,Virtex-7:1,Artix-7:1
|
||||
InstallOptions=
|
||||
CreateProgramGroupShortcuts=0
|
||||
ProgramGroupFolder=Xilinx Design Tools
|
||||
CreateShortcutsForAllUsers=0
|
||||
CreateDesktopShortcuts=0
|
||||
CreateFileAssociation=0
|
||||
EOF
|
||||
|
||||
mkdir -p $out/opt
|
||||
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${libPath}"
|
||||
export HOME=$out/userhome
|
||||
|
||||
# The installer will be killed as soon as it says that post install tasks have failed.
|
||||
# This is required because it tries to run the unpatched scripts to check if the installation
|
||||
# has succeeded. However, these scripts will fail because they have not been patched yet,
|
||||
# and the installer will proceed to delete the installation if not killed.
|
||||
(${vivado-src}/xsetup \
|
||||
--agree XilinxEULA,3rdPartyEULA \
|
||||
--batch Install \
|
||||
--config install_config.txt || true) | while read line
|
||||
do
|
||||
[[ "''${line}" == *"Execution of Pre/Post Installation Tasks Failed"* ]] \
|
||||
&& echo "killing installer!" \
|
||||
&& ((pkill -9 -f "tps/lnx64/jre/bin/java") || true)
|
||||
|
||||
echo ''${line}
|
||||
done
|
||||
'';
|
||||
|
||||
|
||||
preFixup = ''
|
||||
echo "Patch installed scripts"
|
||||
patchShebangs $out/opt/Vivado/${version}/bin || true
|
||||
|
||||
echo "Hack around lack of libtinfo in NixOS"
|
||||
ln -s ${ncurses5}/lib/libncursesw.so.6 $out/opt/Vivado/${version}/lib/lnx64.o/libtinfo.so.5 || true
|
||||
|
||||
echo "Patch ELFs"
|
||||
for f in $out/opt/Vivado/${version}/bin/unwrapped/lnx64.o/* \
|
||||
$out/opt/Vitis_HLS/${version}/bin/unwrapped/lnx64.o/*
|
||||
do
|
||||
patchelf --set-interpreter "$(cat ${stdenv.cc}/nix-support/dynamic-linker)" $f || true
|
||||
done
|
||||
|
||||
echo "Wrapping binaries"
|
||||
for f in $out/opt/Vivado/${version}/bin/vivado \
|
||||
$out/opt/Vitis_HLS/${version}/bin/vitis_hls
|
||||
do
|
||||
wrapProgram $f --prefix LD_LIBRARY_PATH : "${libPath}" || true
|
||||
done
|
||||
|
||||
# 'wrapProgram' on its own does not work
|
||||
# - This is because of the way the Vivado script runs ./loader
|
||||
# - Therefore, we need ---Even More Patches...---
|
||||
echo "Even More Patches..."
|
||||
sed -i -- 's|`basename "\$0"`|vivado|g' $out/opt/Vivado/$version/bin/.vivado-wrapped
|
||||
|
||||
echo "Adding to bin"
|
||||
mkdir $out/bin
|
||||
ln -s $out/opt/Vivado/${version}/bin/vivado $out/bin/vivado || true
|
||||
'';
|
||||
|
||||
meta = with lib; {
|
||||
description = "Xilinx Vivado";
|
||||
homepage = "https://www.xilinx.com/products/design-tools/vivado.html";
|
||||
license = licenses.unfree;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
{ lib, buildPythonPackage, fetchPypi }:
|
||||
buildPythonPackage rec {
|
||||
pname = "zipfile2";
|
||||
version = "0.0.12";
|
||||
src = fetchPypi {
|
||||
inherit pname version;
|
||||
sha256 = "0256m134qs045j1c8mmgii8ipkwhww9sjbc6xyawhykid34zfxkk";
|
||||
};
|
||||
doCheck = false;
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
//
|
||||
// common waiver rules for verilator
|
||||
|
||||
`verilator_config
|
||||
|
||||
// Do not warn about unconnected pins in module instantiations, e.g.
|
||||
// `.optional_output ()`.
|
||||
lint_off -rule PINCONNECTEMPTY
|
||||
|
||||
// This warning gives wrong results with blackboxed embedded modules, see
|
||||
// https://github.com/verilator/verilator/issues/2430
|
||||
lint_off -rule DECLFILENAME -file "*" -match "Filename '*' does not match NOTFOUNDMODULE name:*"
|
||||
|
||||
// Don't generate lint errors for unused parameters in packages. The point is
|
||||
// that a user of a package might not want to use all of the parameters it
|
||||
// defines.
|
||||
lint_off -rule UNUSED -file "*_pkg.sv" -match "*Parameter is not used*"
|
||||
lint_off -rule UNUSED -file "*pulp_riscv_dbg*" -match "*not used*"
|
||||
lint_off -rule IMPERFECTSCH -file "*pulp_riscv_dbg*"
|
||||
lint_off -rule DECLFILENAME -file "*pulp_riscv_dbg*"
|
||||
lint_off -rule PINMISSING -file "*pulp_riscv_dbg*"
|
||||
lint_off -rule UNUSED -file "*ibex_register_file_fpga*"
|
||||
@@ -0,0 +1,79 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#include <cassert>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
|
||||
#include "Vibex_demo_system__Syms.h"
|
||||
#include "ibex_pcounts.h"
|
||||
#include "ibex_demo_system.h"
|
||||
#include "verilated_toplevel.h"
|
||||
#include "verilator_memutil.h"
|
||||
#include "verilator_sim_ctrl.h"
|
||||
|
||||
DemoSystem::DemoSystem(const char *ram_hier_path, int ram_size_words)
|
||||
: _ram(ram_hier_path, ram_size_words, 4) {}
|
||||
|
||||
int DemoSystem::Main(int argc, char **argv) {
|
||||
bool exit_app;
|
||||
int ret_code = Setup(argc, argv, exit_app);
|
||||
|
||||
if (exit_app) {
|
||||
return ret_code;
|
||||
}
|
||||
|
||||
Run();
|
||||
|
||||
if (!Finish()) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int DemoSystem::Setup(int argc, char **argv, bool &exit_app) {
|
||||
VerilatorSimCtrl &simctrl = VerilatorSimCtrl::GetInstance();
|
||||
|
||||
simctrl.SetTop(&_top, &_top.clk_sys_i, &_top.clk_sys_fast_i, &_top.rst_sys_ni,
|
||||
VerilatorSimCtrlFlags::ResetPolarityNegative);
|
||||
|
||||
_memutil.RegisterMemoryArea("ram", 0x0, &_ram);
|
||||
simctrl.RegisterExtension(&_memutil);
|
||||
|
||||
exit_app = false;
|
||||
return simctrl.ParseCommandArgs(argc, argv, exit_app);
|
||||
}
|
||||
|
||||
void DemoSystem::Run() {
|
||||
VerilatorSimCtrl &simctrl = VerilatorSimCtrl::GetInstance();
|
||||
|
||||
std::cout << "Simulation of Ibex Demo System" << std::endl
|
||||
<< "==============================" << std::endl
|
||||
<< std::endl;
|
||||
|
||||
simctrl.RunSimulation();
|
||||
}
|
||||
|
||||
bool DemoSystem::Finish() {
|
||||
VerilatorSimCtrl &simctrl = VerilatorSimCtrl::GetInstance();
|
||||
|
||||
if (!simctrl.WasSimulationSuccessful()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Set the scope to the root scope, the ibex_pcount_string function otherwise
|
||||
// doesn't know the scope itself. Could be moved to ibex_pcount_string, but
|
||||
// would require a way to set the scope name from here, similar to MemUtil.
|
||||
svSetScope(svGetScopeFromName("TOP.ibex_demo_system"));
|
||||
|
||||
std::cout << "\nPerformance Counters" << std::endl
|
||||
<< "====================" << std::endl;
|
||||
std::cout << ibex_pcount_string(false);
|
||||
|
||||
std::ofstream pcount_csv("ibex_demo_system_pcount.csv");
|
||||
pcount_csv << ibex_pcount_string(true);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#include "verilated_toplevel.h"
|
||||
#include "verilator_memutil.h"
|
||||
|
||||
class DemoSystem {
|
||||
public:
|
||||
DemoSystem(const char *ram_hier_path, int ram_size_words);
|
||||
virtual ~DemoSystem() {}
|
||||
virtual int Main(int argc, char **argv);
|
||||
|
||||
|
||||
protected:
|
||||
ibex_demo_system _top;
|
||||
VerilatorMemUtil _memutil;
|
||||
MemArea _ram;
|
||||
|
||||
virtual int Setup(int argc, char **argv, bool &exit_app);
|
||||
virtual void Run();
|
||||
virtual bool Finish();
|
||||
};
|
||||
@@ -0,0 +1,13 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#include "ibex_demo_system.h"
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
DemoSystem demo_system(
|
||||
"TOP.ibex_demo_system.u_ram.u_ram.gen_generic.u_impl_generic",
|
||||
1024 * 1024);
|
||||
|
||||
return demo_system.Main(argc, argv);
|
||||
}
|
||||
+97
@@ -0,0 +1,97 @@
|
||||
{
|
||||
"nodes": {
|
||||
"deps": {
|
||||
"inputs": {
|
||||
"lowrisc_edalize_src": "lowrisc_edalize_src",
|
||||
"lowrisc_fusesoc_src": "lowrisc_fusesoc_src",
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1,
|
||||
"narHash": "sha256-8FX476hjWgbFOzDE+8OUfj8Tv/zJXllOjPnLOY0Adeo=",
|
||||
"path": "./dependencies",
|
||||
"type": "path"
|
||||
},
|
||||
"original": {
|
||||
"path": "./dependencies",
|
||||
"type": "path"
|
||||
}
|
||||
},
|
||||
"flake-utils": {
|
||||
"locked": {
|
||||
"lastModified": 1667395993,
|
||||
"narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"lowrisc_edalize_src": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1649340101,
|
||||
"narHash": "sha256-iIf7bUBE2SeS/TByUNL9wI1LswlHTmgHYGJltWXNUWE=",
|
||||
"owner": "lowRISC",
|
||||
"repo": "edalize",
|
||||
"rev": "5ae2c3e1ca306e27d81ce5fcc769f62cb7ac42d0",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "lowRISC",
|
||||
"ref": "ot-0.2",
|
||||
"repo": "edalize",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"lowrisc_fusesoc_src": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1646915773,
|
||||
"narHash": "sha256-HFrx6vjthNbhrIeV4vNW3YmmqBwqb6lX8lu0dcmQnQM=",
|
||||
"owner": "lowRISC",
|
||||
"repo": "fusesoc",
|
||||
"rev": "c64ca392382b0c432c893d5ce4a93b77af213fdf",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "lowRISC",
|
||||
"ref": "ot-0.2",
|
||||
"repo": "fusesoc",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1673439286,
|
||||
"narHash": "sha256-CHlGzPceL90wBLD7wt8ZGvulHtf5ZfbXfR37DR10eRs=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "9c8bff77b5d51380f5da349d0a6fc515da6244b0",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixos-22.11",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"deps": "deps",
|
||||
"flake-utils": "flake-utils",
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
@@ -0,0 +1,158 @@
|
||||
{
|
||||
description = "Environment for synthesizing and simulating the ibex-demo-system.";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-22.11";
|
||||
flake-utils.url = "github:numtide/flake-utils";
|
||||
deps = {
|
||||
url = "path:./dependencies";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
};
|
||||
|
||||
outputs = all@{ self, nixpkgs, flake-utils, deps, ... }:
|
||||
|
||||
(flake-utils.lib.eachDefaultSystem (system:
|
||||
let
|
||||
pkgs = import nixpkgs {
|
||||
inherit system;
|
||||
config = { allowUnfree = true; };
|
||||
overlays =
|
||||
[ # Add extra packages we might need
|
||||
# Currently this contains the lowrisc riscv-toolchain, and spike
|
||||
deps.overlay_pkgs
|
||||
# Add all the python packages we need that aren't in nixpkgs
|
||||
# (See the ./dependencies folder for more info)
|
||||
(final: prev: {
|
||||
python3 = prev.python3.override {
|
||||
packageOverrides = deps.overlay_python;
|
||||
};
|
||||
})
|
||||
# Add some missing dependencies to nixpkgs#verilator
|
||||
(final: prev: {
|
||||
verilator = prev.verilator.overrideAttrs ( oldAttrs : {
|
||||
propagatedBuildInputs = [ final.zlib final.libelf ];
|
||||
});
|
||||
})
|
||||
];
|
||||
};
|
||||
|
||||
|
||||
# Currently we don't build the riscv-toolchain from src, we use a github release
|
||||
# (See ./dependencies/riscv-gcc-toolchain-lowrisc.nix)
|
||||
|
||||
# riscv-toolchain (built from src) # BROKEN
|
||||
# riscv-gcc-toolchain-lowrisc-src = pkgs.callPackage \
|
||||
# ./dependencies/riscv_gcc.nix {
|
||||
# riscv-arch = "rv32imc";
|
||||
# };
|
||||
|
||||
pythonEnv = pkgs.python3.withPackages(ps:
|
||||
with ps; [ pip fusesoc edalize pyyaml Mako ]
|
||||
);
|
||||
|
||||
# This is the final list of dependencies we need to build the project.
|
||||
project_deps = [
|
||||
pythonEnv
|
||||
] ++ (with pkgs; [
|
||||
cmake
|
||||
openocd
|
||||
screen
|
||||
verilator
|
||||
riscv-gcc-toolchain-lowrisc
|
||||
gtkwave
|
||||
srecord
|
||||
openfpgaloader
|
||||
# vivado
|
||||
]);
|
||||
|
||||
in {
|
||||
packages.dockertest = pkgs.dockerTools.buildImage {
|
||||
name = "hello-docker";
|
||||
copyToRoot = pkgs.buildEnv {
|
||||
name = "image-root";
|
||||
paths = [ pkgs.coreutils
|
||||
pkgs.sl ];
|
||||
};
|
||||
config = {
|
||||
Cmd = [ "${pkgs.sl}/bin/sl" ];
|
||||
};
|
||||
};
|
||||
devShells.default = pkgs.mkShell {
|
||||
name = "labenv";
|
||||
buildInputs = project_deps;
|
||||
shellHook = ''
|
||||
# FIXME This works on Ubuntu, may not on other distros. FIXME
|
||||
export LOCALE_ARCHIVE=/usr/lib/locale/locale-archive
|
||||
|
||||
# HACK fixup some paths to use our sandboxed python environment
|
||||
# Currently, fusesoc tries to invoke the program 'python3' from the
|
||||
# PATH, which when running under a nix python environment, resolves
|
||||
# to the raw python binary, not wrapped and not including the
|
||||
# environment's packages. Hence, the first time an import is evaluated
|
||||
# we will error out.
|
||||
sed -i -- \
|
||||
's|interpreter:.*|interpreter: ${pythonEnv}/bin/python3|g' \
|
||||
vendor/lowrisc_ibex/vendor/lowrisc_ip/dv/tools/ralgen/ralgen.core
|
||||
sed -i -- \
|
||||
's|interpreter:.*|interpreter: ${pythonEnv}/bin/python3|g' \
|
||||
vendor/lowrisc_ibex/vendor/lowrisc_ip/ip/prim/primgen.core
|
||||
|
||||
export PS1='labenv(HiPEAC) (ibex-demo-system) \$ '
|
||||
|
||||
echo
|
||||
echo
|
||||
cat ./data/lowrisc.art
|
||||
echo "---------------------------------------------------"
|
||||
echo "Welcome to the 'ibex-demo-system' nix environment!"
|
||||
echo "---------------------------------------------------"
|
||||
|
||||
helpstr=$(cat <<'EOF'
|
||||
|
||||
Build ibex software :
|
||||
mkdir sw/build && pushd sw/build && cmake ../ && make && popd
|
||||
Build ibex simulation verilator model :
|
||||
fusesoc --cores-root=. run --target=sim --tool=verilator --setup --build lowrisc:ibex:demo_system
|
||||
Run ibex simulator verilator model :
|
||||
./build/lowrisc_ibex_demo_system_0/sim-verilator/Vibex_demo_system -t \
|
||||
--meminit=ram,sw/build/demo/hello_world/demo
|
||||
Build ibex-demo-system FPGA bitstream for Arty-A7 :
|
||||
fusesoc --cores-root=. run --target=synth --setup --build lowrisc:ibex:demo_system
|
||||
Program Arty-A7 FPGA with bitstream :
|
||||
openFPGALoader -b arty_a7_35t build/lowrisc_ibex_demo_system_0/synth-vivado/lowrisc_ibex_demo_system_0.bit
|
||||
Load ibex software to the programmed FPGA :
|
||||
./util/load_demo_system.sh run ./sw/build/demo/lcd_st7735/lcd_st7735
|
||||
Start an OpenOCD instance, connected to the Arty-A7 ibex
|
||||
openocd -f util/arty-a7-openocd-cfg.tcl
|
||||
Connect gdb to a running program on the FPGA (In a different terminal to the OpenOCD instance):
|
||||
riscv32-unknown-elf-gdb -ex "target extended-remote localhost:3333" ./sw/build/demo/hello_world/demo
|
||||
|
||||
To leave the environment:
|
||||
exit
|
||||
|
||||
EOF
|
||||
)
|
||||
helpme(){ echo "$helpstr"; }
|
||||
helpme
|
||||
|
||||
echo
|
||||
echo "Run 'helpme' in your shell to see this message again."
|
||||
echo
|
||||
'';
|
||||
};
|
||||
})
|
||||
) // {
|
||||
|
||||
overlay = final: prev: { };
|
||||
overlays = { exampleOverlay = self.overlay; };
|
||||
|
||||
# Utilized by `nix run .#<name>`
|
||||
# apps.x86_64-linux.hello = {
|
||||
# type = "app";
|
||||
# program = c-hello.packages.x86_64-linux.hello;
|
||||
# };
|
||||
|
||||
# Utilized by `nix run . -- <args?>`
|
||||
# defaultApp.x86_64-linux = self.apps.x86_64-linux.hello;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,155 @@
|
||||
CAPI=2:
|
||||
# Copyright lowRISC contributors.
|
||||
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
name: "lowrisc:ibex:demo_system"
|
||||
description: "Ibex Demo System for Arty A7 boards (both, -35 and -100)"
|
||||
filesets:
|
||||
files_rtl:
|
||||
depend:
|
||||
- lowrisc:ibex:demo_system_core
|
||||
|
||||
files_xilinx:
|
||||
depend:
|
||||
- lowrisc:ibex:rv_timer
|
||||
- lowrisc:ibex:fpga_xilinx_shared
|
||||
files:
|
||||
- rtl/fpga/top_artya7.sv
|
||||
file_type: systemVerilogSource
|
||||
|
||||
files_xilinx_cw305:
|
||||
depend:
|
||||
- lowrisc:ibex:rv_timer
|
||||
- lowrisc:ibex:fpga_xilinx_shared
|
||||
files:
|
||||
- rtl/fpga/top_cw305.sv
|
||||
file_type: systemVerilogSource
|
||||
|
||||
files_xilinx_cw312a35:
|
||||
depend:
|
||||
- lowrisc:ibex:rv_timer
|
||||
- lowrisc:ibex:fpga_xilinx_shared
|
||||
files:
|
||||
- rtl/fpga/top_cw312a35.sv
|
||||
file_type: systemVerilogSource
|
||||
|
||||
files_verilator:
|
||||
depend:
|
||||
- lowrisc:ibex:sim_shared
|
||||
- lowrisc:dv_verilator:memutil_verilator
|
||||
- lowrisc:dv_verilator:simutil_verilator
|
||||
- lowrisc:dv_verilator:ibex_pcounts
|
||||
files:
|
||||
- dv/verilator/ibex_demo_system.cc: { file_type: cppSource }
|
||||
- dv/verilator/ibex_demo_system.h: { file_type: cppSource, is_include_file: true}
|
||||
- dv/verilator/ibex_demo_system_main.cc: { file_type: cppSource }
|
||||
- dv/verilator/demo_system_verilator_lint.vlt: { file_type: vlt }
|
||||
|
||||
files_constraints:
|
||||
files:
|
||||
- data/pins_artya7.xdc
|
||||
file_type: xdc
|
||||
|
||||
files_constraints_cw305:
|
||||
files:
|
||||
- data/pins_cw305.xdc
|
||||
file_type: xdc
|
||||
|
||||
files_constraints_cw312a35:
|
||||
files:
|
||||
- data/pins_cw312a35.xdc
|
||||
file_type: xdc
|
||||
|
||||
|
||||
|
||||
parameters:
|
||||
# XXX: This parameter needs to be absolute, or relative to the *.runs/synth_1
|
||||
# directory. It's best to pass it as absolute path when invoking fusesoc, e.g.
|
||||
# --SRAMInitFile=$PWD/sw/led/led.vmem
|
||||
# XXX: The VMEM file should be added to the sources of the Vivado project to
|
||||
# make the Vivado dependency tracking work. However this requires changes to
|
||||
# fusesoc first.
|
||||
SRAMInitFile:
|
||||
datatype: str
|
||||
description: SRAM initialization file in vmem hex format
|
||||
default: "../../../../../sw/build/blank/blank.vmem"
|
||||
paramtype: vlogparam
|
||||
|
||||
# For value definition, please see ip/prim/rtl/prim_pkg.sv
|
||||
PRIM_DEFAULT_IMPL:
|
||||
datatype: str
|
||||
paramtype: vlogdefine
|
||||
description: Primitives implementation to use, e.g. "prim_pkg::ImplGeneric".
|
||||
|
||||
targets:
|
||||
default: &default_target
|
||||
filesets:
|
||||
- files_rtl
|
||||
synth:
|
||||
<<: *default_target
|
||||
default_tool: vivado
|
||||
filesets_append:
|
||||
- files_xilinx
|
||||
- files_constraints
|
||||
toplevel: top_artya7
|
||||
tools:
|
||||
vivado:
|
||||
part: "xc7a35tcsg324-1" # Default to Arty A7-35
|
||||
parameters:
|
||||
- SRAMInitFile
|
||||
- PRIM_DEFAULT_IMPL=prim_pkg::ImplXilinx
|
||||
synth_cw305:
|
||||
<<: *default_target
|
||||
default_tool: vivado
|
||||
filesets_append:
|
||||
- files_xilinx_cw305
|
||||
- files_constraints_cw305
|
||||
toplevel: top_cw305
|
||||
tools:
|
||||
vivado:
|
||||
part: "xc7a100tftg256-2" # default to a100 part
|
||||
#part: "xc7a35tftg256-2" # a35 option
|
||||
parameters:
|
||||
- SRAMInitFile
|
||||
- PRIM_DEFAULT_IMPL=prim_pkg::ImplXilinx
|
||||
synth_cw312a35:
|
||||
<<: *default_target
|
||||
default_tool: vivado
|
||||
filesets_append:
|
||||
- files_xilinx_cw312a35
|
||||
- files_constraints_cw312a35
|
||||
toplevel: top_cw312a35
|
||||
tools:
|
||||
vivado:
|
||||
part: "xc7a35tcsg324-1"
|
||||
parameters:
|
||||
- SRAMInitFile
|
||||
- PRIM_DEFAULT_IMPL=prim_pkg::ImplXilinx
|
||||
|
||||
sim:
|
||||
<<: *default_target
|
||||
default_tool: verilator
|
||||
filesets_append:
|
||||
- files_verilator
|
||||
toplevel: ibex_demo_system
|
||||
tools:
|
||||
verilator:
|
||||
mode: cc
|
||||
verilator_options:
|
||||
# Disabling tracing reduces compile times but doesn't have a
|
||||
# huge influence on runtime performance.
|
||||
- '--trace'
|
||||
# - '--trace-fst' # this requires -DVM_TRACE_FMT_FST in CFLAGS below!
|
||||
- '--trace-structs'
|
||||
- '--trace-params'
|
||||
- '--trace-max-array 1024'
|
||||
# - '-CFLAGS "-std=c++11 -Wall -DVM_TRACE_FMT_FST -DTOPLEVEL_NAME=ibex_demo_system"'
|
||||
- '-CFLAGS "-std=c++11 -Wall -DTOPLEVEL_NAME=ibex_demo_system"'
|
||||
- '-LDFLAGS "-pthread -lutil -lelf"'
|
||||
- "-Wall"
|
||||
- "-Wwarn-IMPERFECTSCH"
|
||||
# RAM primitives wider than 64bit (required for ECC) fail to build in
|
||||
# Verilator without increasing the unroll count (see Verilator#1266)
|
||||
- "--unroll-count 72"
|
||||
parameters:
|
||||
- PRIM_DEFAULT_IMPL=prim_pkg::ImplGeneric
|
||||
@@ -0,0 +1,27 @@
|
||||
CAPI=2:
|
||||
# Copyright lowRISC contributors.
|
||||
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
name: "lowrisc:ibex:demo_system_core"
|
||||
description: "Ibex Demo System for Arty A7 boards (both, -35 and -100)"
|
||||
filesets:
|
||||
files_rtl_demo_system:
|
||||
depend:
|
||||
- lowrisc:ibex:ibex_top
|
||||
- pulp:riscv:debug_module
|
||||
files:
|
||||
- rtl/system/ibex_demo_system.sv
|
||||
- rtl/system/dm_top.sv
|
||||
- rtl/system/debounce.sv
|
||||
- rtl/system/gpio.sv
|
||||
- rtl/system/pwm.sv
|
||||
- rtl/system/pwm_wrapper.sv
|
||||
- rtl/system/uart.sv
|
||||
- rtl/system/spi_host.sv
|
||||
- rtl/system/spi_top.sv
|
||||
file_type: systemVerilogSource
|
||||
|
||||
targets:
|
||||
default:
|
||||
filesets:
|
||||
- files_rtl_demo_system
|
||||
@@ -0,0 +1,13 @@
|
||||
Cycles,480856
|
||||
NONE,0
|
||||
Instructions Retired,334753
|
||||
LSU Busy,121484
|
||||
Fetch Wait,2168
|
||||
Loads,117569
|
||||
Stores,3915
|
||||
Jumps,7
|
||||
Conditional Branches,45792
|
||||
Taken Conditional Branches,8224
|
||||
Compressed Instructions,43
|
||||
Multiply Wait,0
|
||||
Divide Wait,0
|
||||
|
@@ -0,0 +1,42 @@
|
||||
CAPI=2:
|
||||
# Copyright lowRISC contributors.
|
||||
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
name: "pulp:riscv:debug_module"
|
||||
description: "RISC-V Debug Module"
|
||||
|
||||
filesets:
|
||||
files_src:
|
||||
depend:
|
||||
- lowrisc:prim:fifo
|
||||
- lowrisc:prim:clock_inv
|
||||
files:
|
||||
- vendor/pulp_riscv_dbg/debug_rom/debug_rom.sv
|
||||
- vendor/pulp_riscv_dbg/debug_rom/debug_rom_one_scratch.sv
|
||||
- vendor/pulp_riscv_dbg/src/dm_pkg.sv
|
||||
- vendor/pulp_riscv_dbg/src/dm_sba.sv
|
||||
- vendor/pulp_riscv_dbg/src/dm_csrs.sv
|
||||
- vendor/pulp_riscv_dbg/src/dm_mem.sv
|
||||
- vendor/pulp_riscv_dbg/src/dmi_cdc.sv
|
||||
- vendor/pulp_riscv_dbg/src/dmi_jtag.sv
|
||||
file_type: systemVerilogSource
|
||||
|
||||
files_vivado:
|
||||
files:
|
||||
- vendor/pulp_riscv_dbg/src/dmi_bscane_tap.sv
|
||||
file_type: systemVerilogSource
|
||||
|
||||
files_verilator:
|
||||
depend:
|
||||
# common waivers
|
||||
- lowrisc:lint:common
|
||||
files:
|
||||
- vendor/pulp_riscv_dbg/src/dmi_jtag_tap.sv
|
||||
file_type: systemVerilogSource
|
||||
|
||||
targets:
|
||||
default:
|
||||
filesets:
|
||||
- files_src
|
||||
- tool_verilator ? (files_verilator)
|
||||
- tool_vivado ? (files_vivado)
|
||||
@@ -0,0 +1,15 @@
|
||||
# Copyright lowRISC contributors.
|
||||
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
# Individual Python packages
|
||||
anytree
|
||||
mako
|
||||
pyyaml
|
||||
wheel
|
||||
|
||||
# Development version of edalize until all our changes are upstream
|
||||
git+https://github.com/lowRISC/edalize.git@ot
|
||||
|
||||
# Development version with OT-specific changes
|
||||
git+https://github.com/lowRISC/fusesoc.git@ot
|
||||
@@ -0,0 +1,56 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// This is the top level SystemVerilog file that connects the IO on the board to the Ibex Demo System.
|
||||
module top_artya7 (
|
||||
// These inputs are defined in data/pins_artya7.xdc
|
||||
input IO_CLK,
|
||||
input IO_RST_N,
|
||||
input [ 3:0] SW,
|
||||
input [ 3:0] BTN,
|
||||
output [ 3:0] LED,
|
||||
output [11:0] RGB_LED,
|
||||
output [3:0] DISP_CTRL,
|
||||
input UART_RX,
|
||||
output UART_TX,
|
||||
input SPI_RX,
|
||||
output SPI_TX,
|
||||
output SPI_SCK
|
||||
);
|
||||
parameter SRAMInitFile = "";
|
||||
|
||||
logic clk_sys, rst_sys_n;
|
||||
|
||||
// Instantiating the Ibex Demo System.
|
||||
ibex_demo_system #(
|
||||
.GpiWidth(8),
|
||||
.GpoWidth(8),
|
||||
.PwmWidth(12),
|
||||
.SRAMInitFile(SRAMInitFile)
|
||||
) u_ibex_demo_system (
|
||||
//input
|
||||
.clk_sys_i(clk_sys),
|
||||
.rst_sys_ni(rst_sys_n),
|
||||
.gp_i({SW, BTN}),
|
||||
.uart_rx_i(UART_RX),
|
||||
|
||||
//output
|
||||
.gp_o({LED, DISP_CTRL}),
|
||||
.pwm_o(RGB_LED),
|
||||
.uart_tx_o(UART_TX),
|
||||
|
||||
.spi_rx_i(SPI_RX),
|
||||
.spi_tx_o(SPI_TX),
|
||||
.spi_sck_o(SPI_SCK)
|
||||
);
|
||||
|
||||
// Generating the system clock and reset for the FPGA.
|
||||
clkgen_xil7series clkgen(
|
||||
.IO_CLK,
|
||||
.IO_RST_N,
|
||||
.clk_sys,
|
||||
.rst_sys_n
|
||||
);
|
||||
|
||||
endmodule
|
||||
@@ -0,0 +1,73 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// This is the top level SystemVerilog file that connects the IO on the board to the Ibex Demo System.
|
||||
module top_cw305 (
|
||||
// These inputs are defined in data/pins_cw305.xdc
|
||||
input logic I_pll_clk1,
|
||||
input logic I_cw_clkin,
|
||||
input logic IO_RST_N,
|
||||
input logic IO3,
|
||||
input logic J16,
|
||||
input logic K16,
|
||||
input logic L14,
|
||||
input logic K15,
|
||||
output logic IO4,
|
||||
output logic [ 2:0] LED,
|
||||
input logic UART_RX,
|
||||
output logic UART_TX
|
||||
);
|
||||
parameter SRAMInitFile = "";
|
||||
|
||||
logic clk_sys, rst_sys_n;
|
||||
reg [24:0] clock_heartbeat;
|
||||
|
||||
assign LED[0] = clock_heartbeat[24];
|
||||
assign LED[1] = ~UART_RX || ~UART_TX;
|
||||
assign LED[2] = IO4;
|
||||
|
||||
always @(posedge clk_sys) clock_heartbeat <= clock_heartbeat + 25'd1;
|
||||
|
||||
// Instantiating the Ibex Demo System.
|
||||
ibex_demo_system #(
|
||||
.GpiWidth(5),
|
||||
.GpoWidth(1),
|
||||
.PwmWidth(1),
|
||||
.SRAMInitFile(SRAMInitFile)
|
||||
) u_ibex_demo_system (
|
||||
//input
|
||||
.clk_sys_i(clk_sys),
|
||||
.rst_sys_ni(rst_sys_n),
|
||||
.gp_i({IO3, K15, L14, K16, J16}),
|
||||
.uart_rx_i(UART_RX),
|
||||
|
||||
//output
|
||||
.gp_o(IO4),
|
||||
.pwm_o(),
|
||||
.uart_tx_o(UART_TX),
|
||||
|
||||
.spi_rx_i(1'b0),
|
||||
.spi_tx_o(),
|
||||
.spi_sck_o()
|
||||
);
|
||||
|
||||
// clock source select:
|
||||
logic chosen_clock;
|
||||
BUFGMUX_CTRL U_clock_source_select (
|
||||
.O (chosen_clock),
|
||||
.I0 (I_pll_clk1),
|
||||
.I1 (I_cw_clkin),
|
||||
.S (J16) // J16 selects the clock; 0=on-board PLL, 1=from CW HS2 pin
|
||||
);
|
||||
|
||||
|
||||
// Generating the system clock and reset for the FPGA.
|
||||
clkgen_xil7series clkgen(
|
||||
.IO_CLK (chosen_clock),
|
||||
.IO_RST_N,
|
||||
.clk_sys,
|
||||
.rst_sys_n
|
||||
);
|
||||
|
||||
endmodule
|
||||
@@ -0,0 +1,58 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// This is the top level SystemVerilog file that connects the IO on the board to the Ibex Demo System.
|
||||
module top_cw312a35 (
|
||||
// These inputs are defined in data/pins_cw305.xdc
|
||||
input logic IO_CLK,
|
||||
input logic IO_RST_N,
|
||||
input logic IO3,
|
||||
output logic IO4,
|
||||
output logic [ 2:0] LED,
|
||||
input logic UART_RX,
|
||||
output logic UART_TX
|
||||
);
|
||||
parameter SRAMInitFile = "";
|
||||
|
||||
logic clk_sys, rst_sys_n;
|
||||
reg [24:0] clock_heartbeat;
|
||||
|
||||
assign LED[0] = clock_heartbeat[24];
|
||||
assign LED[1] = ~UART_RX || ~UART_TX;
|
||||
assign LED[2] = IO4;
|
||||
|
||||
always @(posedge clk_sys) clock_heartbeat <= clock_heartbeat + 25'd1;
|
||||
|
||||
// Instantiating the Ibex Demo System.
|
||||
ibex_demo_system #(
|
||||
.GpiWidth(1),
|
||||
.GpoWidth(1),
|
||||
.PwmWidth(1),
|
||||
.SRAMInitFile(SRAMInitFile)
|
||||
) u_ibex_demo_system (
|
||||
//input
|
||||
.clk_sys_i(clk_sys),
|
||||
.rst_sys_ni(rst_sys_n),
|
||||
.gp_i(IO3),
|
||||
.uart_rx_i(UART_RX),
|
||||
|
||||
//output
|
||||
.gp_o(IO4),
|
||||
.pwm_o(),
|
||||
.uart_tx_o(UART_TX),
|
||||
|
||||
.spi_rx_i(1'b0),
|
||||
.spi_tx_o(),
|
||||
.spi_sck_o()
|
||||
);
|
||||
|
||||
// Generating the system clock and reset for the FPGA.
|
||||
clkgen_xil7series clkgen(
|
||||
.IO_CLK,
|
||||
.IO_RST_N,
|
||||
.clk_sys,
|
||||
.rst_sys_n
|
||||
);
|
||||
|
||||
endmodule
|
||||
@@ -0,0 +1,41 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Maintain a counter that increments whilst the input is in the opposite state
|
||||
// from the debounced output. If the input remains in that state for a certain
|
||||
// number of cycles (ClkCount) it is deemed stable and becomes the debounced
|
||||
// output. If the input changes (i.e. it is bouncing) we reset the counter.
|
||||
module debounce #(
|
||||
parameter int unsigned ClkCount = 500
|
||||
) (
|
||||
input logic clk_i,
|
||||
input logic rst_ni,
|
||||
|
||||
input logic btn_i,
|
||||
output logic btn_o
|
||||
);
|
||||
|
||||
logic [$clog2(ClkCount+1)-1:0] cnt_d, cnt_q;
|
||||
logic btn_d, btn_q;
|
||||
|
||||
assign btn_o = btn_q;
|
||||
|
||||
always_ff @(posedge clk_i or negedge rst_ni) begin : p_fsm_reg
|
||||
if (!rst_ni) begin
|
||||
cnt_q <= '0;
|
||||
btn_q <= '0;
|
||||
end else begin
|
||||
cnt_q <= cnt_d;
|
||||
btn_q <= btn_d;
|
||||
end
|
||||
end
|
||||
|
||||
/* verilator lint_off WIDTH */
|
||||
assign btn_d = (cnt_q >= ClkCount) ? btn_i : btn_q;
|
||||
// Clear counter if button input equals stored value or if maximum counter value is reached,
|
||||
// otherwise increment counter.
|
||||
/* verilator lint_off WIDTH */
|
||||
assign cnt_d = (btn_i == btn_q || cnt_q >= ClkCount) ? '0 : cnt_q + 1;
|
||||
|
||||
endmodule
|
||||
@@ -0,0 +1,260 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Top-level debug module (DM)
|
||||
//
|
||||
// This module implements the RISC-V debug specification version 0.13,
|
||||
//
|
||||
// This toplevel wraps the PULP debug module available from
|
||||
// https://github.com/pulp-platform/riscv-dbg to match the needs of
|
||||
// the TL-UL-based lowRISC chip design.
|
||||
|
||||
`include "prim_assert.sv"
|
||||
|
||||
module dm_top #(
|
||||
parameter int NrHarts = 1,
|
||||
parameter logic [31:0] IdcodeValue = 32'h 0000_0001,
|
||||
parameter int BusWidth = 32
|
||||
) (
|
||||
input logic clk_i, // clock
|
||||
input logic rst_ni, // asynchronous reset active low, connect PoR
|
||||
// here, not the system reset
|
||||
input logic testmode_i,
|
||||
output logic ndmreset_o, // non-debug module reset
|
||||
output logic dmactive_o, // debug module is active
|
||||
output logic [NrHarts-1:0] debug_req_o, // async debug request
|
||||
input logic [NrHarts-1:0] unavailable_i, // communicate whether the hart is unavailable
|
||||
// (e.g.: power down)
|
||||
|
||||
// bus device with debug memory, for an execution based technique
|
||||
input logic slave_req_i,
|
||||
input logic slave_we_i,
|
||||
input logic [BusWidth-1:0] slave_addr_i,
|
||||
input logic [BusWidth/8-1:0] slave_be_i,
|
||||
input logic [BusWidth-1:0] slave_wdata_i,
|
||||
output logic [BusWidth-1:0] slave_rdata_o,
|
||||
|
||||
// bus host, for system bus accesses
|
||||
output logic master_req_o,
|
||||
output logic [BusWidth-1:0] master_add_o,
|
||||
output logic master_we_o,
|
||||
output logic [BusWidth-1:0] master_wdata_o,
|
||||
output logic [BusWidth/8-1:0] master_be_o,
|
||||
input logic master_gnt_i,
|
||||
input logic master_r_valid_i,
|
||||
input logic [BusWidth-1:0] master_r_rdata_i
|
||||
);
|
||||
|
||||
`ASSERT_INIT(paramCheckNrHarts, NrHarts > 0)
|
||||
|
||||
// all harts have contiguous IDs
|
||||
localparam logic [NrHarts-1:0] SelectableHarts = {NrHarts{1'b1}};
|
||||
|
||||
// Debug CSRs
|
||||
dm::hartinfo_t [NrHarts-1:0] hartinfo;
|
||||
logic [NrHarts-1:0] halted;
|
||||
logic [NrHarts-1:0] resumeack;
|
||||
logic [NrHarts-1:0] haltreq;
|
||||
logic [NrHarts-1:0] resumereq;
|
||||
logic clear_resumeack;
|
||||
logic cmd_valid;
|
||||
dm::command_t cmd;
|
||||
|
||||
logic cmderror_valid;
|
||||
dm::cmderr_e cmderror;
|
||||
logic cmdbusy;
|
||||
logic [dm::ProgBufSize-1:0][31:0] progbuf;
|
||||
logic [dm::DataCount-1:0][31:0] data_csrs_mem;
|
||||
logic [dm::DataCount-1:0][31:0] data_mem_csrs;
|
||||
logic data_valid;
|
||||
logic [19:0] hartsel;
|
||||
// System Bus Access Module
|
||||
logic [BusWidth-1:0] sbaddress_csrs_sba;
|
||||
logic [BusWidth-1:0] sbaddress_sba_csrs;
|
||||
logic sbaddress_write_valid;
|
||||
logic sbreadonaddr;
|
||||
logic sbautoincrement;
|
||||
logic [2:0] sbaccess;
|
||||
logic sbreadondata;
|
||||
logic [BusWidth-1:0] sbdata_write;
|
||||
logic sbdata_read_valid;
|
||||
logic sbdata_write_valid;
|
||||
logic [BusWidth-1:0] sbdata_read;
|
||||
logic sbdata_valid;
|
||||
logic sbbusy;
|
||||
logic sberror_valid;
|
||||
logic [2:0] sberror;
|
||||
logic ndmreset;
|
||||
|
||||
dm::dmi_req_t dmi_req;
|
||||
dm::dmi_resp_t dmi_rsp;
|
||||
logic dmi_req_valid, dmi_req_ready;
|
||||
logic dmi_rsp_valid, dmi_rsp_ready;
|
||||
logic dmi_rst_n;
|
||||
|
||||
// static debug hartinfo
|
||||
localparam dm::hartinfo_t DebugHartInfo = '{
|
||||
zero1: '0,
|
||||
nscratch: 2, // Debug module needs at least two scratch regs
|
||||
zero0: 0,
|
||||
dataaccess: 1'b1, // data registers are memory mapped in the debugger
|
||||
datasize: dm::DataCount,
|
||||
dataaddr: dm::DataAddr
|
||||
};
|
||||
for (genvar i = 0; i < NrHarts; i++) begin : gen_dm_hart_ctrl
|
||||
assign hartinfo[i] = DebugHartInfo;
|
||||
end
|
||||
|
||||
assign ndmreset_o = ndmreset;
|
||||
|
||||
dm_csrs #(
|
||||
.NrHarts ( NrHarts ),
|
||||
.BusWidth ( BusWidth ),
|
||||
.SelectableHarts ( SelectableHarts )
|
||||
) i_dm_csrs (
|
||||
.clk_i ( clk_i ),
|
||||
.rst_ni ( rst_ni ),
|
||||
.testmode_i ( testmode_i ),
|
||||
.dmi_rst_ni ( dmi_rst_n ),
|
||||
.dmi_req_valid_i ( dmi_req_valid ),
|
||||
.dmi_req_ready_o ( dmi_req_ready ),
|
||||
.dmi_req_i ( dmi_req ),
|
||||
.dmi_resp_valid_o ( dmi_rsp_valid ),
|
||||
.dmi_resp_ready_i ( dmi_rsp_ready ),
|
||||
.dmi_resp_o ( dmi_rsp ),
|
||||
.ndmreset_o ( ndmreset ),
|
||||
.dmactive_o ( dmactive_o ),
|
||||
.hartsel_o ( hartsel ),
|
||||
.hartinfo_i ( hartinfo ),
|
||||
.halted_i ( halted ),
|
||||
.unavailable_i,
|
||||
.resumeack_i ( resumeack ),
|
||||
.haltreq_o ( haltreq ),
|
||||
.resumereq_o ( resumereq ),
|
||||
.clear_resumeack_o ( clear_resumeack ),
|
||||
.cmd_valid_o ( cmd_valid ),
|
||||
.cmd_o ( cmd ),
|
||||
.cmderror_valid_i ( cmderror_valid ),
|
||||
.cmderror_i ( cmderror ),
|
||||
.cmdbusy_i ( cmdbusy ),
|
||||
.progbuf_o ( progbuf ),
|
||||
.data_i ( data_mem_csrs ),
|
||||
.data_valid_i ( data_valid ),
|
||||
.data_o ( data_csrs_mem ),
|
||||
.sbaddress_o ( sbaddress_csrs_sba ),
|
||||
.sbaddress_i ( sbaddress_sba_csrs ),
|
||||
.sbaddress_write_valid_o ( sbaddress_write_valid ),
|
||||
.sbreadonaddr_o ( sbreadonaddr ),
|
||||
.sbautoincrement_o ( sbautoincrement ),
|
||||
.sbaccess_o ( sbaccess ),
|
||||
.sbreadondata_o ( sbreadondata ),
|
||||
.sbdata_o ( sbdata_write ),
|
||||
.sbdata_read_valid_o ( sbdata_read_valid ),
|
||||
.sbdata_write_valid_o ( sbdata_write_valid ),
|
||||
.sbdata_i ( sbdata_read ),
|
||||
.sbdata_valid_i ( sbdata_valid ),
|
||||
.sbbusy_i ( sbbusy ),
|
||||
.sberror_valid_i ( sberror_valid ),
|
||||
.sberror_i ( sberror )
|
||||
);
|
||||
|
||||
dm_sba #(
|
||||
.BusWidth ( BusWidth )
|
||||
) i_dm_sba (
|
||||
.clk_i ( clk_i ),
|
||||
.rst_ni ( rst_ni ),
|
||||
.master_req_o ( master_req_o ),
|
||||
.master_add_o ( master_add_o ),
|
||||
.master_we_o ( master_we_o ),
|
||||
.master_wdata_o ( master_wdata_o ),
|
||||
.master_be_o ( master_be_o ),
|
||||
.master_gnt_i ( master_gnt_i ),
|
||||
.master_r_valid_i ( master_r_valid_i ),
|
||||
.master_r_rdata_i ( master_r_rdata_i ),
|
||||
.dmactive_i ( dmactive_o ),
|
||||
.sbaddress_i ( sbaddress_csrs_sba ),
|
||||
.sbaddress_o ( sbaddress_sba_csrs ),
|
||||
.sbaddress_write_valid_i ( sbaddress_write_valid ),
|
||||
.sbreadonaddr_i ( sbreadonaddr ),
|
||||
.sbautoincrement_i ( sbautoincrement ),
|
||||
.sbaccess_i ( sbaccess ),
|
||||
.sbreadondata_i ( sbreadondata ),
|
||||
.sbdata_i ( sbdata_write ),
|
||||
.sbdata_read_valid_i ( sbdata_read_valid ),
|
||||
.sbdata_write_valid_i ( sbdata_write_valid ),
|
||||
.sbdata_o ( sbdata_read ),
|
||||
.sbdata_valid_o ( sbdata_valid ),
|
||||
.sbbusy_o ( sbbusy ),
|
||||
.sberror_valid_o ( sberror_valid ),
|
||||
.sberror_o ( sberror )
|
||||
);
|
||||
|
||||
dm_mem #(
|
||||
.NrHarts ( NrHarts ),
|
||||
.BusWidth ( BusWidth ),
|
||||
.SelectableHarts ( SelectableHarts ),
|
||||
// The debug module provides a simplified ROM for systems that map the debug ROM to offset 0x0
|
||||
// on the system bus. In that case, only one scratch register has to be implemented in the core.
|
||||
// However, we require that the DM can be placed at arbitrary offsets in the system, which
|
||||
// requires the generalized debug ROM implementation and two scratch registers. We hence set
|
||||
// this parameter to a non-zero value (inside dm_mem, this just feeds into a comparison with 0).
|
||||
.DmBaseAddress ( 1 )
|
||||
) i_dm_mem (
|
||||
.clk_i ( clk_i ),
|
||||
.rst_ni ( rst_ni ),
|
||||
.ndmreset_i ( ndmreset ),
|
||||
.debug_req_o ( debug_req_o ),
|
||||
.hartsel_i ( hartsel ),
|
||||
.haltreq_i ( haltreq ),
|
||||
.resumereq_i ( resumereq ),
|
||||
.clear_resumeack_i ( clear_resumeack ),
|
||||
.halted_o ( halted ),
|
||||
.resuming_o ( resumeack ),
|
||||
.cmd_valid_i ( cmd_valid ),
|
||||
.cmd_i ( cmd ),
|
||||
.cmderror_valid_o ( cmderror_valid ),
|
||||
.cmderror_o ( cmderror ),
|
||||
.cmdbusy_o ( cmdbusy ),
|
||||
.progbuf_i ( progbuf ),
|
||||
.data_i ( data_csrs_mem ),
|
||||
.data_o ( data_mem_csrs ),
|
||||
.data_valid_o ( data_valid ),
|
||||
.req_i ( slave_req_i ),
|
||||
.we_i ( slave_we_i ),
|
||||
.addr_i ( slave_addr_i ),
|
||||
.wdata_i ( slave_wdata_i ),
|
||||
.be_i ( slave_be_i ),
|
||||
.rdata_o ( slave_rdata_o )
|
||||
);
|
||||
|
||||
// Bound-in DPI module replaces the TAP
|
||||
`ifndef DMIDirectTAP
|
||||
// JTAG TAP
|
||||
dmi_jtag #(
|
||||
.IdcodeValue ( IdcodeValue )
|
||||
) dap (
|
||||
.clk_i (clk_i ),
|
||||
.rst_ni (rst_ni ),
|
||||
.testmode_i (testmode_i ),
|
||||
|
||||
.dmi_rst_no (dmi_rst_n ),
|
||||
.dmi_req_o (dmi_req ),
|
||||
.dmi_req_valid_o (dmi_req_valid),
|
||||
.dmi_req_ready_i (dmi_req_ready),
|
||||
|
||||
.dmi_resp_i (dmi_rsp ),
|
||||
.dmi_resp_ready_o (dmi_rsp_ready),
|
||||
.dmi_resp_valid_i (dmi_rsp_valid),
|
||||
|
||||
//JTAG
|
||||
.tck_i (1'b0),
|
||||
.tms_i (1'b0),
|
||||
.trst_ni (1'b0),
|
||||
.td_i (1'b0),
|
||||
.td_o (),
|
||||
.tdo_oe_o ()
|
||||
);
|
||||
`endif
|
||||
|
||||
endmodule
|
||||
@@ -0,0 +1,100 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
module gpio #(
|
||||
GpiWidth = 8,
|
||||
GpoWidth = 16
|
||||
) (
|
||||
input logic clk_i,
|
||||
input logic rst_ni,
|
||||
|
||||
input logic device_req_i,
|
||||
input logic [31:0] device_addr_i,
|
||||
input logic device_we_i,
|
||||
input logic [ 3:0] device_be_i,
|
||||
input logic [31:0] device_wdata_i,
|
||||
output logic device_rvalid_o,
|
||||
output logic [31:0] device_rdata_o,
|
||||
|
||||
input logic [GpiWidth-1:0] gp_i,
|
||||
output logic [GpoWidth-1:0] gp_o
|
||||
);
|
||||
|
||||
localparam int unsigned GPIO_OUT_REG = 32'h0;
|
||||
localparam int unsigned GPIO_IN_REG = 32'h4;
|
||||
localparam int unsigned GPIO_IN_DBNC_REG = 32'h8;
|
||||
|
||||
logic [11:0] reg_addr;
|
||||
|
||||
logic [2:0][GpiWidth-1:0] gp_i_q;
|
||||
logic [GpiWidth-1:0] gp_i_dbnc;
|
||||
logic [GpoWidth-1:0] gp_o_d;
|
||||
|
||||
logic gp_o_wr_en;
|
||||
logic gp_i_rd_en_d, gp_i_rd_en_q;
|
||||
logic gp_i_dbnc_rd_en_d, gp_i_dbnc_rd_en_q;
|
||||
|
||||
// instantiate debouncers for all GP inputs
|
||||
for (genvar i = 0; i < GpiWidth; i++) begin
|
||||
debounce #(
|
||||
.ClkCount(500)
|
||||
) dbnc (
|
||||
.clk_i,
|
||||
.rst_ni,
|
||||
.btn_i(gp_i_q[2][i]),
|
||||
.btn_o(gp_i_dbnc[i])
|
||||
);
|
||||
end
|
||||
|
||||
always @(posedge clk_i or negedge rst_ni) begin
|
||||
if (!rst_ni) begin
|
||||
gp_i_q <= '0;
|
||||
gp_o <= '0;
|
||||
device_rvalid_o <= '0;
|
||||
gp_i_rd_en_q <= '0;
|
||||
gp_i_dbnc_rd_en_q <= '0;
|
||||
end else begin
|
||||
gp_i_q <= {gp_i_q[1:0], gp_i};
|
||||
if (gp_o_wr_en) begin
|
||||
gp_o <= gp_o_d;
|
||||
end
|
||||
device_rvalid_o <= device_req_i;
|
||||
gp_i_rd_en_q <= gp_i_rd_en_d;
|
||||
gp_i_dbnc_rd_en_q <= gp_i_dbnc_rd_en_d;
|
||||
end
|
||||
end
|
||||
|
||||
// assign gp_o_d regarding to device_be_i and GpoWidth
|
||||
for (genvar i_byte = 0; i_byte < 4; ++i_byte) begin : g_gp_o_d;
|
||||
if (i_byte * 8 < GpoWidth) begin : g_gp_o_d_inner
|
||||
localparam int gpo_byte_end = (i_byte + 1) * 8 <= GpoWidth ? (i_byte + 1) * 8 : GpoWidth;
|
||||
assign gp_o_d[gpo_byte_end - 1 : i_byte * 8] =
|
||||
device_be_i[i_byte] ? device_wdata_i[gpo_byte_end - 1 : i_byte * 8] :
|
||||
gp_o[gpo_byte_end - 1 : i_byte * 8];
|
||||
end
|
||||
end
|
||||
|
||||
// decode write and read requests
|
||||
assign reg_addr = device_addr_i[11:0];
|
||||
assign gp_o_wr_en = device_req_i & device_we_i & (reg_addr == GPIO_OUT_REG[11:0]);
|
||||
assign gp_i_rd_en_d = device_req_i & ~device_we_i & (reg_addr == GPIO_IN_REG[11:0]);
|
||||
assign gp_i_dbnc_rd_en_d = device_req_i & ~device_we_i & (reg_addr == GPIO_IN_DBNC_REG[11:0]);
|
||||
|
||||
// assign device_rdata_o according to request type
|
||||
always_comb begin
|
||||
if (gp_i_dbnc_rd_en_q)
|
||||
device_rdata_o = {{(32 - GpiWidth){1'b0}}, gp_i_dbnc};
|
||||
else if (gp_i_rd_en_q)
|
||||
device_rdata_o = {{(32 - GpiWidth){1'b0}}, gp_i_q[2]};
|
||||
else
|
||||
device_rdata_o = {{(32 - GpoWidth){1'b0}}, gp_o};
|
||||
end
|
||||
|
||||
logic unused_device_addr, unused_device_be, unused_device_wdata;
|
||||
|
||||
assign unused_device_addr = ^device_addr_i[31:10];
|
||||
// TODO: Do this more neatly
|
||||
assign unused_device_be = ^device_be_i;
|
||||
assign unused_device_wdata = ^device_wdata_i[31:GpoWidth];
|
||||
endmodule
|
||||
@@ -0,0 +1,493 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// The Ibex demo system, which instantiates and connects the following blocks:
|
||||
// - Memory bus.
|
||||
// - Ibex top module.
|
||||
// - RAM memory to contain code and data.
|
||||
// - GPIO driving logic.
|
||||
// - UART for serial communication.
|
||||
// - Timer.
|
||||
// - Debug module.
|
||||
// - SPI for driving LCD screen
|
||||
module ibex_demo_system #(
|
||||
parameter int GpiWidth = 8,
|
||||
parameter int GpoWidth = 16,
|
||||
parameter int PwmWidth = 12,
|
||||
parameter SRAMInitFile = ""
|
||||
) (
|
||||
input logic clk_sys_i,
|
||||
input logic clk_sys_fast_i,
|
||||
input logic rst_sys_ni,
|
||||
|
||||
input logic [GpiWidth-1:0] gp_i,
|
||||
output logic [GpoWidth-1:0] gp_o,
|
||||
output logic [PwmWidth-1:0] pwm_o,
|
||||
input logic uart_rx_i,
|
||||
output logic uart_tx_o,
|
||||
input logic spi_rx_i,
|
||||
output logic spi_tx_o,
|
||||
output logic spi_sck_o
|
||||
);
|
||||
localparam logic [31:0] MEM_SIZE = 32'hE00000; // 10 MB
|
||||
localparam logic [31:0] MEM_START = 32'h01000000;
|
||||
localparam logic [31:0] MEM_MASK = ~(MEM_SIZE-1);
|
||||
|
||||
localparam logic [31:0] GPIO_SIZE = 4 * 1024; // 4 KiB
|
||||
localparam logic [31:0] GPIO_START = 32'h80000000;
|
||||
localparam logic [31:0] GPIO_MASK = ~(GPIO_SIZE-1);
|
||||
|
||||
localparam logic [31:0] DEBUG_START = 32'h1a110000;
|
||||
localparam logic [31:0] DEBUG_SIZE = 64 * 1024; // 64 KiB
|
||||
localparam logic [31:0] DEBUG_MASK = ~(DEBUG_SIZE-1);
|
||||
|
||||
localparam logic [31:0] UART_SIZE = 4 * 1024; // 4 KiB
|
||||
localparam logic [31:0] UART_START = 32'h80001000;
|
||||
localparam logic [31:0] UART_MASK = ~(UART_SIZE-1);
|
||||
|
||||
localparam logic [31:0] TIMER_SIZE = 4 * 1024; // 4 KiB
|
||||
localparam logic [31:0] TIMER_START = 32'h80002000;
|
||||
localparam logic [31:0] TIMER_MASK = ~(TIMER_SIZE-1);
|
||||
|
||||
localparam logic [31:0] PWM_SIZE = 4 * 1024; // 4 KiB
|
||||
localparam logic [31:0] PWM_START = 32'h80003000;
|
||||
localparam logic [31:0] PWM_MASK = ~(PWM_SIZE-1);
|
||||
localparam int PwmCtrSize = 8;
|
||||
|
||||
parameter logic [31:0] SPI_SIZE = 1 * 1024; // 1kB
|
||||
parameter logic [31:0] SPI_START = 32'h80004000;
|
||||
parameter logic [31:0] SPI_MASK = ~(SPI_SIZE-1);
|
||||
|
||||
parameter logic [31:0] SIM_CTRL_SIZE = 1 * 1024; // 1kB
|
||||
parameter logic [31:0] SIM_CTRL_START = 32'h20000;
|
||||
parameter logic [31:0] SIM_CTRL_MASK = ~(SIM_CTRL_SIZE-1);
|
||||
|
||||
// debug functionality is optional
|
||||
localparam bit DBG = 1;
|
||||
localparam int unsigned DbgHwBreakNum = (DBG == 1) ? 2 : 0;
|
||||
localparam bit DbgTriggerEn = (DBG == 1) ? 1'b1 : 1'b0;
|
||||
|
||||
typedef enum int {
|
||||
CoreD,
|
||||
DbgHost
|
||||
} bus_host_e;
|
||||
|
||||
typedef enum int {
|
||||
Ram,
|
||||
Gpio,
|
||||
Pwm,
|
||||
Uart,
|
||||
Timer,
|
||||
Spi,
|
||||
SimCtrl,
|
||||
DbgDev
|
||||
} bus_device_e;
|
||||
|
||||
localparam int NrDevices = DBG ? 8 : 7;
|
||||
localparam int NrHosts = DBG ? 2 : 1;
|
||||
|
||||
// interrupts
|
||||
logic timer_irq;
|
||||
logic uart_irq;
|
||||
|
||||
// host and device signals
|
||||
logic host_req [NrHosts];
|
||||
logic host_gnt [NrHosts];
|
||||
logic [31:0] host_addr [NrHosts];
|
||||
logic host_we [NrHosts];
|
||||
logic [ 3:0] host_be [NrHosts];
|
||||
logic [31:0] host_wdata [NrHosts];
|
||||
logic host_rvalid [NrHosts];
|
||||
logic [31:0] host_rdata [NrHosts];
|
||||
logic host_err [NrHosts];
|
||||
|
||||
// devices (slaves)
|
||||
logic device_req [NrDevices];
|
||||
logic [31:0] device_addr [NrDevices];
|
||||
logic device_we [NrDevices];
|
||||
logic [ 3:0] device_be [NrDevices];
|
||||
logic [31:0] device_wdata [NrDevices];
|
||||
logic device_rvalid [NrDevices];
|
||||
logic [31:0] device_rdata [NrDevices];
|
||||
logic device_err [NrDevices];
|
||||
|
||||
// Instruction fetch signals
|
||||
logic core_instr_req;
|
||||
logic core_instr_gnt;
|
||||
logic core_instr_rvalid;
|
||||
logic [31:0] core_instr_addr;
|
||||
logic [31:0] core_instr_rdata;
|
||||
logic core_instr_sel_dbg;
|
||||
|
||||
logic mem_instr_req;
|
||||
logic [31:0] mem_instr_rdata;
|
||||
logic dbg_instr_req;
|
||||
|
||||
logic dbg_slave_req;
|
||||
logic [31:0] dbg_slave_addr;
|
||||
logic dbg_slave_we;
|
||||
logic [ 3:0] dbg_slave_be;
|
||||
logic [31:0] dbg_slave_wdata;
|
||||
logic dbg_slave_rvalid;
|
||||
logic [31:0] dbg_slave_rdata;
|
||||
|
||||
// Internally generated resets cause IMPERFECTSCH warnings
|
||||
/* verilator lint_off IMPERFECTSCH */
|
||||
logic rst_core_n;
|
||||
logic ndmreset_req;
|
||||
logic dm_debug_req;
|
||||
|
||||
// Device address mapping
|
||||
logic [31:0] cfg_device_addr_base [NrDevices];
|
||||
logic [31:0] cfg_device_addr_mask [NrDevices];
|
||||
|
||||
assign cfg_device_addr_base[Ram] = MEM_START;
|
||||
assign cfg_device_addr_mask[Ram] = MEM_MASK;
|
||||
assign cfg_device_addr_base[Gpio] = GPIO_START;
|
||||
assign cfg_device_addr_mask[Gpio] = GPIO_MASK;
|
||||
assign cfg_device_addr_base[Pwm] = PWM_START;
|
||||
assign cfg_device_addr_mask[Pwm] = PWM_MASK;
|
||||
assign cfg_device_addr_base[Uart] = UART_START;
|
||||
assign cfg_device_addr_mask[Uart] = UART_MASK;
|
||||
assign cfg_device_addr_base[Timer] = TIMER_START;
|
||||
assign cfg_device_addr_mask[Timer] = TIMER_MASK;
|
||||
assign cfg_device_addr_base[Spi] = SPI_START;
|
||||
assign cfg_device_addr_mask[Spi] = SPI_MASK;
|
||||
assign cfg_device_addr_base[SimCtrl] = SIM_CTRL_START;
|
||||
assign cfg_device_addr_mask[SimCtrl] = SIM_CTRL_MASK;
|
||||
|
||||
if (DBG) begin : g_dbg_device_cfg
|
||||
assign cfg_device_addr_base[DbgDev] = DEBUG_START;
|
||||
assign cfg_device_addr_mask[DbgDev] = DEBUG_MASK;
|
||||
assign device_err[DbgDev] = 1'b0;
|
||||
end
|
||||
|
||||
// Tie-off unused error signals
|
||||
assign device_err[Ram] = 1'b0;
|
||||
assign device_err[Gpio] = 1'b0;
|
||||
assign device_err[Pwm] = 1'b0;
|
||||
assign device_err[Uart] = 1'b0;
|
||||
assign device_err[Spi] = 1'b0;
|
||||
assign device_err[SimCtrl] = 1'b0;
|
||||
|
||||
bus #(
|
||||
.NrDevices ( NrDevices ),
|
||||
.NrHosts ( NrHosts ),
|
||||
.DataWidth ( 32 ),
|
||||
.AddressWidth ( 32 )
|
||||
) u_bus (
|
||||
.clk_i (clk_sys_i),
|
||||
.rst_ni (rst_sys_ni),
|
||||
|
||||
.host_req_i (host_req ),
|
||||
.host_gnt_o (host_gnt ),
|
||||
.host_addr_i (host_addr ),
|
||||
.host_we_i (host_we ),
|
||||
.host_be_i (host_be ),
|
||||
.host_wdata_i (host_wdata ),
|
||||
.host_rvalid_o (host_rvalid ),
|
||||
.host_rdata_o (host_rdata ),
|
||||
.host_err_o (host_err ),
|
||||
|
||||
.device_req_o (device_req ),
|
||||
.device_addr_o (device_addr ),
|
||||
.device_we_o (device_we ),
|
||||
.device_be_o (device_be ),
|
||||
.device_wdata_o (device_wdata ),
|
||||
.device_rvalid_i (device_rvalid),
|
||||
.device_rdata_i (device_rdata ),
|
||||
.device_err_i (device_err ),
|
||||
|
||||
.cfg_device_addr_base,
|
||||
.cfg_device_addr_mask
|
||||
);
|
||||
|
||||
assign mem_instr_req =
|
||||
core_instr_req & ((core_instr_addr & cfg_device_addr_mask[Ram]) == cfg_device_addr_base[Ram]);
|
||||
|
||||
assign dbg_instr_req =
|
||||
core_instr_req & ((core_instr_addr & cfg_device_addr_mask[DbgDev]) == cfg_device_addr_base[DbgDev]);
|
||||
|
||||
assign core_instr_gnt = mem_instr_req | (dbg_instr_req & ~device_req[DbgDev]);
|
||||
|
||||
always @(posedge clk_sys_i or negedge rst_sys_ni) begin
|
||||
if (!rst_sys_ni) begin
|
||||
core_instr_rvalid <= 1'b0;
|
||||
core_instr_sel_dbg <= 1'b0;
|
||||
end else begin
|
||||
core_instr_rvalid <= core_instr_gnt;
|
||||
core_instr_sel_dbg <= dbg_instr_req;
|
||||
end
|
||||
end
|
||||
|
||||
assign core_instr_rdata = core_instr_sel_dbg ? dbg_slave_rdata : mem_instr_rdata;
|
||||
|
||||
assign rst_core_n = rst_sys_ni & ~ndmreset_req;
|
||||
|
||||
ibex_top #(
|
||||
.RegFile ( ibex_pkg::RegFileFPGA ),
|
||||
.MHPMCounterNum ( 10 ),
|
||||
.RV32M ( ibex_pkg::RV32MSingleCycle ),
|
||||
.ICache ( 1'b1 ),
|
||||
.ICacheECC ( 1'b1 ),
|
||||
.BranchPredictor ( 1'b1 ),
|
||||
.ICacheScramble ( 1'b1 ),
|
||||
.RV32B ( ibex_pkg::RV32BNone ),
|
||||
.DbgTriggerEn ( DbgTriggerEn ),
|
||||
.DbgHwBreakNum ( DbgHwBreakNum ),
|
||||
.DmHaltAddr ( DEBUG_START + dm::HaltAddress[31:0] ),
|
||||
.DmExceptionAddr ( DEBUG_START + dm::ExceptionAddress[31:0])
|
||||
) u_top (
|
||||
.clk_i (clk_sys_i),
|
||||
.clk_i_fast (clk_sys_fast_i),
|
||||
.rst_ni(rst_core_n),
|
||||
|
||||
.test_en_i ('b0),
|
||||
.scan_rst_ni(1'b1),
|
||||
.ram_cfg_i ('b0),
|
||||
|
||||
.hart_id_i(32'b0),
|
||||
// First instruction executed is at 0x0 + 0x80
|
||||
.boot_addr_i(32'h01000000),
|
||||
|
||||
.instr_req_o (core_instr_req),
|
||||
.instr_gnt_i (core_instr_gnt),
|
||||
.instr_rvalid_i (core_instr_rvalid),
|
||||
.instr_addr_o (core_instr_addr),
|
||||
.instr_rdata_i (core_instr_rdata),
|
||||
.instr_rdata_intg_i('0),
|
||||
.instr_err_i ('0),
|
||||
|
||||
.data_req_o (host_req[CoreD]),
|
||||
.data_gnt_i (host_gnt[CoreD]),
|
||||
.data_rvalid_i (host_rvalid[CoreD]),
|
||||
.data_we_o (host_we[CoreD]),
|
||||
.data_be_o (host_be[CoreD]),
|
||||
.data_addr_o (host_addr[CoreD]),
|
||||
.data_wdata_o (host_wdata[CoreD]),
|
||||
.data_wdata_intg_o(),
|
||||
.data_rdata_i (host_rdata[CoreD]),
|
||||
.data_rdata_intg_i('0),
|
||||
.data_err_i (host_err[CoreD]),
|
||||
|
||||
.irq_software_i(1'b0),
|
||||
.irq_timer_i (timer_irq),
|
||||
.irq_external_i(1'b0),
|
||||
.irq_fast_i ({14'b0, uart_irq}),
|
||||
.irq_nm_i (1'b0),
|
||||
|
||||
.scramble_key_valid_i('0),
|
||||
.scramble_key_i ('0),
|
||||
.scramble_nonce_i ('0),
|
||||
.scramble_req_o (),
|
||||
|
||||
.debug_req_i (dm_debug_req),
|
||||
.crash_dump_o (),
|
||||
.double_fault_seen_o(),
|
||||
|
||||
.fetch_enable_i ('1),
|
||||
.alert_minor_o (),
|
||||
.alert_major_internal_o(),
|
||||
.alert_major_bus_o (),
|
||||
.core_sleep_o ()
|
||||
);
|
||||
|
||||
ram_2p #(
|
||||
.Depth ( MEM_SIZE / 4 ),
|
||||
.MemInitFile ( SRAMInitFile )
|
||||
) u_ram (
|
||||
.clk_i (clk_sys_i),
|
||||
.rst_ni (rst_sys_ni),
|
||||
|
||||
.a_req_i (device_req[Ram]),
|
||||
.a_we_i (device_we[Ram]),
|
||||
.a_be_i (device_be[Ram]),
|
||||
.a_addr_i (device_addr[Ram]),
|
||||
.a_wdata_i (device_wdata[Ram]),
|
||||
.a_rvalid_o (device_rvalid[Ram]),
|
||||
.a_rdata_o (device_rdata[Ram]),
|
||||
|
||||
.b_req_i (mem_instr_req),
|
||||
.b_we_i (1'b0),
|
||||
.b_be_i (4'b0),
|
||||
.b_addr_i (core_instr_addr),
|
||||
.b_wdata_i (32'b0),
|
||||
.b_rvalid_o (),
|
||||
.b_rdata_o (mem_instr_rdata)
|
||||
);
|
||||
|
||||
gpio #(
|
||||
.GpiWidth ( GpiWidth ),
|
||||
.GpoWidth ( GpoWidth )
|
||||
) u_gpio (
|
||||
.clk_i (clk_sys_i),
|
||||
.rst_ni (rst_sys_ni),
|
||||
|
||||
.device_req_i (device_req[Gpio]),
|
||||
.device_addr_i (device_addr[Gpio]),
|
||||
.device_we_i (device_we[Gpio]),
|
||||
.device_be_i (device_be[Gpio]),
|
||||
.device_wdata_i (device_wdata[Gpio]),
|
||||
.device_rvalid_o(device_rvalid[Gpio]),
|
||||
.device_rdata_o (device_rdata[Gpio]),
|
||||
|
||||
.gp_i,
|
||||
.gp_o
|
||||
);
|
||||
|
||||
pwm_wrapper #(
|
||||
.PwmWidth ( PwmWidth ),
|
||||
.PwmCtrSize ( PwmCtrSize ),
|
||||
.BusWidth ( 32 )
|
||||
) u_pwm (
|
||||
.clk_i (clk_sys_i),
|
||||
.rst_ni (rst_sys_ni),
|
||||
|
||||
.device_req_i (device_req[Pwm]),
|
||||
.device_addr_i (device_addr[Pwm]),
|
||||
.device_we_i (device_we[Pwm]),
|
||||
.device_be_i (device_be[Pwm]),
|
||||
.device_wdata_i (device_wdata[Pwm]),
|
||||
.device_rvalid_o(device_rvalid[Pwm]),
|
||||
.device_rdata_o (device_rdata[Pwm]),
|
||||
|
||||
.pwm_o
|
||||
);
|
||||
|
||||
uart #(
|
||||
.ClockFrequency ( 50_000_000 )
|
||||
) u_uart (
|
||||
.clk_i (clk_sys_i),
|
||||
.rst_ni (rst_sys_ni),
|
||||
|
||||
.device_req_i (device_req[Uart]),
|
||||
.device_addr_i (device_addr[Uart]),
|
||||
.device_we_i (device_we[Uart]),
|
||||
.device_be_i (device_be[Uart]),
|
||||
.device_wdata_i (device_wdata[Uart]),
|
||||
.device_rvalid_o(device_rvalid[Uart]),
|
||||
.device_rdata_o (device_rdata[Uart]),
|
||||
|
||||
.uart_rx_i,
|
||||
.uart_irq_o (uart_irq),
|
||||
.uart_tx_o
|
||||
);
|
||||
|
||||
spi_top #(
|
||||
.ClockFrequency(50_000_000),
|
||||
.CPOL(0),
|
||||
.CPHA(1)
|
||||
) u_spi (
|
||||
.clk_i (clk_sys_i),
|
||||
.rst_ni(rst_sys_ni),
|
||||
|
||||
.device_req_i (device_req[Spi]),
|
||||
.device_addr_i (device_addr[Spi]),
|
||||
.device_we_i (device_we[Spi]),
|
||||
.device_be_i (device_be[Spi]),
|
||||
.device_wdata_i (device_wdata[Spi]),
|
||||
.device_rvalid_o(device_rvalid[Spi]),
|
||||
.device_rdata_o (device_rdata[Spi]),
|
||||
|
||||
.spi_rx_i(spi_rx_i), // Data received from SPI device
|
||||
.spi_tx_o(spi_tx_o), // Data transmitted to SPI device
|
||||
.sck_o(spi_sck_o), // Serial clock pin
|
||||
|
||||
.byte_data_o() // unused
|
||||
);
|
||||
|
||||
`ifdef VERILATOR
|
||||
simulator_ctrl #(
|
||||
.LogName("ibex_demo_system.log")
|
||||
) u_simulator_ctrl (
|
||||
.clk_i (clk_sys_i),
|
||||
.rst_ni (rst_sys_ni),
|
||||
|
||||
.req_i (device_req[SimCtrl]),
|
||||
.we_i (device_we[SimCtrl]),
|
||||
.be_i (device_be[SimCtrl]),
|
||||
.addr_i (device_addr[SimCtrl]),
|
||||
.wdata_i (device_wdata[SimCtrl]),
|
||||
.rvalid_o (device_rvalid[SimCtrl]),
|
||||
.rdata_o (device_rdata[SimCtrl])
|
||||
);
|
||||
`endif
|
||||
|
||||
timer #(
|
||||
.DataWidth ( 32 ),
|
||||
.AddressWidth ( 32 )
|
||||
) u_timer (
|
||||
.clk_i (clk_sys_i),
|
||||
.rst_ni (rst_sys_ni),
|
||||
|
||||
.timer_req_i (device_req[Timer]),
|
||||
.timer_we_i (device_we[Timer]),
|
||||
.timer_be_i (device_be[Timer]),
|
||||
.timer_addr_i (device_addr[Timer]),
|
||||
.timer_wdata_i (device_wdata[Timer]),
|
||||
.timer_rvalid_o(device_rvalid[Timer]),
|
||||
.timer_rdata_o (device_rdata[Timer]),
|
||||
.timer_err_o (device_err[Timer]),
|
||||
.timer_intr_o (timer_irq)
|
||||
);
|
||||
|
||||
assign dbg_slave_req = device_req[DbgDev] | dbg_instr_req;
|
||||
assign dbg_slave_we = device_req[DbgDev] & device_we[DbgDev];
|
||||
assign dbg_slave_addr = device_req[DbgDev] ? device_addr[DbgDev] : core_instr_addr;
|
||||
assign dbg_slave_be = device_be[DbgDev];
|
||||
assign dbg_slave_wdata = device_wdata[DbgDev];
|
||||
assign device_rvalid[DbgDev] = dbg_slave_rvalid;
|
||||
assign device_rdata[DbgDev] = dbg_slave_rdata;
|
||||
|
||||
always @(posedge clk_sys_i or negedge rst_sys_ni) begin
|
||||
if (!rst_sys_ni) begin
|
||||
dbg_slave_rvalid <= 1'b0;
|
||||
end else begin
|
||||
dbg_slave_rvalid <= device_req[DbgDev];
|
||||
end
|
||||
end
|
||||
|
||||
if (DBG) begin : g_dm_top
|
||||
dm_top #(
|
||||
.NrHarts ( 1 )
|
||||
) u_dm_top (
|
||||
.clk_i (clk_sys_i),
|
||||
.rst_ni (rst_sys_ni),
|
||||
.testmode_i (1'b0),
|
||||
.ndmreset_o (ndmreset_req),
|
||||
.dmactive_o (),
|
||||
.debug_req_o (dm_debug_req),
|
||||
.unavailable_i (1'b0),
|
||||
|
||||
// bus device with debug memory (for execution-based debug)
|
||||
.slave_req_i (dbg_slave_req),
|
||||
.slave_we_i (dbg_slave_we),
|
||||
.slave_addr_i (dbg_slave_addr),
|
||||
.slave_be_i (dbg_slave_be),
|
||||
.slave_wdata_i (dbg_slave_wdata),
|
||||
.slave_rdata_o (dbg_slave_rdata),
|
||||
|
||||
// bus host (for system bus accesses, SBA)
|
||||
.master_req_o (host_req[DbgHost]),
|
||||
.master_add_o (host_addr[DbgHost]),
|
||||
.master_we_o (host_we[DbgHost]),
|
||||
.master_wdata_o (host_wdata[DbgHost]),
|
||||
.master_be_o (host_be[DbgHost]),
|
||||
.master_gnt_i (host_gnt[DbgHost]),
|
||||
.master_r_valid_i (host_rvalid[DbgHost]),
|
||||
.master_r_rdata_i (host_rdata[DbgHost])
|
||||
);
|
||||
end else begin
|
||||
assign dm_debug_req = 1'b0;
|
||||
assign ndmreset_req = 1'b0;
|
||||
end
|
||||
|
||||
`ifdef VERILATOR
|
||||
export "DPI-C" function mhpmcounter_get;
|
||||
|
||||
function automatic longint unsigned mhpmcounter_get(int index);
|
||||
return u_top.u_ibex_core.cs_registers_i.mhpmcounter[index];
|
||||
endfunction
|
||||
`endif
|
||||
endmodule
|
||||
@@ -0,0 +1,42 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
module pwm #(
|
||||
parameter int CtrSize = 8
|
||||
) (
|
||||
input logic clk_i,
|
||||
input logic rst_ni,
|
||||
|
||||
// To produce an always-on signal, you will need to make pulse_width_i > max_counter_i.
|
||||
input logic [CtrSize-1:0] pulse_width_i,
|
||||
input logic [CtrSize-1:0] max_counter_i,
|
||||
|
||||
output logic modulated_o
|
||||
);
|
||||
logic [CtrSize-1:0] counter;
|
||||
|
||||
always_ff @(posedge clk_i or negedge rst_ni) begin
|
||||
if (!rst_ni) begin
|
||||
counter <= 'b0;
|
||||
modulated_o <= 'b0;
|
||||
end else if (max_counter_i == 0) begin
|
||||
// Set output to low when maximum is zero.
|
||||
counter <= 'b0;
|
||||
modulated_o <= 'b0;
|
||||
end else begin
|
||||
// Wrap the counter once it gets to the maximum.
|
||||
if (counter < max_counter_i) begin
|
||||
counter <= counter + 1;
|
||||
end else begin
|
||||
counter <= 0;
|
||||
end
|
||||
// Set output to high for pulse_width_i/max_counter_i amount of time.
|
||||
if (pulse_width_i > counter) begin
|
||||
modulated_o <= 1'b1;
|
||||
end else begin
|
||||
modulated_o <= 1'b0;
|
||||
end
|
||||
end
|
||||
end
|
||||
endmodule
|
||||
@@ -0,0 +1,91 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// This wrapper instantiates a series of PWMs and distributes requests from the device bus.
|
||||
module pwm_wrapper #(
|
||||
parameter int PwmWidth = 12,
|
||||
parameter int PwmCtrSize = 8,
|
||||
parameter int BusWidth = 32
|
||||
) (
|
||||
input logic clk_i,
|
||||
input logic rst_ni,
|
||||
|
||||
// IO for device bus.
|
||||
input logic device_req_i,
|
||||
input logic [BusWidth-1:0] device_addr_i,
|
||||
input logic device_we_i,
|
||||
input logic [ 3:0] device_be_i,
|
||||
input logic [BusWidth-1:0] device_wdata_i,
|
||||
output logic device_rvalid_o,
|
||||
output logic [BusWidth-1:0] device_rdata_o,
|
||||
|
||||
// Collected output of all PWMs.
|
||||
output logic [PwmWidth-1:0] pwm_o
|
||||
);
|
||||
|
||||
localparam int unsigned AddrWidth = 10;
|
||||
localparam int unsigned PwmIdxOffset = $clog2(BusWidth / 8) + 1;
|
||||
localparam int unsigned PwmIdxWidth = AddrWidth - PwmIdxOffset;
|
||||
|
||||
// Generate PwmWidth number of PWMs.
|
||||
for (genvar i = 0; i < PwmWidth; i++) begin : gen_pwm
|
||||
logic [PwmCtrSize-1:0] data_d;
|
||||
logic [PwmCtrSize-1:0] counter_q;
|
||||
logic [PwmCtrSize-1:0] pulse_width_q;
|
||||
logic counter_en;
|
||||
logic pulse_width_en;
|
||||
logic [PwmIdxWidth-1:0] pwm_idx;
|
||||
|
||||
assign pwm_idx = i;
|
||||
|
||||
// Byte enables are currently unsupported for PWM.
|
||||
assign data_d = device_wdata_i[PwmCtrSize-1:0]; // Only take PwmCtrSize LSBs.
|
||||
// Each PWM has a 64-bit block. The most significant 32 bits are the counter and the least
|
||||
// significant 32 bits are the pulse width.
|
||||
assign counter_en = device_req_i & device_we_i
|
||||
& (device_addr_i[AddrWidth-1:PwmIdxOffset] == pwm_idx)
|
||||
& device_addr_i[PwmIdxOffset-1];
|
||||
assign pulse_width_en = device_req_i & device_we_i
|
||||
& (device_addr_i[AddrWidth-1:PwmIdxOffset] == pwm_idx)
|
||||
& ~device_addr_i[PwmIdxOffset-1];
|
||||
|
||||
always @(posedge clk_i or negedge rst_ni) begin
|
||||
if (!rst_ni) begin
|
||||
counter_q <= '0;
|
||||
pulse_width_q <= '0;
|
||||
end else begin
|
||||
if (counter_en) begin
|
||||
counter_q <= data_d;
|
||||
end
|
||||
if (pulse_width_en) begin
|
||||
pulse_width_q <= data_d;
|
||||
end
|
||||
end
|
||||
end
|
||||
pwm #(
|
||||
.CtrSize( PwmCtrSize )
|
||||
) u_pwm (
|
||||
.clk_i (clk_i),
|
||||
.rst_ni (rst_ni),
|
||||
.pulse_width_i(pulse_width_q),
|
||||
.max_counter_i(counter_q),
|
||||
.modulated_o (pwm_o[i])
|
||||
);
|
||||
end : gen_pwm
|
||||
|
||||
// Generating the device bus output.
|
||||
// Reading from PWM currently not possible.
|
||||
assign device_rdata_o = 32'b0;
|
||||
always @(posedge clk_i or negedge rst_ni) begin
|
||||
if (!rst_ni) begin
|
||||
device_rvalid_o <= 1'b0;
|
||||
end else begin
|
||||
// TODO only set rvalid if rdata was valid.
|
||||
device_rvalid_o <= device_req_i;
|
||||
end
|
||||
end
|
||||
|
||||
logic _unused;
|
||||
assign _unused = ^device_be_i ^ ^device_wdata_i;
|
||||
endmodule
|
||||
@@ -0,0 +1,161 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
module spi_host #(
|
||||
parameter int unsigned ClockFrequency = 50_000_000,
|
||||
parameter int unsigned BaudRate = 12_500_000,
|
||||
parameter bit CPOL = 0,
|
||||
parameter bit CPHA = 0
|
||||
)(
|
||||
input clk_i,
|
||||
input rst_ni,
|
||||
|
||||
input logic spi_rx_i,
|
||||
output logic spi_tx_o,
|
||||
output logic sck_o,
|
||||
|
||||
input logic start_i,
|
||||
input logic [7:0] byte_data_i,
|
||||
output logic [7:0] byte_data_o,
|
||||
output logic next_tx_byte_o
|
||||
);
|
||||
|
||||
// ClocksPerBaud: Clock cycles in between two SPI SCLK cycles (DEFAULT:4)
|
||||
localparam int unsigned ClocksPerBaud = ClockFrequency / BaudRate;
|
||||
// ToggleCount: The point which SCK would toggle (DEFAULT:2)
|
||||
localparam int unsigned ToggleCount = ClocksPerBaud / 2;
|
||||
// CountWidth: Width of the implemented counter for generating SCK (DEFAULT:1)
|
||||
localparam int unsigned CountWidth = $clog2(ToggleCount);
|
||||
|
||||
logic [CountWidth-1:0] limit, count;
|
||||
logic sck, count_at_limit, sck_pos, sck_neg;
|
||||
|
||||
logic sck_en;
|
||||
assign sck_en = (state_q == SEND);
|
||||
|
||||
assign limit = CountWidth'(ToggleCount - 1);
|
||||
assign count_at_limit = (count >= limit);
|
||||
|
||||
always_ff @(posedge clk_i or negedge rst_ni) begin
|
||||
// Do not start clock related logic unless we are starting
|
||||
// SPI transmission or already at SEND state.
|
||||
if (!rst_ni) begin
|
||||
count <= '0;
|
||||
sck <= CPOL;
|
||||
end else if (!(sck_en||start_i)) begin
|
||||
count <= '0;
|
||||
sck <= CPOL;
|
||||
// In the case of counter reaching to the limit, toggle SCK and start over.
|
||||
end else if (count_at_limit) begin
|
||||
count <= '0;
|
||||
sck <= ~sck;
|
||||
end else begin
|
||||
count <= count + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
// Only send clock to the pad when we are at the SEND state.
|
||||
assign sck_o = sck_en ? sck : CPOL;
|
||||
// Set to HIGH at the posedge of the serial clock, used internally.
|
||||
assign sck_pos = count_at_limit && !sck;
|
||||
// Set to HIGH at the negedge of the serial clock, used internally.
|
||||
assign sck_neg = count_at_limit && sck;
|
||||
|
||||
typedef enum logic[1:0] {
|
||||
IDLE,
|
||||
START,
|
||||
SEND,
|
||||
STOP
|
||||
} spi_state_t;
|
||||
|
||||
spi_state_t state_q, state_d;
|
||||
|
||||
logic [2:0] bit_counter_q, bit_counter_d;
|
||||
logic [7:0] current_byte_q, current_byte_d, recieved_byte_d, recieved_byte_q;
|
||||
|
||||
always_comb begin
|
||||
spi_tx_o = 1'b1;
|
||||
bit_counter_d = bit_counter_q;
|
||||
current_byte_d = current_byte_q;
|
||||
next_tx_byte_o = 1'b0;
|
||||
state_d = state_q;
|
||||
byte_data_o = '0;
|
||||
|
||||
case (state_q)
|
||||
IDLE: begin
|
||||
spi_tx_o = 1'b1;
|
||||
if (start_i) begin
|
||||
state_d = START;
|
||||
end
|
||||
end
|
||||
START: begin
|
||||
state_d = SEND;
|
||||
bit_counter_d = 3'd7;
|
||||
current_byte_d = byte_data_i;
|
||||
end
|
||||
SEND: begin
|
||||
spi_tx_o = current_byte_q[7];
|
||||
current_byte_d = {current_byte_q[6:0], 1'b0};
|
||||
if (bit_counter_q == 3'd0) begin
|
||||
state_d = STOP;
|
||||
end else begin
|
||||
bit_counter_d = bit_counter_q - 3'd1;
|
||||
end
|
||||
end
|
||||
STOP: begin
|
||||
spi_tx_o = 1'b1;
|
||||
next_tx_byte_o = 1'b1;
|
||||
byte_data_o = recieved_byte_q;
|
||||
state_d = IDLE;
|
||||
end
|
||||
endcase
|
||||
end
|
||||
|
||||
generate
|
||||
// If CPHA is HIGH, incoming data will be sampled on the falling edge while outgoing
|
||||
// data will get shifted out on the rising edge.
|
||||
if (CPHA) begin
|
||||
always_ff @(posedge clk_i or negedge rst_ni) begin
|
||||
if (!rst_ni) begin
|
||||
current_byte_q <= '0;
|
||||
bit_counter_q <= '0;
|
||||
recieved_byte_q <= '0;
|
||||
state_q <= IDLE;
|
||||
end else if (sck_pos) begin
|
||||
bit_counter_q <= bit_counter_d;
|
||||
recieved_byte_q <= recieved_byte_d;
|
||||
state_q <= state_d;
|
||||
// Set current byte half a cycle before transmitting it.
|
||||
end else if (sck_neg) begin
|
||||
current_byte_q <= current_byte_d;
|
||||
if (state_q == SEND) begin
|
||||
recieved_byte_d <= {recieved_byte_q[6:0], spi_rx_i};
|
||||
end
|
||||
end
|
||||
end
|
||||
// If CPHA is LOW, incoming data will be sampled on the rising edge while outgoing
|
||||
// data will get shifted out on the falling edge.
|
||||
end else begin
|
||||
always_ff @(posedge clk_i or negedge rst_ni) begin
|
||||
if (!rst_ni) begin
|
||||
current_byte_q <= '0;
|
||||
bit_counter_q <= '0;
|
||||
recieved_byte_q <= '0;
|
||||
state_q <= IDLE;
|
||||
// Set current byte half a cycle before transmitting it.
|
||||
end else if (sck_pos) begin
|
||||
current_byte_q <= current_byte_d;
|
||||
if (state_q == SEND) begin
|
||||
recieved_byte_d <= {recieved_byte_q[6:0], spi_rx_i};
|
||||
end
|
||||
end else if (sck_neg) begin
|
||||
bit_counter_q <= bit_counter_d;
|
||||
recieved_byte_q <= recieved_byte_d;
|
||||
state_q <= state_d;
|
||||
end
|
||||
end
|
||||
end
|
||||
endgenerate
|
||||
|
||||
endmodule
|
||||
@@ -0,0 +1,122 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
module spi_top #(
|
||||
parameter int unsigned ClockFrequency = 50_000_000,
|
||||
parameter int unsigned BaudRate = 12_500_000,
|
||||
parameter CPOL = 0,
|
||||
parameter CPHA = 0
|
||||
) (
|
||||
input logic clk_i,
|
||||
input logic rst_ni,
|
||||
|
||||
input logic device_req_i,
|
||||
/* verilator lint_off UNUSED */
|
||||
input logic [31:0] device_addr_i,
|
||||
input logic device_we_i,
|
||||
/* verilator lint_off UNUSED */
|
||||
input logic [3:0] device_be_i,
|
||||
/* verilator lint_off UNUSED */
|
||||
input logic [31:0] device_wdata_i,
|
||||
output logic device_rvalid_o,
|
||||
output logic [31:0] device_rdata_o,
|
||||
|
||||
input logic spi_rx_i,
|
||||
output logic spi_tx_o,
|
||||
output logic sck_o,
|
||||
|
||||
output logic [7:0] byte_data_o
|
||||
);
|
||||
|
||||
localparam logic [11:0] SPI_TX_REG = 12'h0;
|
||||
localparam logic [11:0] SPI_STATUS_REG = 12'h4;
|
||||
|
||||
logic [11:0] reg_addr;
|
||||
|
||||
// Status register read enable
|
||||
logic read_status_q, read_status_d;
|
||||
|
||||
// Edge detection for popping FIFO elements.
|
||||
logic next_tx_byte_d, next_tx_byte_q;
|
||||
|
||||
logic tx_fifo_wvalid;
|
||||
logic tx_fifo_rvalid, tx_fifo_rready;
|
||||
logic [7:0] tx_fifo_rdata;
|
||||
logic tx_fifo_full, tx_fifo_empty;
|
||||
logic [6:0] tx_fifo_depth;
|
||||
|
||||
always @(posedge clk_i or negedge rst_ni) begin
|
||||
if (!rst_ni) begin
|
||||
next_tx_byte_q <= '0;
|
||||
device_rvalid_o <= '0;
|
||||
end else begin
|
||||
next_tx_byte_q <= next_tx_byte_d;
|
||||
device_rvalid_o <= device_req_i;
|
||||
end
|
||||
end
|
||||
// This is needed because signal arrives in a slower clock.
|
||||
assign tx_fifo_rready = next_tx_byte_d && ~next_tx_byte_q;
|
||||
|
||||
// We have 1kB space for SPI related registers, ignore top address bits.
|
||||
assign reg_addr = device_addr_i[11:0];
|
||||
|
||||
// FIFO depth signal gives the current valid elements in the FIFO, zero means it's empty.
|
||||
// This will be used in software to indicate whenever we see an empty
|
||||
assign tx_fifo_empty = (tx_fifo_depth == 0);
|
||||
|
||||
// FIFO push happens when software writes to SPI_TX_REG
|
||||
assign tx_fifo_wvalid = (device_req_i & (reg_addr == SPI_TX_REG) & device_we_i);
|
||||
|
||||
assign read_status_d = (device_req_i & (reg_addr == SPI_STATUS_REG) & ~device_we_i);
|
||||
always_ff @(posedge clk_i or negedge rst_ni) begin
|
||||
if (!rst_ni) begin
|
||||
read_status_q <= 0;
|
||||
end else begin
|
||||
read_status_q <= read_status_d;
|
||||
end
|
||||
end
|
||||
assign device_rdata_o = read_status_q ? {30'b0, tx_fifo_empty, tx_fifo_full} : 32'b0;
|
||||
|
||||
prim_fifo_sync #(
|
||||
.Width(8),
|
||||
.Pass(1'b0),
|
||||
.Depth(127)
|
||||
) u_tx_fifo (
|
||||
.clk_i (clk_i),
|
||||
.rst_ni,
|
||||
.clr_i(1'b0),
|
||||
|
||||
.wvalid_i(tx_fifo_wvalid), // FIFO Push
|
||||
.wready_o(),
|
||||
.wdata_i(device_wdata_i[7:0]),
|
||||
|
||||
.rvalid_o(tx_fifo_rvalid),
|
||||
.rready_i(tx_fifo_rready), // FIFO Pop
|
||||
.rdata_o(tx_fifo_rdata),
|
||||
|
||||
.full_o(tx_fifo_full),
|
||||
.depth_o(tx_fifo_depth),
|
||||
.err_o() // Unused
|
||||
);
|
||||
|
||||
spi_host #(
|
||||
.ClockFrequency(ClockFrequency),
|
||||
.BaudRate(BaudRate),
|
||||
.CPOL(CPOL),
|
||||
.CPHA(CPHA)
|
||||
) u_spi_host (
|
||||
.clk_i (clk_i),
|
||||
.rst_ni(rst_ni),
|
||||
|
||||
.spi_rx_i(spi_rx_i), // Data received from SPI device
|
||||
.spi_tx_o(spi_tx_o), // Data transmitted to SPI device
|
||||
.sck_o(sck_o), // Serial clock output
|
||||
|
||||
.start_i(tx_fifo_rvalid), // Starts SPI as long as we have a valid FIFO data.
|
||||
.byte_data_i(tx_fifo_rdata), // 8-bit data, from FIFO possibly
|
||||
.byte_data_o(byte_data_o),
|
||||
.next_tx_byte_o(next_tx_byte_d) // requests new byte
|
||||
);
|
||||
|
||||
endmodule
|
||||
@@ -0,0 +1,321 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
module uart #(
|
||||
parameter int unsigned ClockFrequency = 50_000_000,
|
||||
parameter int unsigned BaudRate = 115_200,
|
||||
parameter int unsigned RxFifoDepth = 128,
|
||||
parameter int unsigned TxFifoDepth = 128
|
||||
) (
|
||||
input logic clk_i,
|
||||
input logic rst_ni,
|
||||
|
||||
input logic device_req_i,
|
||||
/* verilator lint_off UNUSED */
|
||||
input logic [31:0] device_addr_i,
|
||||
input logic device_we_i,
|
||||
input logic [3:0] device_be_i,
|
||||
input logic [31:0] device_wdata_i,
|
||||
output logic device_rvalid_o,
|
||||
output logic [31:0] device_rdata_o,
|
||||
|
||||
input logic uart_rx_i,
|
||||
output logic uart_irq_o,
|
||||
output logic uart_tx_o
|
||||
);
|
||||
|
||||
localparam int unsigned ClocksPerBaud = ClockFrequency / BaudRate;
|
||||
/* verilator lint_off WIDTH */
|
||||
localparam int unsigned UART_RX_REG = 32'h0;
|
||||
/* verilator lint_off WIDTH */
|
||||
localparam int unsigned UART_TX_REG = 32'h4;
|
||||
/* verilator lint_off WIDTH */
|
||||
localparam int unsigned UART_STATUS_REG = 32'h8;
|
||||
|
||||
typedef enum logic[1:0] {
|
||||
IDLE,
|
||||
START,
|
||||
PROC,
|
||||
STOP
|
||||
} uart_state_t;
|
||||
|
||||
logic [31:0] device_rdata_d, device_rdata_q;
|
||||
logic device_rvalid_d, device_rvalid_q;
|
||||
|
||||
logic [11:0] reg_addr;
|
||||
|
||||
logic [$clog2(ClocksPerBaud)-1:0] rx_baud_counter_q, rx_baud_counter_d;
|
||||
logic rx_baud_tick;
|
||||
|
||||
uart_state_t rx_state_q, rx_state_d;
|
||||
logic [2:0] rx_bit_counter_q, rx_bit_counter_d;
|
||||
logic [7:0] rx_current_byte_q, rx_current_byte_d;
|
||||
logic [2:0] rx_q;
|
||||
logic rx_start, rx_valid;
|
||||
|
||||
logic rx_fifo_wvalid;
|
||||
logic rx_fifo_rready;
|
||||
logic [7:0] rx_fifo_rdata;
|
||||
logic rx_fifo_rvalid;
|
||||
logic rx_fifo_empty;
|
||||
|
||||
logic [$clog2(ClocksPerBaud)-1:0] tx_baud_counter_q, tx_baud_counter_d;
|
||||
logic tx_baud_tick;
|
||||
|
||||
logic write_req;
|
||||
|
||||
uart_state_t tx_state_q, tx_state_d;
|
||||
logic [2:0] tx_bit_counter_q, tx_bit_counter_d;
|
||||
logic [7:0] tx_current_byte_q, tx_current_byte_d;
|
||||
logic tx_next_byte;
|
||||
|
||||
logic tx_fifo_wvalid;
|
||||
logic tx_fifo_rvalid, tx_fifo_rready;
|
||||
logic [7:0] tx_fifo_rdata;
|
||||
logic tx_fifo_full;
|
||||
|
||||
assign reg_addr = device_addr_i[11:0];
|
||||
|
||||
always_comb begin
|
||||
device_rdata_d = '0;
|
||||
device_rvalid_d = 1'b0;
|
||||
rx_fifo_rready = 1'b0;
|
||||
|
||||
if (device_req_i) begin
|
||||
device_rvalid_d = 1'b1;
|
||||
|
||||
if (device_be_i[0] & ~device_we_i) begin
|
||||
case (reg_addr)
|
||||
UART_RX_REG: begin
|
||||
device_rdata_d = {24'b0, rx_fifo_rdata};
|
||||
rx_fifo_rready = 1'b1;
|
||||
end
|
||||
UART_TX_REG: begin
|
||||
device_rdata_d = '0;
|
||||
end
|
||||
UART_STATUS_REG: begin
|
||||
device_rdata_d = {30'b0, tx_fifo_full, rx_fifo_empty};
|
||||
end
|
||||
default: begin
|
||||
device_rdata_d = '0;
|
||||
end
|
||||
endcase
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
always_ff @(posedge clk_i or negedge rst_ni) begin
|
||||
if (!rst_ni) begin
|
||||
device_rdata_q <= '0;
|
||||
device_rvalid_q <= 1'b0;
|
||||
end else begin
|
||||
device_rdata_q <= device_rdata_d;
|
||||
device_rvalid_q <= device_rvalid_d;
|
||||
end
|
||||
end
|
||||
|
||||
assign device_rdata_o = device_rdata_q;
|
||||
assign device_rvalid_o = device_rvalid_q;
|
||||
|
||||
assign rx_fifo_wvalid = rx_baud_tick & rx_valid;
|
||||
assign rx_fifo_empty = ~rx_fifo_rvalid;
|
||||
|
||||
// Set the rx_baud_counter half-way on rx_start to ensure sampling the bits 'in the middle'
|
||||
assign rx_baud_counter_d = rx_baud_tick ? '0 :
|
||||
rx_start ? $bits(rx_baud_counter_q)'(ClocksPerBaud >> 1) :
|
||||
rx_baud_counter_q + 1'b1;
|
||||
|
||||
assign rx_baud_tick = rx_baud_counter_q == $bits(rx_baud_counter_q)'(ClocksPerBaud - 1);
|
||||
|
||||
prim_fifo_sync #(
|
||||
.Width(8),
|
||||
.Pass (1'b0),
|
||||
.Depth(RxFifoDepth)
|
||||
) u_rx_fifo (
|
||||
.clk_i,
|
||||
.rst_ni,
|
||||
.clr_i (1'b0),
|
||||
|
||||
.wvalid_i(rx_fifo_wvalid),
|
||||
.wready_o(),
|
||||
.wdata_i (rx_current_byte_q),
|
||||
|
||||
.rvalid_o(rx_fifo_rvalid),
|
||||
.rready_i(rx_fifo_rready),
|
||||
.rdata_o (rx_fifo_rdata),
|
||||
|
||||
.full_o (),
|
||||
.depth_o(),
|
||||
.err_o ()
|
||||
);
|
||||
|
||||
assign uart_irq_o = !rx_fifo_empty;
|
||||
|
||||
// Synchronize RX and derive rx_start signal
|
||||
always_ff @(posedge clk_i or negedge rst_ni) begin
|
||||
if (!rst_ni) begin
|
||||
rx_q <= '0;
|
||||
end else begin
|
||||
rx_q <= {rx_q[1:0], uart_rx_i};
|
||||
end
|
||||
end
|
||||
|
||||
assign rx_start = !rx_q[1] & rx_q[2] & (rx_state_q == IDLE);
|
||||
|
||||
always_ff @(posedge clk_i or negedge rst_ni) begin
|
||||
if (!rst_ni) begin
|
||||
rx_baud_counter_q <= '0;
|
||||
end else begin
|
||||
rx_baud_counter_q <= rx_baud_counter_d;
|
||||
end
|
||||
end
|
||||
|
||||
always_ff @(posedge clk_i or negedge rst_ni) begin
|
||||
if (!rst_ni) begin
|
||||
rx_state_q <= IDLE;
|
||||
rx_bit_counter_q <= '0;
|
||||
rx_current_byte_q <= '0;
|
||||
// Transition the rx state on both rx_start and an rx_baud_tick
|
||||
end else if (rx_start || rx_baud_tick) begin
|
||||
rx_state_q <= rx_state_d;
|
||||
rx_bit_counter_q <= rx_bit_counter_d;
|
||||
rx_current_byte_q <= rx_current_byte_d;
|
||||
end
|
||||
end
|
||||
|
||||
always_comb begin
|
||||
rx_valid = 0;
|
||||
rx_bit_counter_d = rx_bit_counter_q;
|
||||
rx_current_byte_d = rx_current_byte_q;
|
||||
rx_state_d = rx_state_q;
|
||||
|
||||
case (rx_state_q)
|
||||
IDLE: begin
|
||||
|
||||
if (rx_start) begin
|
||||
rx_state_d = START;
|
||||
end
|
||||
end
|
||||
START: begin
|
||||
rx_current_byte_d = '0;
|
||||
rx_bit_counter_d = '0;
|
||||
|
||||
if (!rx_q[2]) begin
|
||||
rx_state_d = PROC;
|
||||
end else begin
|
||||
rx_state_d = IDLE;
|
||||
end
|
||||
end
|
||||
PROC: begin
|
||||
rx_current_byte_d = {rx_q[2], rx_current_byte_q[7:1]};
|
||||
|
||||
if (rx_bit_counter_q == 3'd7) begin
|
||||
rx_state_d = STOP;
|
||||
end else begin
|
||||
rx_bit_counter_d = rx_bit_counter_q + 3'd1;
|
||||
end
|
||||
end
|
||||
STOP: begin
|
||||
if (rx_q[2]) begin
|
||||
rx_valid = 1;
|
||||
end
|
||||
rx_state_d = IDLE;
|
||||
end
|
||||
endcase
|
||||
end
|
||||
|
||||
assign write_req = (device_req_i & device_be_i[0] & device_we_i);
|
||||
|
||||
assign tx_fifo_wvalid = (reg_addr == UART_TX_REG) & write_req;
|
||||
assign tx_fifo_rready = tx_baud_tick & tx_next_byte;
|
||||
|
||||
assign tx_baud_counter_d = tx_baud_tick ? '0 : tx_baud_counter_q + 1'b1;
|
||||
assign tx_baud_tick = tx_baud_counter_q == $bits(tx_baud_counter_q)'(ClocksPerBaud - 1);
|
||||
|
||||
prim_fifo_sync #(
|
||||
.Width(8),
|
||||
.Pass (1'b0),
|
||||
.Depth(TxFifoDepth)
|
||||
) u_tx_fifo (
|
||||
.clk_i,
|
||||
.rst_ni,
|
||||
.clr_i (1'b0),
|
||||
|
||||
.wvalid_i(tx_fifo_wvalid),
|
||||
.wready_o(),
|
||||
.wdata_i (device_wdata_i[7:0]),
|
||||
|
||||
.rvalid_o(tx_fifo_rvalid),
|
||||
.rready_i(tx_fifo_rready),
|
||||
.rdata_o (tx_fifo_rdata),
|
||||
|
||||
.full_o (tx_fifo_full),
|
||||
.depth_o(),
|
||||
.err_o ()
|
||||
);
|
||||
|
||||
always_ff @(posedge clk_i or negedge rst_ni) begin
|
||||
if (!rst_ni) begin
|
||||
tx_baud_counter_q <= '0;
|
||||
end else begin
|
||||
tx_baud_counter_q <= tx_baud_counter_d;
|
||||
end
|
||||
end
|
||||
|
||||
always_ff @(posedge clk_i or negedge rst_ni) begin
|
||||
if (!rst_ni) begin
|
||||
tx_state_q <= IDLE;
|
||||
tx_bit_counter_q <= '0;
|
||||
tx_current_byte_q <= '0;
|
||||
end else if (tx_baud_tick) begin
|
||||
tx_state_q <= tx_state_d;
|
||||
tx_bit_counter_q <= tx_bit_counter_d;
|
||||
tx_current_byte_q <= tx_current_byte_d;
|
||||
end
|
||||
end
|
||||
|
||||
always_comb begin
|
||||
uart_tx_o = 1'b0;
|
||||
tx_bit_counter_d = tx_bit_counter_q;
|
||||
tx_current_byte_d = tx_current_byte_q;
|
||||
tx_next_byte = 1'b0;
|
||||
tx_state_d = tx_state_q;
|
||||
|
||||
case (tx_state_q)
|
||||
IDLE: begin
|
||||
uart_tx_o = 1'b1;
|
||||
|
||||
if (tx_fifo_rvalid) begin
|
||||
tx_state_d = START;
|
||||
end
|
||||
end
|
||||
START: begin
|
||||
uart_tx_o = 1'b0;
|
||||
tx_state_d = PROC;
|
||||
tx_bit_counter_d = 3'd0;
|
||||
tx_current_byte_d = tx_fifo_rdata;
|
||||
tx_next_byte = 1'b1;
|
||||
end
|
||||
PROC: begin
|
||||
uart_tx_o = tx_current_byte_q[0];
|
||||
|
||||
tx_current_byte_d = {1'b0, tx_current_byte_q[7:1]};
|
||||
if (tx_bit_counter_q == 3'd7) begin
|
||||
tx_state_d = STOP;
|
||||
end else begin
|
||||
tx_bit_counter_d = tx_bit_counter_q + 3'd1;
|
||||
end
|
||||
end
|
||||
STOP: begin
|
||||
uart_tx_o = 1'b1;
|
||||
if (tx_fifo_rvalid) begin
|
||||
tx_state_d = START;
|
||||
end else begin
|
||||
tx_state_d = IDLE;
|
||||
end
|
||||
end
|
||||
endcase
|
||||
end
|
||||
|
||||
endmodule
|
||||
@@ -0,0 +1,18 @@
|
||||
CAPI=2:
|
||||
# Copyright lowRISC contributors.
|
||||
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
name: "lowrisc:ibex:rv_timer"
|
||||
description: "RISC-V timer"
|
||||
filesets:
|
||||
files_rtl_timer:
|
||||
depend:
|
||||
- lowrisc:prim:assert
|
||||
files:
|
||||
- vendor/lowrisc_ibex/shared/rtl/timer.sv
|
||||
file_type: systemVerilogSource
|
||||
|
||||
targets:
|
||||
default:
|
||||
filesets:
|
||||
- files_rtl_timer
|
||||
@@ -0,0 +1,13 @@
|
||||
# Documentation for this configuration is here:
|
||||
# https://releases.llvm.org/6.0.0/tools/clang/docs/ClangFormatStyleOptions.html
|
||||
|
||||
BasedOnStyle: Google
|
||||
|
||||
ColumnLimit: 120
|
||||
AlignConsecutiveAssignments: true
|
||||
AlignEscapedNewlines: Right
|
||||
AlignTrailingComments: true
|
||||
AlignOperands: true
|
||||
AllowShortBlocksOnASingleLine : false
|
||||
BinPackArguments: true
|
||||
BinPackParameters : true
|
||||
@@ -0,0 +1,23 @@
|
||||
cmake_minimum_required(VERSION 3.12)
|
||||
|
||||
if(NOT DEFINED CMAKE_TOOLCHAIN_FILE)
|
||||
set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/gcc_toolchain.cmake")
|
||||
endif()
|
||||
|
||||
project(demo_system_sw LANGUAGES C ASM)
|
||||
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "")
|
||||
get_property(helpstring CACHE CMAKE_BUILD_TYPE PROPERTY HELPSTRING)
|
||||
set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "${helpstring}" FORCE)
|
||||
endif()
|
||||
|
||||
option(SIM_CTRL_OUTPUT
|
||||
"Send string output to simulator control rather than UART")
|
||||
|
||||
if(SIM_CTRL_OUTPUT)
|
||||
add_compile_definitions(SIM_CTRL_OUTPUT)
|
||||
endif()
|
||||
|
||||
add_subdirectory(common)
|
||||
add_subdirectory(demo)
|
||||
add_subdirectory(blank)
|
||||
@@ -0,0 +1,7 @@
|
||||
add_executable(blank blank.S)
|
||||
|
||||
add_custom_command(
|
||||
TARGET blank POST_BUILD
|
||||
COMMAND ${CMAKE_OBJCOPY} -O binary "$<TARGET_FILE:blank>" "$<TARGET_FILE:blank>.bin"
|
||||
COMMAND srec_cat "$<TARGET_FILE:blank>.bin" -binary -offset 0x0000 -byte-swap 4 -o "$<TARGET_FILE:blank>.vmem" -vmem
|
||||
VERBATIM)
|
||||
@@ -0,0 +1,25 @@
|
||||
# Copyright lowRISC contributors.
|
||||
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
.section .text
|
||||
|
||||
blank_loop:
|
||||
wfi
|
||||
j blank_loop
|
||||
|
||||
/* =================================================== [ exceptions ] === */
|
||||
/* This section has to be down here, since we have to disable rvc for it */
|
||||
|
||||
.section .vectors, "ax"
|
||||
.option norvc;
|
||||
|
||||
// All unimplemented interrupts/exceptions go to the default_exc_handler.
|
||||
.org 0x00
|
||||
.rept 32
|
||||
jal x0, blank_loop
|
||||
.endr
|
||||
|
||||
// reset vector
|
||||
.org 0x80
|
||||
jal x0, blank_loop
|
||||
@@ -0,0 +1,2 @@
|
||||
add_library(common OBJECT demo_system.c uart.c timer.c gpio.c pwm.c spi.c crt0.S)
|
||||
target_include_directories(common INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||
@@ -0,0 +1,94 @@
|
||||
# Copyright lowRISC contributors.
|
||||
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#include "demo_system_regs.h"
|
||||
|
||||
.section .text
|
||||
|
||||
default_exc_handler:
|
||||
jal x0, simple_exc_handler
|
||||
|
||||
reset_handler:
|
||||
/* set all registers to zero */
|
||||
mv x1, x0
|
||||
mv x2, x1
|
||||
mv x3, x1
|
||||
mv x4, x1
|
||||
mv x5, x1
|
||||
mv x6, x1
|
||||
mv x7, x1
|
||||
mv x8, x1
|
||||
mv x9, x1
|
||||
mv x10, x1
|
||||
mv x11, x1
|
||||
mv x12, x1
|
||||
mv x13, x1
|
||||
mv x14, x1
|
||||
mv x15, x1
|
||||
mv x16, x1
|
||||
mv x17, x1
|
||||
mv x18, x1
|
||||
mv x19, x1
|
||||
mv x20, x1
|
||||
mv x21, x1
|
||||
mv x22, x1
|
||||
mv x23, x1
|
||||
mv x24, x1
|
||||
mv x25, x1
|
||||
mv x26, x1
|
||||
mv x27, x1
|
||||
mv x28, x1
|
||||
mv x29, x1
|
||||
mv x30, x1
|
||||
mv x31, x1
|
||||
|
||||
/* stack initilization */
|
||||
la x2, _stack_start
|
||||
|
||||
_start:
|
||||
.global _start
|
||||
|
||||
/* clear BSS */
|
||||
la x26, _bss_start
|
||||
la x27, _bss_end
|
||||
|
||||
bge x26, x27, zero_loop_end
|
||||
|
||||
zero_loop:
|
||||
sw x0, 0(x26)
|
||||
addi x26, x26, 4
|
||||
ble x26, x27, zero_loop
|
||||
zero_loop_end:
|
||||
|
||||
|
||||
main_entry:
|
||||
/* jump to main program entry point (argc = argv = 0) */
|
||||
addi x10, x0, 0
|
||||
addi x11, x0, 0
|
||||
jal x1, main
|
||||
|
||||
/* Halt simulation */
|
||||
li x5, SIM_CTRL_BASE + SIM_CTRL_CTRL
|
||||
li x6, 1
|
||||
sw x6, 0(x5)
|
||||
|
||||
/* If execution ends up here just put the core to sleep */
|
||||
sleep_loop:
|
||||
wfi
|
||||
j sleep_loop
|
||||
|
||||
/* =================================================== [ exceptions ] === */
|
||||
/* This section has to be down here, since we have to disable rvc for it */
|
||||
|
||||
.section .vectors, "ax"
|
||||
.option norvc;
|
||||
|
||||
// All unimplemented interrupts/exceptions go to the default_exc_handler.
|
||||
.org 0x00
|
||||
.rept 32
|
||||
jal x0, default_exc_handler
|
||||
.endr
|
||||
|
||||
// reset vector
|
||||
.org 0x80
|
||||
jal x0, reset_handler
|
||||
@@ -0,0 +1,131 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#include "demo_system.h"
|
||||
|
||||
#include "dev_access.h"
|
||||
#include "uart.h"
|
||||
|
||||
int putchar(int c) {
|
||||
#ifdef SIM_CTRL_OUTPUT
|
||||
DEV_WRITE(SIM_CTRL_BASE + SIM_CTRL_OUT, c);
|
||||
#else
|
||||
if (c == '\n') {
|
||||
uart_out(DEFAULT_UART, '\r');
|
||||
}
|
||||
|
||||
uart_out(DEFAULT_UART, c);
|
||||
#endif
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
int getchar(void) { return uart_in(DEFAULT_UART); }
|
||||
|
||||
int puts(const char* str) {
|
||||
while (*str) {
|
||||
putchar(*str++);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void puthex(uint32_t h) {
|
||||
int cur_digit;
|
||||
// Iterate through h taking top 4 bits each time and outputting ASCII of hex
|
||||
// digit for those 4 bits
|
||||
for (int i = 0; i < 8; i++) {
|
||||
cur_digit = h >> 28;
|
||||
|
||||
if (cur_digit < 10)
|
||||
putchar('0' + cur_digit);
|
||||
else
|
||||
putchar('A' - 10 + cur_digit);
|
||||
|
||||
h <<= 4;
|
||||
}
|
||||
}
|
||||
|
||||
void sim_halt() { DEV_WRITE(SIM_CTRL_BASE + SIM_CTRL_CTRL, 1); }
|
||||
|
||||
unsigned int get_mepc() {
|
||||
uint32_t result;
|
||||
__asm__ volatile("csrr %0, mepc;" : "=r"(result));
|
||||
return result;
|
||||
}
|
||||
|
||||
unsigned int get_mcause() {
|
||||
uint32_t result;
|
||||
__asm__ volatile("csrr %0, mcause;" : "=r"(result));
|
||||
return result;
|
||||
}
|
||||
|
||||
unsigned int get_mtval() {
|
||||
uint32_t result;
|
||||
__asm__ volatile("csrr %0, mtval;" : "=r"(result));
|
||||
return result;
|
||||
}
|
||||
|
||||
uint32_t get_mcycle(void) {
|
||||
uint32_t result;
|
||||
__asm__ volatile("csrr %0, mcycle;" : "=r"(result));
|
||||
return result;
|
||||
}
|
||||
|
||||
void reset_mcycle(void) { __asm__ volatile("csrw mcycle, x0"); }
|
||||
|
||||
extern uint32_t _vectors_start;
|
||||
volatile uint32_t* exc_vectors = &_vectors_start;
|
||||
|
||||
int install_exception_handler(uint32_t vector_num, void (*handler_fn)(void)) {
|
||||
if (vector_num >= 32) return 1;
|
||||
|
||||
volatile uint32_t* handler_jmp_loc = exc_vectors + vector_num;
|
||||
int32_t offset = (uint32_t)handler_fn - (uint32_t)handler_jmp_loc;
|
||||
|
||||
if ((offset >= (1 << 19)) || (offset < -(1 << 19))) {
|
||||
return 2;
|
||||
}
|
||||
|
||||
uint32_t offset_uimm = offset;
|
||||
|
||||
uint32_t jmp_ins = ((offset_uimm & 0x7fe) << 20) | // imm[10:1] -> 21
|
||||
((offset_uimm & 0x800) << 9) | // imm[11] -> 20
|
||||
(offset_uimm & 0xff000) | // imm[19:12] -> 12
|
||||
((offset_uimm & 0x100000) << 11) | // imm[20] -> 31
|
||||
0x6f; // J opcode
|
||||
|
||||
*handler_jmp_loc = jmp_ins;
|
||||
|
||||
__asm__ volatile("fence.i;");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void enable_interrupts(uint32_t enable_mask) { asm volatile("csrs mie, %0\n" : : "r"(enable_mask)); }
|
||||
|
||||
void disable_interrupts(uint32_t disable_mask) { asm volatile("csrc mie, %0\n" : : "r"(disable_mask)); }
|
||||
|
||||
void set_global_interrupt_enable(uint32_t enable) {
|
||||
if (enable) {
|
||||
asm volatile("csrs mstatus, %0\n" : : "r"(1 << 3));
|
||||
} else {
|
||||
asm volatile("csrc mstatus, %0\n" : : "r"(1 << 3));
|
||||
}
|
||||
}
|
||||
|
||||
void simple_exc_handler(void) {
|
||||
puts("EXCEPTION!!!\n");
|
||||
puts("============\n");
|
||||
puts("MEPC: 0x");
|
||||
puthex(get_mepc());
|
||||
puts("\nMCAUSE: 0x");
|
||||
puthex(get_mcause());
|
||||
puts("\nMTVAL: 0x");
|
||||
puthex(get_mtval());
|
||||
putchar('\n');
|
||||
|
||||
while (1)
|
||||
;
|
||||
}
|
||||
@@ -0,0 +1,114 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#ifndef DEMO_SYSTEM_H_
|
||||
#define DEMO_SYSTEM_H_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "demo_system_regs.h"
|
||||
#include "gpio.h"
|
||||
#include "uart.h"
|
||||
|
||||
#define UART_IRQ_NUM 16
|
||||
#define UART_IRQ (1 << UART_IRQ_NUM)
|
||||
#define DEFAULT_UART UART_FROM_BASE_ADDR(UART0_BASE)
|
||||
|
||||
#define GPIO_OUT GPIO_FROM_BASE_ADDR(GPIO_BASE + GPIO_OUT_REG)
|
||||
#define GPIO_IN GPIO_FROM_BASE_ADDR(GPIO_BASE + GPIO_IN_REG)
|
||||
#define GPIO_IN_DBNC GPIO_FROM_BASE_ADDR(GPIO_BASE + GPIO_IN_DBNC_REG)
|
||||
#define GPIO_OUT_SHIFT GPIO_FROM_BASE_ADDR(GPIO_BASE + GPIO_OUT_SHIFT_REG)
|
||||
|
||||
#define TIMER_IRQ (1 << 7)
|
||||
|
||||
#define NUM_PWM_MODULES 12
|
||||
|
||||
#define DEFAULT_SPI SPI_FROM_BASE_ADDR(SPI0_BASE)
|
||||
|
||||
/**
|
||||
* Writes character to default UART. Signature matches c stdlib function
|
||||
* of the same name.
|
||||
*
|
||||
* @param c Character to output
|
||||
* @returns Character output (never fails so no EOF ever returned)
|
||||
*/
|
||||
int putchar(int c);
|
||||
|
||||
/**
|
||||
* Reads character from default UART. Signature matches c stdlib function
|
||||
* of the same name.
|
||||
*
|
||||
* @returns Character from the uart rx fifo
|
||||
*/
|
||||
int getchar(void);
|
||||
|
||||
/**
|
||||
* Immediately halts the simulation
|
||||
*/
|
||||
void sim_halt();
|
||||
|
||||
/**
|
||||
* Writes string to default UART. Signature matches c stdlib function of
|
||||
* the same name.
|
||||
*
|
||||
* @param str String to output
|
||||
* @returns 0 always (never fails so no error)
|
||||
*/
|
||||
int puts(const char *str);
|
||||
|
||||
/**
|
||||
* Writes ASCII hex representation of number to default UART.
|
||||
*
|
||||
* @param h Number to output in hex
|
||||
*/
|
||||
void puthex(uint32_t h);
|
||||
|
||||
/**
|
||||
* Install an exception handler by writing a `j` instruction to the handler in
|
||||
* at the appropriate address given the `vector_num`.
|
||||
*
|
||||
* @param vector_num Which IRQ the handler is for, must be less than 32. All
|
||||
* non-interrupt exceptions are handled at vector 0.
|
||||
*
|
||||
* @param handle_fn Function pointer to the handler function. The function is
|
||||
* responsible for interrupt prolog and epilog, such as saving and restoring
|
||||
* register to the stack and executing `mret` at the end.
|
||||
*
|
||||
* @return 0 on success, 1 if `vector_num` out of range, 2 if the address of
|
||||
* `handler_fn` is too far from the exception handler base to use with a `j`
|
||||
* instruction.
|
||||
*/
|
||||
int install_exception_handler(uint32_t vector_num, void (*handler_fn)(void));
|
||||
|
||||
/**
|
||||
* Set per-interrupt enables (`mie` CSR)
|
||||
*
|
||||
* @param enable_mask Any set bit is set in `mie`, enabling the interrupt. Bits
|
||||
* not set in `enable_mask` aren't changed.
|
||||
*/
|
||||
void enable_interrupts(uint32_t enable_mask);
|
||||
|
||||
/**
|
||||
* Clear per-interrupt enables (`mie` CSR)
|
||||
*
|
||||
* @param enable_mask Any set bit is cleared in `mie`, disabling the interrupt.
|
||||
* Bits not set in `enable_mask` aren't changed.
|
||||
*/
|
||||
void disable_interrupts(uint32_t disable_mask);
|
||||
|
||||
/**
|
||||
* Set the global interrupt enable (the `mie` field of `mstatus`). This enables
|
||||
* or disable all interrupts at once.
|
||||
*
|
||||
* @param enable Enable interrupts if set, otherwise disabled
|
||||
*/
|
||||
void set_global_interrupt_enable(uint32_t enable);
|
||||
|
||||
unsigned int get_mepc();
|
||||
unsigned int get_mcause();
|
||||
unsigned int get_mtval();
|
||||
uint32_t get_mcycle(void);
|
||||
void reset_mcycle(void);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,22 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#ifndef DEMO_SYSTEM_REGS_H__
|
||||
#define DEMO_SYSTEM_REGS_H__
|
||||
|
||||
#define UART0_BASE 0x80001000
|
||||
|
||||
#define GPIO_BASE 0x80000000
|
||||
|
||||
#define TIMER_BASE 0x80002000
|
||||
|
||||
#define PWM_BASE 0x80003000
|
||||
|
||||
#define SPI0_BASE 0x80004000
|
||||
|
||||
#define SIM_CTRL_BASE 0x20000
|
||||
#define SIM_CTRL_OUT 0x0
|
||||
#define SIM_CTRL_CTRL 0x8
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,13 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#ifndef DEV_ACCESS_H_
|
||||
#define DEV_ACCESS_H_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#define DEV_WRITE(addr, val) (*((volatile uint32_t *)(addr)) = val)
|
||||
#define DEV_READ(addr) (*((volatile uint32_t *)(addr)))
|
||||
|
||||
#endif // DEV_ACCESS_H_
|
||||
@@ -0,0 +1,30 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#include "gpio.h"
|
||||
|
||||
#include "demo_system.h"
|
||||
#include "dev_access.h"
|
||||
|
||||
void set_outputs(gpio_t gpio, uint32_t outputs) { DEV_WRITE(gpio, outputs); }
|
||||
|
||||
uint32_t read_gpio(gpio_t gpio) { return DEV_READ(gpio); }
|
||||
|
||||
void set_output_bit(gpio_t gpio, uint32_t output_bit_index, uint32_t output_bit) {
|
||||
output_bit &= 1;
|
||||
|
||||
uint32_t output_bits = read_gpio(gpio);
|
||||
output_bits &= ~(1 << output_bit_index);
|
||||
output_bits |= (output_bit << output_bit_index);
|
||||
|
||||
set_outputs(gpio, output_bits);
|
||||
}
|
||||
|
||||
uint32_t get_output_bit(gpio_t gpio, uint32_t output_bit_index) {
|
||||
uint32_t output_bits = read_gpio(gpio);
|
||||
output_bits >>= output_bit_index;
|
||||
output_bits &= 1;
|
||||
|
||||
return output_bits;
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#ifndef GPIO_H__
|
||||
#define GPIO_H__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#define GPIO_OUT_REG 0x0
|
||||
#define GPIO_IN_REG 0x4
|
||||
#define GPIO_IN_DBNC_REG 0x8
|
||||
#define GPIO_OUT_SHIFT_REG 0xC
|
||||
|
||||
#define GPIO_OUT_MASK 0xF // Support 4-bit output
|
||||
|
||||
typedef void* gpio_t;
|
||||
|
||||
#define GPIO_FROM_BASE_ADDR(addr) ((gpio_t)addr)
|
||||
|
||||
void set_outputs(gpio_t gpio, uint32_t outputs);
|
||||
uint32_t read_gpio(gpio_t gpio);
|
||||
|
||||
void set_output_bit(gpio_t gpio, uint32_t output_bit_index, uint32_t output_bit);
|
||||
|
||||
uint32_t get_output_bit(gpio_t gpio, uint32_t output_bit_index);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,12 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#include "pwm.h"
|
||||
|
||||
#include "dev_access.h"
|
||||
|
||||
void set_pwm(pwm_t pwm, uint32_t counter, uint32_t pulse_width) {
|
||||
DEV_WRITE(&pwm[1], counter);
|
||||
DEV_WRITE(&pwm[0], pulse_width);
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#ifndef PWM_H__
|
||||
#define PWM_H__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
typedef uint32_t* pwm_t;
|
||||
|
||||
#define PWM_FROM_ADDR_AND_INDEX(addr, index) (&(((pwm_t)addr)[2 * index]))
|
||||
|
||||
void set_pwm(pwm_t pwm, uint32_t counter, uint32_t pulse_width);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,22 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#include "spi.h"
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "dev_access.h"
|
||||
|
||||
void spi_init(spi_t *spi, spi_reg_t spi_reg, uint32_t speed) {
|
||||
spi->reg = spi_reg;
|
||||
spi->speed = speed;
|
||||
}
|
||||
|
||||
void spi_send_byte_blocking(spi_t *spi, char c) {
|
||||
while (DEV_READ(spi->reg + SPI_STATUS_REG) & SPI_STATUS_TX_FULL)
|
||||
;
|
||||
DEV_WRITE(spi->reg + SPI_TX_REG, c);
|
||||
}
|
||||
|
||||
spi_status_t spi_get_status(spi_t *spi) { return (spi_status_t)DEV_READ(spi->reg + SPI_STATUS_REG); }
|
||||
@@ -0,0 +1,33 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#ifndef SPI_H__
|
||||
#define SPI_H__
|
||||
|
||||
#include "stdint.h"
|
||||
|
||||
#define SPI_TX_REG 0
|
||||
#define SPI_STATUS_REG 4
|
||||
|
||||
#define SPI_STATUS_TX_FULL 1 << 0
|
||||
#define SPI_STATUS_TX_EMPTY 1 << 1
|
||||
#define SPI_FROM_BASE_ADDR(addr) ((spi_reg_t)(addr))
|
||||
|
||||
typedef void *spi_reg_t;
|
||||
|
||||
typedef enum {
|
||||
spi_status_fifo_full = SPI_STATUS_TX_FULL,
|
||||
spi_status_fifo_empty = SPI_STATUS_TX_EMPTY,
|
||||
} spi_status_t;
|
||||
|
||||
typedef struct spi {
|
||||
spi_reg_t reg;
|
||||
uint32_t speed;
|
||||
} spi_t;
|
||||
|
||||
void spi_init(spi_t *spi, spi_reg_t reg, uint32_t speed);
|
||||
void spi_send_byte_blocking(spi_t *spi, char c);
|
||||
spi_status_t spi_get_status(spi_t *spi);
|
||||
|
||||
#endif // SPI_H__
|
||||
@@ -0,0 +1,57 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#include "timer.h"
|
||||
|
||||
#include "demo_system.h"
|
||||
#include "dev_access.h"
|
||||
|
||||
volatile uint64_t time_elapsed;
|
||||
uint64_t time_increment;
|
||||
|
||||
void timecmp_update(uint64_t new_time) {
|
||||
DEV_WRITE(TIMER_BASE + TIMER_MTIMECMP_REG, -1);
|
||||
DEV_WRITE(TIMER_BASE + TIMER_MTIMECMPH_REG, new_time >> 32);
|
||||
DEV_WRITE(TIMER_BASE + TIMER_MTIMECMP_REG, new_time);
|
||||
}
|
||||
|
||||
inline static void increment_timecmp(uint64_t time_base) {
|
||||
uint64_t current_time = timer_read();
|
||||
current_time += time_base;
|
||||
timecmp_update(current_time);
|
||||
}
|
||||
|
||||
void simple_timer_handler(void) __attribute__((interrupt));
|
||||
|
||||
void simple_timer_handler(void) {
|
||||
increment_timecmp(time_increment);
|
||||
time_elapsed++;
|
||||
}
|
||||
|
||||
void timer_init(void) { install_exception_handler(7, &simple_timer_handler); }
|
||||
|
||||
uint64_t timer_read() {
|
||||
uint32_t current_timeh;
|
||||
uint32_t current_time;
|
||||
// check if time overflowed while reading and try again
|
||||
do {
|
||||
current_timeh = DEV_READ(TIMER_BASE + TIMER_MTIMEH_REG);
|
||||
current_time = DEV_READ(TIMER_BASE + TIMER_MTIME_REG);
|
||||
} while (current_timeh != DEV_READ(TIMER_BASE + TIMER_MTIMEH_REG));
|
||||
uint64_t final_time = ((uint64_t)current_timeh << 32) | current_time;
|
||||
return final_time;
|
||||
}
|
||||
|
||||
uint64_t get_elapsed_time(void) { return time_elapsed; }
|
||||
|
||||
void timer_enable(uint64_t time_base) {
|
||||
time_elapsed = 0;
|
||||
time_increment = time_base;
|
||||
// Set timer values
|
||||
increment_timecmp(time_base);
|
||||
enable_interrupts(TIMER_IRQ);
|
||||
set_global_interrupt_enable(1);
|
||||
}
|
||||
|
||||
void timer_disable(void) { asm volatile("csrc mie, %0\n" : : "r"(0x80)); }
|
||||
@@ -0,0 +1,21 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#ifndef TIMER_H__
|
||||
#define TIMER_H__
|
||||
|
||||
#include "stdint.h"
|
||||
|
||||
#define TIMER_MTIME_REG 0x0
|
||||
#define TIMER_MTIMEH_REG 0x4
|
||||
#define TIMER_MTIMECMP_REG 0x8
|
||||
#define TIMER_MTIMECMPH_REG 0xC
|
||||
|
||||
void timer_init();
|
||||
uint64_t timer_read();
|
||||
uint64_t get_elapsed_time();
|
||||
void timer_enable(uint64_t time_base);
|
||||
void timer_disable();
|
||||
|
||||
#endif // TIMER_H__
|
||||
@@ -0,0 +1,30 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#include "uart.h"
|
||||
|
||||
#include "demo_system.h"
|
||||
#include "dev_access.h"
|
||||
|
||||
void uart_enable_rx_int(void) {
|
||||
enable_interrupts(UART_IRQ);
|
||||
set_global_interrupt_enable(1);
|
||||
}
|
||||
|
||||
int uart_in(uart_t uart) {
|
||||
int res = UART_EOF;
|
||||
|
||||
if (!(DEV_READ(uart + UART_STATUS_REG) & UART_STATUS_RX_EMPTY)) {
|
||||
res = DEV_READ(uart + UART_RX_REG);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
void uart_out(uart_t uart, char c) {
|
||||
while (DEV_READ(uart + UART_STATUS_REG) & UART_STATUS_TX_FULL)
|
||||
;
|
||||
|
||||
DEV_WRITE(uart + UART_TX_REG, c);
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#ifndef UART_H__
|
||||
#define UART_H__
|
||||
|
||||
#define UART_RX_REG 0
|
||||
#define UART_TX_REG 4
|
||||
#define UART_STATUS_REG 8
|
||||
|
||||
#define UART_STATUS_RX_EMPTY 1
|
||||
#define UART_STATUS_TX_FULL 2
|
||||
|
||||
#define UART_EOF -1
|
||||
|
||||
typedef void* uart_t;
|
||||
|
||||
#define UART_FROM_BASE_ADDR(addr) ((uart_t)(addr))
|
||||
|
||||
void uart_enable_rx_int(void);
|
||||
int uart_in(uart_t uart);
|
||||
void uart_out(uart_t uart, char c);
|
||||
|
||||
#endif // UART_H__
|
||||
@@ -0,0 +1,4 @@
|
||||
add_subdirectory(hello_world)
|
||||
add_subdirectory(lcd_st7735)
|
||||
add_subdirectory(simpleserial-aes)
|
||||
add_subdirectory(basic-passwdcheck)
|
||||
@@ -0,0 +1,12 @@
|
||||
add_definitions(-DSS_VER=1 -DHAL_TYPE=HAL_ibex)
|
||||
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../../vendor/newae/crypto)
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../../vendor/newae/hal)
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../../vendor/newae/simpleserial)
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../common)
|
||||
|
||||
|
||||
add_executable(basic-passwdcheck ${CMAKE_CURRENT_SOURCE_DIR}/../../../../vendor/newae/basic-passwdcheck/basic-passwdcheck.c)
|
||||
|
||||
target_link_libraries(basic-passwdcheck common simpleserial)
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
ChipWhisperer basic-passwdcheck application, intended to be run on a
|
||||
ChipWhisperer FPGA target (synth_cw305 or synth_cw312a35 targets).
|
||||
|
||||
This can then be used with NewAE's "Power Analysis for Password Bypass"
|
||||
notebook
|
||||
(https://github.com/newaetech/chipwhisperer-jupyter/tree/master/courses/sca101/),
|
||||
with modifications to the target clock and baud rate:
|
||||
scope.clock.adc_mul = 1 # if using CW-Husky
|
||||
scope.clock.adc_src = 'clkgen_x1' # if using CW-lite/pro
|
||||
scope.clock.clkgen_freq = 100e6
|
||||
target.baud = 115200
|
||||
|
||||
Note that the password bypass attack will not work well on the CW305 target
|
||||
since that target lacks a method to reset the Ibex processor from the host PC
|
||||
(top_cw305.sv could be modified to achieve this). However it will work on the
|
||||
CW312-A35 target.
|
||||
|
||||
Note that this application (and many others!) can also be built in the
|
||||
ChipWhisperer repository:
|
||||
https://github.com/newaetech/chipwhisperer/tree/develop/hardware/victims/firmware/basic-passwdcheck/
|
||||
using:
|
||||
make PLATFORM=CW305_IBEX CRYPTO_TARGET=NONE
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
add_executable(demo main.c)
|
||||
target_link_libraries(demo common)
|
||||
@@ -0,0 +1,101 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "demo_system.h"
|
||||
#include "gpio.h"
|
||||
#include "pwm.h"
|
||||
#include "timer.h"
|
||||
|
||||
#define USE_GPIO_SHIFT_REG 0
|
||||
|
||||
void test_uart_irq_handler(void) __attribute__((interrupt));
|
||||
|
||||
void test_uart_irq_handler(void) {
|
||||
int uart_in_char;
|
||||
|
||||
while ((uart_in_char = uart_in(DEFAULT_UART)) != -1) {
|
||||
uart_out(DEFAULT_UART, uart_in_char);
|
||||
uart_out(DEFAULT_UART, '\r');
|
||||
uart_out(DEFAULT_UART, '\n');
|
||||
}
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
install_exception_handler(UART_IRQ_NUM, &test_uart_irq_handler);
|
||||
uart_enable_rx_int();
|
||||
|
||||
// This indicates how often the timer gets updated.
|
||||
timer_init();
|
||||
timer_enable(5000000);
|
||||
|
||||
uint64_t last_elapsed_time = get_elapsed_time();
|
||||
|
||||
// Reset green LEDs to off
|
||||
set_outputs(GPIO_OUT, 0x0);
|
||||
|
||||
// PWM variables
|
||||
uint32_t counter = UINT8_MAX;
|
||||
uint32_t brightness = 0;
|
||||
bool ascending = true;
|
||||
// The three least significant bits correspond to RGB, where B is the leas significant.
|
||||
uint8_t color = 7;
|
||||
|
||||
while (1) {
|
||||
uint64_t cur_time = get_elapsed_time();
|
||||
|
||||
if (cur_time != last_elapsed_time) {
|
||||
last_elapsed_time = cur_time;
|
||||
|
||||
// Disable interrupts whilst outputting to prevent output for RX IRQ
|
||||
// happening in the middle
|
||||
set_global_interrupt_enable(0);
|
||||
|
||||
// Print this to UART (use the screen command to see it).
|
||||
puts("Hello World! ");
|
||||
puthex(last_elapsed_time);
|
||||
puts(" Input Value: ");
|
||||
uint32_t in_val = read_gpio(GPIO_IN_DBNC);
|
||||
puthex(in_val);
|
||||
putchar('\n');
|
||||
|
||||
// Re-enable interrupts with output complete
|
||||
set_global_interrupt_enable(1);
|
||||
|
||||
// Cycling through green LEDs when BTN0 is pressed
|
||||
if (USE_GPIO_SHIFT_REG) {
|
||||
set_outputs(GPIO_OUT_SHIFT, in_val);
|
||||
} else {
|
||||
uint32_t out_val = read_gpio(GPIO_OUT);
|
||||
out_val = ((out_val << 1) & GPIO_OUT_MASK) | (in_val & 0x1);
|
||||
set_outputs(GPIO_OUT, out_val);
|
||||
}
|
||||
|
||||
// Going from bright to dim on PWM
|
||||
for (int i = 0; i < NUM_PWM_MODULES; i++) {
|
||||
set_pwm(PWM_FROM_ADDR_AND_INDEX(PWM_BASE, i), ((1 << (i % 3)) & color) ? counter : 0,
|
||||
brightness ? 1 << (brightness - 1) : 0);
|
||||
}
|
||||
if (ascending) {
|
||||
brightness++;
|
||||
if (brightness >= 5) {
|
||||
ascending = false;
|
||||
}
|
||||
} else {
|
||||
brightness--;
|
||||
// When LEDs are off cycle through the colors
|
||||
if (brightness == 0) {
|
||||
ascending = true;
|
||||
color++;
|
||||
if (color >= 8) {
|
||||
color = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
asm volatile("wfi");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
|
||||
add_library(lcd_st7735_lib
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../vendor/display_drivers/core/lcd_base.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../vendor/display_drivers/core/lucida_console_10pt.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../vendor/display_drivers/core/lucida_console_12pt.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../vendor/display_drivers/st7735/lcd_st7735.c
|
||||
)
|
||||
|
||||
# add_executable(lcd_st7735 main.c)
|
||||
add_executable(lcd_st7735 main.c lcd.c fractal_fixed.c fractal_float.c fractal_palette.c)
|
||||
|
||||
# pull in core dependencies and additional i2c hardware support
|
||||
target_link_libraries(lcd_st7735 common lcd_st7735_lib)
|
||||
|
||||
target_include_directories(lcd_st7735 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../../../vendor/display_drivers)
|
||||
@@ -0,0 +1,13 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
#ifndef LCD_ST_7735_FRACTAL
|
||||
#define LCD_ST_7735_FRACTAL
|
||||
|
||||
#include "lcd.h"
|
||||
|
||||
void fractal_mandelbrot_float(St7735Context *lcd);
|
||||
void fractal_mandelbrot_fixed(St7735Context *lcd);
|
||||
extern uint16_t rgb_iters_palette[51];
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,106 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "fractal.h"
|
||||
#include "lcd.h"
|
||||
|
||||
#define FP_EXP 12
|
||||
#define FP_MANT 15
|
||||
#define MAKE_FP(i, f, f_bits) ((i << FP_EXP) | (f << (FP_EXP - f_bits)))
|
||||
|
||||
typedef uint32_t cmplx_fixed_packed_t;
|
||||
|
||||
typedef struct {
|
||||
int32_t real;
|
||||
int32_t imag;
|
||||
} cmplx_fixed_t;
|
||||
|
||||
int32_t fp_clamp(int32_t x) {
|
||||
if ((x < 0) && (x < -(1 << FP_MANT))) {
|
||||
return -(1 << FP_MANT);
|
||||
}
|
||||
|
||||
if ((x > 0) && (x >= (1 << FP_MANT))) {
|
||||
return (1 << FP_MANT) - 1;
|
||||
}
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
int32_t to_fp(int32_t x) {
|
||||
int32_t res;
|
||||
res = fp_clamp(x << FP_EXP);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
int32_t fp_add(int32_t a, int32_t b) { return fp_clamp(a + b); }
|
||||
|
||||
int32_t fp_mul(int32_t a, int32_t b) { return fp_clamp((a * b) >> FP_EXP); }
|
||||
|
||||
int32_t cmplx_fixed_abs_sq(cmplx_fixed_t c) { return fp_mul(c.real, c.real) + fp_mul(c.imag, c.imag); }
|
||||
|
||||
cmplx_fixed_t cmplx_fixed_mul(cmplx_fixed_t c1, cmplx_fixed_t c2) {
|
||||
cmplx_fixed_t res;
|
||||
|
||||
res.real = fp_add(fp_mul(c1.real, c2.real), -fp_mul(c1.imag, c2.imag));
|
||||
res.imag = fp_add(fp_mul(c1.real, c2.imag), fp_mul(c1.imag, c2.real));
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
cmplx_fixed_t cmplx_fixed_add(cmplx_fixed_t c1, cmplx_fixed_t c2) {
|
||||
cmplx_fixed_t res;
|
||||
|
||||
res.real = fp_add(c1.real, c2.real);
|
||||
res.imag = fp_add(c1.imag, c2.imag);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
int mandel_iters_fixed(cmplx_fixed_t c, uint32_t max_iters) {
|
||||
cmplx_fixed_t iter_val;
|
||||
|
||||
iter_val = c;
|
||||
for (uint32_t i = 0; i < max_iters; ++i) {
|
||||
iter_val = cmplx_fixed_add(cmplx_fixed_mul(iter_val, iter_val), c);
|
||||
if (cmplx_fixed_abs_sq(iter_val) > MAKE_FP(4, 0, 0)) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return max_iters;
|
||||
}
|
||||
|
||||
void fractal_mandelbrot_fixed(St7735Context *lcd) {
|
||||
cmplx_fixed_t cur_p;
|
||||
int32_t inc;
|
||||
|
||||
LCD_rectangle rectangle = {.origin = {.x = 0, .y = 0}, .width = 160, .height = 128};
|
||||
lcd_st7735_clean(lcd);
|
||||
lcd_st7735_rgb565_start(lcd, rectangle);
|
||||
|
||||
cur_p.real = -MAKE_FP(1, 0x3, 2);
|
||||
cur_p.imag = MAKE_FP(1, 0, 0);
|
||||
|
||||
inc = MAKE_FP(0, 0x40, 12);
|
||||
|
||||
for (int y = 0; y < 128; ++y) {
|
||||
for (int x = 0; x < 160; ++x) {
|
||||
int iters = mandel_iters_fixed(cur_p, 50);
|
||||
|
||||
uint16_t rgb = rgb_iters_palette[iters];
|
||||
lcd_st7735_rgb565_put(lcd, (uint8_t *)&rgb, sizeof(rgb));
|
||||
|
||||
cur_p.real += inc;
|
||||
}
|
||||
|
||||
cur_p.imag -= inc;
|
||||
cur_p.real = -MAKE_FP(1, 0x3, 2);
|
||||
}
|
||||
|
||||
lcd_st7735_rgb565_finish(lcd);
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "fractal.h"
|
||||
#include "lcd.h"
|
||||
|
||||
typedef struct {
|
||||
float real;
|
||||
float imag;
|
||||
} cmplx_float_t;
|
||||
|
||||
float cmplx_float_abs_sq(cmplx_float_t c) { return c.real * c.real + c.imag * c.imag; }
|
||||
|
||||
cmplx_float_t cmplx_float_mul(cmplx_float_t c1, cmplx_float_t c2) {
|
||||
cmplx_float_t res;
|
||||
|
||||
res.real = c1.real * c2.real - c1.imag * c2.imag;
|
||||
res.imag = c1.real * c2.imag + c1.imag * c2.real;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
cmplx_float_t cmplx_float_add(cmplx_float_t c1, cmplx_float_t c2) {
|
||||
cmplx_float_t res;
|
||||
|
||||
res.real = c1.real + c2.real;
|
||||
res.imag = c1.imag + c2.imag;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
int mandel_iters_float(cmplx_float_t c, uint32_t max_iters) {
|
||||
cmplx_float_t iter_val;
|
||||
|
||||
iter_val = c;
|
||||
for (uint32_t i = 0; i < max_iters; ++i) {
|
||||
iter_val = cmplx_float_add(cmplx_float_mul(iter_val, iter_val), c);
|
||||
if (cmplx_float_abs_sq(iter_val) > 4.0f) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return max_iters;
|
||||
}
|
||||
|
||||
void fractal_mandelbrot_float(St7735Context *lcd) {
|
||||
cmplx_float_t cur_p;
|
||||
float real_inc;
|
||||
float imag_inc;
|
||||
|
||||
LCD_rectangle rectangle = {.origin = {.x = 0, .y = 0}, .width = 160, .height = 128};
|
||||
lcd_st7735_clean(lcd);
|
||||
lcd_st7735_rgb565_start(lcd, rectangle);
|
||||
|
||||
cur_p.real = -1.75f;
|
||||
cur_p.imag = 1.0f;
|
||||
|
||||
real_inc = 2.5f / 160.0f;
|
||||
imag_inc = -2.0f / 128.0f;
|
||||
|
||||
for (int y = 0; y < 128; ++y) {
|
||||
for (int x = 0; x < 160; ++x) {
|
||||
int iters = mandel_iters_float(cur_p, 50);
|
||||
|
||||
uint16_t rgb = rgb_iters_palette[iters];
|
||||
lcd_st7735_rgb565_put(lcd, (uint8_t *)&rgb, sizeof(rgb));
|
||||
|
||||
cur_p.real += real_inc;
|
||||
}
|
||||
|
||||
cur_p.imag += imag_inc;
|
||||
cur_p.real = -1.75f;
|
||||
}
|
||||
|
||||
lcd_st7735_rgb565_finish(lcd);
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "fractal.h"
|
||||
|
||||
uint16_t rgb_iters_palette[51] = {
|
||||
0x91e7, 0x7ca7, 0x5ca7, 0x44a7, 0x3ca9, 0x3cab, 0x3cad, 0x3caf, 0x3cb1, 0x3cb2, 0x3c52, 0x3bf2, 0x3b92,
|
||||
0x3b52, 0x3b12, 0x3ab2, 0x3a72, 0x3a32, 0x39f2, 0x41f2, 0x49f2, 0x51f2, 0x59f2, 0x59f2, 0x61f2, 0x69f2,
|
||||
0x71f2, 0x79f2, 0x79f2, 0x81f2, 0x89f2, 0x91f2, 0x91f2, 0x91f1, 0x91f1, 0x91f0, 0x91ef, 0x91ef, 0x91ee,
|
||||
0x91ed, 0x91ed, 0x91ec, 0x91eb, 0x91eb, 0x91ea, 0x91ea, 0x91e9, 0x91e9, 0x91e8, 0x91e7, 0x91e7};
|
||||
@@ -0,0 +1,59 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#include "lcd.h"
|
||||
|
||||
#include "st7735/lcd_st7735.h"
|
||||
#include "string.h"
|
||||
|
||||
void lcd_show_menu(St7735Context *lcd, Menu_t *menu) {
|
||||
size_t line = 0;
|
||||
size_t selected = 1;
|
||||
// Clean the screen.
|
||||
lcd_st7735_fill_rectangle(
|
||||
lcd, (LCD_rectangle){.origin = {.x = 0, .y = 0}, .width = lcd->parent.width, .height = lcd->parent.font->height},
|
||||
menu->color);
|
||||
|
||||
// Invert background and foreground colors for the title.
|
||||
lcd_st7735_set_font_colors(lcd, menu->color, menu->background);
|
||||
lcd_println(lcd, menu->title, alined_center, line++);
|
||||
// Set the colors for the menu items.
|
||||
lcd_st7735_set_font_colors(lcd, menu->background, menu->color);
|
||||
// Draw the menu items.
|
||||
for (int i = 0; i < menu->items_count; ++i) {
|
||||
lcd_println(lcd, menu->items[i], alined_left, line++);
|
||||
}
|
||||
|
||||
// Drow a boarder around the selected item.
|
||||
selected++;
|
||||
lcd_st7735_draw_horizontal_line(
|
||||
lcd, (LCD_Line){{.x = 0, .y = lcd->parent.font->height * selected}, lcd->parent.width}, menu->selected_color);
|
||||
lcd_st7735_draw_horizontal_line(
|
||||
lcd, (LCD_Line){{.x = 0, .y = lcd->parent.font->height * (selected + 1) - 1}, lcd->parent.width},
|
||||
menu->selected_color);
|
||||
lcd_st7735_draw_vertical_line(
|
||||
lcd, (LCD_Line){{.x = 0, .y = lcd->parent.font->height * selected}, lcd->parent.font->height - 1},
|
||||
menu->selected_color);
|
||||
lcd_st7735_draw_vertical_line(
|
||||
lcd,
|
||||
(LCD_Line){{.x = lcd->parent.width - 1, .y = lcd->parent.font->height * selected}, lcd->parent.font->height - 1},
|
||||
menu->selected_color);
|
||||
}
|
||||
|
||||
void lcd_println(St7735Context *lcd, const char *str, TextAlignment_t alignment, int32_t line) {
|
||||
// Align the test in the left.
|
||||
LCD_Point pos = {.y = line * lcd->parent.font->height, .x = 0};
|
||||
|
||||
if (alignment != alined_left) {
|
||||
// Align the text in the right.
|
||||
pos.x = lcd->parent.width - strlen(str) * lcd->parent.font->descriptor_table->width;
|
||||
if (alignment == alined_center) {
|
||||
// Align the test in the center.
|
||||
pos.x /= 2;
|
||||
}
|
||||
}
|
||||
|
||||
// Draw the text.
|
||||
lcd_st7735_puts(lcd, pos, str);
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#ifndef LCD_ST_7735_LCD
|
||||
#define LCD_ST_7735_LCD
|
||||
|
||||
#include "st7735/lcd_st7735.h"
|
||||
#include "string.h"
|
||||
|
||||
// Color codes in BGR format.
|
||||
enum {
|
||||
BGRColorBlack = 0x000000,
|
||||
BGRColorBlue = 0xFF0000,
|
||||
BGRColorGreen = 0x00FF00,
|
||||
BGRColorRed = 0x0000FF,
|
||||
BGRColorWhite = 0xFFFFFF,
|
||||
};
|
||||
|
||||
// Text alignment.
|
||||
typedef enum TextAlignment {
|
||||
alined_right,
|
||||
alined_center,
|
||||
alined_left,
|
||||
} TextAlignment_t;
|
||||
|
||||
/**
|
||||
* @brief Draw a NULL terminated string in the screen.
|
||||
*
|
||||
* @param lcd LCD handle.
|
||||
* @param str NULL terminated string.
|
||||
* @param alignment Text horizontal alignment in the screen.
|
||||
* @param line Position line starting at 0. The total number of lines will vary depending on
|
||||
* the font size.
|
||||
*/
|
||||
void lcd_println(St7735Context *lcd, const char *str, TextAlignment_t alignment, int32_t line);
|
||||
|
||||
typedef struct Menu {
|
||||
const char *title; // Pointer to a NULL terminated string to be used as the title.
|
||||
const char **items; // Pointer to a array of NULL terminated strings with the menus.
|
||||
size_t items_count; // Size of the items array.
|
||||
uint32_t color; // Foreground color (text color).
|
||||
uint32_t background; // Background color.
|
||||
uint32_t selected_color; // Color of the selection box.
|
||||
} Menu_t;
|
||||
|
||||
/**
|
||||
* @brief Draw a menu in the screen.
|
||||
*
|
||||
* @param lcd LCD handle.
|
||||
* @param menu Menu configuration.
|
||||
*/
|
||||
void lcd_show_menu(St7735Context *lcd, Menu_t *menu);
|
||||
#endif
|
||||
@@ -0,0 +1,891 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
static char __attribute__((aligned(4))) lowrisc_logo_105x80[] = {
|
||||
0x9e, 0xf7, 0xbe, 0xf7, 0xbe, 0xf7, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xbf, 0xff, 0xbe, 0xf7, 0x9e,
|
||||
0xf7, 0x9e, 0xf7, 0xbe, 0xf7, 0xbf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xbf, 0xff,
|
||||
0xbe, 0xf7, 0x9e, 0xf7, 0xbf, 0xff, 0xbf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xbf,
|
||||
0xff, 0xbe, 0xf7, 0xbe, 0xf7, 0xbf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff,
|
||||
0xdf, 0xff, 0xbf, 0xff, 0xbe, 0xf7, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf,
|
||||
0xff, 0x5d, 0xff, 0x9b, 0xfe, 0xf8, 0xfd, 0x36, 0xf5, 0xb4, 0xf4, 0x73, 0xf4, 0x32, 0xf4, 0x53, 0xf4, 0x93, 0xf4,
|
||||
0x15, 0xf5, 0xb7, 0xfd, 0x7a, 0xfe, 0x1c, 0xff, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xdf,
|
||||
0xff, 0xdf, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5d, 0xff, 0xf8, 0xfd,
|
||||
0xd1, 0xeb, 0xad, 0xea, 0x4c, 0xe2, 0x0b, 0xe2, 0xea, 0xe1, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea,
|
||||
0xe1, 0xea, 0xe1, 0x0b, 0xe2, 0x2b, 0xe2, 0x8d, 0xea, 0x6f, 0xeb, 0x36, 0xf5, 0xfc, 0xfe, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff,
|
||||
0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xbf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xbb, 0xfe, 0xb4, 0xf4, 0xee, 0xea, 0xea,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x8c, 0xea, 0x12, 0xf4, 0x39,
|
||||
0xfe, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, 0xff, 0x93, 0xf4, 0x8c, 0xea, 0xea, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0xea, 0xe1, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0x2b, 0xe2, 0xb0, 0xeb, 0x7a, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xd8, 0xfd, 0xcd, 0xea, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0x2f, 0xeb, 0xf5, 0xf4, 0x97, 0xfd, 0x36, 0xf5, 0x90, 0xeb, 0x2b,
|
||||
0xe2, 0xca, 0xe1, 0xca, 0xe1, 0x4c, 0xe2, 0xd4, 0xf4, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0x9e, 0xff, 0x32, 0xf4, 0x0b, 0xe2, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x2b, 0xe2, 0x15, 0xf5, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff,
|
||||
0xb8, 0xfd, 0x8c, 0xea, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0x70, 0xeb, 0xbb, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, 0x2f, 0xeb, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x53, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0x56, 0xf5, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x4c, 0xe2, 0x19, 0xfe, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0x5d, 0xff, 0x0e, 0xeb, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x0b, 0xe2, 0xdc, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0x5d, 0xff, 0xcd, 0xea, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x6c, 0xea, 0xd8,
|
||||
0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0x1c, 0xff, 0xad, 0xea, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xcd, 0xea, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xf1, 0xf3, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0x4b, 0xe2, 0xf9, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0x9e, 0xff, 0x90, 0xeb, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xee, 0xea, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x12, 0xf4, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xcd, 0xea, 0xbb, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xdf, 0xff, 0x93, 0xf4, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x2b, 0xe2, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9e, 0xff, 0x0e, 0xeb, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0x4f, 0xeb, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xd8, 0xfd, 0x0b, 0xe2, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x0b, 0xe2, 0x0e, 0xeb, 0x73, 0xf4, 0xd4, 0xf4, 0x12, 0xf4, 0x8d, 0xea, 0xea,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0xf5, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0xfd, 0x2b, 0xe2, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0x73, 0xf4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0x5d, 0xff, 0x2f, 0xeb, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x2b, 0xe2, 0x15, 0xf5, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x1c, 0xff,
|
||||
0x32, 0xf4, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x6c, 0xe2, 0xf8, 0xfd, 0xdf, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x7a, 0xfe, 0xed, 0xea, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x6c, 0xe2, 0x9a, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0x15, 0xf5, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0x0b, 0xe2, 0x36, 0xf5, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0x5d, 0xff, 0xb0, 0xf3, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x2b, 0xe2, 0x12, 0xf4,
|
||||
0xf8, 0xfd, 0xff, 0xff, 0x9a, 0xfe, 0x73, 0xf4, 0x6c, 0xea, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0x6f, 0xeb, 0x9e, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0x3d, 0xff, 0xad, 0xea, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0x0b, 0xe2, 0x0b, 0xe2, 0x0b, 0xe2, 0x0b,
|
||||
0xe2, 0x0b, 0xe2, 0x0b, 0xe2, 0x4f, 0xeb, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xbb, 0xfe, 0x4c, 0xe2, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0x6c, 0xea, 0xff, 0xff, 0xd1, 0xf3, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0xb7, 0xfd, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xf5, 0xf4, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xcd, 0xea, 0xf5, 0xf4, 0x56, 0xf5, 0x56, 0xf5, 0x56, 0xf5,
|
||||
0x56, 0xf5, 0x56, 0xf5, 0x56, 0xf5, 0x5a, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0x0e, 0xeb, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0x6c, 0xea, 0xff, 0xff, 0xd1, 0xf3, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xd1, 0xeb,
|
||||
0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0x9e, 0xff, 0x2f, 0xeb, 0xca, 0xe1, 0xea, 0xe1, 0xee, 0xea, 0x7a, 0xfe, 0xdf, 0xff, 0x5d, 0xff, 0x5d, 0xff, 0x5d,
|
||||
0xff, 0x5d, 0xff, 0x5d, 0xff, 0x5d, 0xff, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xeb, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0x6c, 0xea, 0xff, 0xff, 0xd1, 0xf3, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x8c,
|
||||
0xea, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0x9b, 0xfe, 0x6c, 0xe2, 0xca, 0xe1, 0x0e, 0xeb, 0xdb, 0xfe, 0x7e, 0xff, 0x52, 0xf4, 0xcd, 0xea, 0xad, 0xea,
|
||||
0xad, 0xea, 0xad, 0xea, 0xad, 0xea, 0xad, 0xea, 0x73, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5d, 0xff, 0xcd, 0xea, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0x6c, 0xea, 0xff, 0xff, 0xd1, 0xf3, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xea, 0xe1, 0x15, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0x56, 0xf5, 0x0b, 0xe2, 0x0e, 0xeb, 0x9a, 0xfe, 0x9e, 0xff, 0x53, 0xf4, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xad, 0xea, 0xdc, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x35, 0xf5, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x6c, 0xea, 0xff, 0xff, 0xd1, 0xf3, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xea, 0xe1, 0xf1, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xbf, 0xff, 0xd1, 0xeb, 0x2e, 0xeb, 0xbb, 0xfe, 0x5d, 0xff, 0x32, 0xf4, 0xeb, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0x70, 0xeb, 0xfc, 0xfe, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xfd, 0x4b, 0xe2, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x6c, 0xea, 0xff, 0xff, 0xd1, 0xf3, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0x6f, 0xeb, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0x5d, 0xff, 0xb0, 0xeb, 0xbb, 0xfe, 0x7e, 0xff, 0x32, 0xf4, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x4f, 0xeb, 0xd8, 0xfd,
|
||||
0x1c, 0xff, 0x5d, 0xff, 0xbb, 0xfe, 0xf5, 0xf4, 0x8c, 0xea, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x6c, 0xea, 0xff, 0xff, 0xd1, 0xf3, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea,
|
||||
0xe1, 0x4f, 0xeb, 0xdb, 0xfe, 0x7e, 0xff, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0x9e, 0xff, 0xdb, 0xfe, 0x5d, 0xff, 0x32, 0xf4, 0x0b, 0xe2, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x0b,
|
||||
0xe2, 0x8c, 0xea, 0xcd, 0xea, 0x6c, 0xe2, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x8c, 0xea, 0xff, 0xff, 0xd1, 0xf3, 0xea, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0x70, 0xeb, 0x1c, 0xff, 0x1d, 0xff, 0xb0, 0xeb, 0x77, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7e, 0xff, 0x12, 0xf4, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x0b, 0xe2, 0x2b, 0xe2, 0x2b, 0xe2, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0xf1, 0xf3, 0xff, 0xff, 0x90, 0xeb, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0x4f,
|
||||
0xeb, 0xfc, 0xfe, 0x5d, 0xff, 0xf1, 0xf3, 0xea, 0xe1, 0xb4, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0x5d, 0xff, 0xf1, 0xf3, 0x0b, 0xe2, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xea, 0xe1, 0x0e, 0xeb, 0x76, 0xfd, 0x7a, 0xfe, 0x5a, 0xfe, 0x36, 0xf5, 0xee, 0xea, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x6f, 0xeb, 0x5d, 0xff, 0xfc, 0xfe, 0x6c, 0xea, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x90, 0xeb,
|
||||
0x1c, 0xff, 0x3d, 0xff, 0x90, 0xeb, 0xea, 0xe1, 0xca, 0xe1, 0x53, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x76, 0xf5, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xea, 0xe1, 0x12, 0xf4, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, 0xff, 0xb0, 0xeb,
|
||||
0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0x4f, 0xeb, 0xfc, 0xfe, 0x5e, 0xff, 0xd1, 0xeb, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0x70, 0xeb, 0xfc,
|
||||
0xfe, 0x3d, 0xff, 0xf1, 0xf3, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x12, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x35, 0xf5, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0x8d, 0xea, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7e,
|
||||
0xff, 0x2e, 0xeb, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x70, 0xeb, 0x5d, 0xff, 0x3d, 0xff, 0x2f, 0xeb, 0xea, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xb0, 0xeb, 0x3d, 0xff,
|
||||
0x3d, 0xff, 0x90, 0xeb, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x12, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x56, 0xf5, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xea, 0xe1, 0x76, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xf5, 0xf4, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xea, 0xe1, 0x6f, 0xeb, 0x1c, 0xff, 0x5d, 0xff, 0xb0, 0xeb, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0x70, 0xeb, 0xfc, 0xfe, 0x3d,
|
||||
0xff, 0xb0, 0xeb, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x52, 0xf4, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb8, 0xfd, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0x0b, 0xe2, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xd8, 0xfd, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xb0, 0xeb, 0x7d, 0xff, 0x3d, 0xff, 0x4f, 0xeb, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xb0, 0xeb, 0x5d, 0xff, 0x1c, 0xff,
|
||||
0x90, 0xeb, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x94, 0xf4, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5a, 0xfe, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0x0b, 0xe2, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xd8, 0xfd, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xea, 0xe1, 0x4f, 0xeb, 0x1d, 0xff, 0x5d, 0xff, 0x90, 0xeb, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0x70, 0xeb, 0x1c, 0xff, 0x5d, 0xff, 0x90,
|
||||
0xeb, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x36, 0xf5, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, 0xff, 0x2b, 0xe2, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0x56, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0xf4, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xb1, 0xeb, 0x7e, 0xff, 0x1c, 0xff, 0x4f, 0xeb, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xb0, 0xeb, 0x5d, 0xff, 0xfc, 0xfe, 0x4f, 0xeb,
|
||||
0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xd8, 0xfd, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9e, 0xff, 0x4f, 0xeb, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xad, 0xea, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0x5d, 0xff, 0x0e, 0xeb, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea,
|
||||
0xe1, 0x4f, 0xeb, 0x3d, 0xff, 0x5d, 0xff, 0x6f, 0xeb, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0x6f, 0xeb, 0x5d, 0xff, 0x5d, 0xff, 0x90, 0xeb, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x0b, 0xe2, 0x9b, 0xfe,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0xf4, 0xea, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x6c, 0xea, 0x5a, 0xfe, 0xdf, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xfc, 0xfe, 0x4f, 0xeb, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xd1, 0xeb, 0x7e, 0xff, 0xfc, 0xfe, 0x2e, 0xeb, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xd1, 0xeb, 0x5d, 0xff, 0x1c, 0xff, 0x4f, 0xeb, 0xea, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x8d, 0xea, 0x9e,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x39, 0xfe, 0x2b,
|
||||
0xe2, 0xca, 0xe1, 0xca, 0xe1, 0x6c, 0xe2, 0xd8, 0xfd, 0xdf, 0xff, 0x15, 0xf5, 0xad, 0xea, 0x35, 0xf5, 0x39, 0xfe,
|
||||
0x19, 0xfe, 0x15, 0xf5, 0xad, 0xea, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0xb0,
|
||||
0xeb, 0x3d, 0xff, 0x3d, 0xff, 0x90, 0xeb, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0x90, 0xeb, 0x3d, 0xff, 0x1c, 0xff, 0x90, 0xeb, 0xea, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0x52, 0xf4,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5e, 0xff,
|
||||
0xee, 0xea, 0xca, 0xe1, 0x6c, 0xea, 0x39, 0xfe, 0xbf, 0xff, 0xf5, 0xf4, 0x2b, 0xe2, 0xca, 0xe1, 0xea, 0xe1, 0x0b,
|
||||
0xe2, 0x0b, 0xe2, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xd1, 0xeb,
|
||||
0x7e, 0xff, 0xfc, 0xfe, 0x0e, 0xeb, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xf1, 0xf3, 0x7e, 0xff, 0xfc, 0xfe, 0x2f, 0xeb, 0xea, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x4b, 0xe2, 0xfc,
|
||||
0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf,
|
||||
0xff, 0x53, 0xf4, 0x8c, 0xea, 0xf8, 0xfd, 0xdf, 0xff, 0x15, 0xf5, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0xd1, 0xeb, 0x3d,
|
||||
0xff, 0x1c, 0xff, 0x90, 0xeb, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0xb0, 0xeb, 0x3d, 0xff, 0x1c, 0xff, 0x6f, 0xeb, 0xea, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x6f, 0xeb,
|
||||
0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xfc, 0xfe, 0x39, 0xfe, 0x9e, 0xff, 0xf5, 0xf4, 0x2b, 0xe2, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0x12, 0xf4, 0x5e, 0xff,
|
||||
0xdc, 0xfe, 0x4f, 0xeb, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xf1, 0xeb, 0x7e, 0xff, 0xdb, 0xfe, 0x2f, 0xeb, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0x36,
|
||||
0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xf5, 0xf4, 0x0b, 0xe2, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0xb1, 0xeb, 0x3d, 0xff, 0xfc,
|
||||
0xfe, 0x6f, 0xeb, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x0b, 0xe2, 0xcd, 0xea, 0xb0, 0xeb, 0x90, 0xeb,
|
||||
0xad, 0xea, 0x2b, 0xe2, 0xb0, 0xeb, 0x3d, 0xff, 0x3d, 0xff, 0x6f, 0xeb, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xed, 0xea,
|
||||
0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7e, 0xff, 0x0e, 0xeb, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x12, 0xf4, 0x7e, 0xff, 0xbb, 0xfe,
|
||||
0x4f, 0xeb, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xee, 0xea, 0xd8, 0xfd, 0x5d, 0xff, 0xbf, 0xff, 0xbf,
|
||||
0xff, 0x3d, 0xff, 0x19, 0xfe, 0x9e, 0xff, 0xbb, 0xfe, 0x0e, 0xeb, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x2b, 0xe2, 0xd8,
|
||||
0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x36, 0xf5, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x0b, 0xe2, 0xd0, 0xeb, 0x3d, 0xff, 0x1c, 0xff, 0x4f,
|
||||
0xeb, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x2b, 0xe2, 0x39, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xeb, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xd1, 0xeb,
|
||||
0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7e, 0xff, 0xb0, 0xeb, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x12, 0xf4, 0x7e, 0xff, 0xbb, 0xfe, 0x2e, 0xeb,
|
||||
0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0x73, 0xf4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x12, 0xf4, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xad, 0xea, 0xbb,
|
||||
0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, 0xff, 0x0e, 0xeb, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x0b, 0xe2, 0xf1, 0xf3, 0x3d, 0xff, 0xfc, 0xfe, 0x6f, 0xeb, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x4b, 0xe2, 0xdb, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x76, 0xf5, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x6c, 0xe2, 0xd8, 0xfd,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5a, 0xfe, 0x4b,
|
||||
0xe2, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0x32, 0xf4, 0x7e, 0xff, 0xbb, 0xfe, 0xee, 0xea, 0xea, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x4c, 0xe2, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0xfd, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x0b, 0xe2, 0x36, 0xf5, 0xdf,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0x39, 0xfe, 0xad, 0xea, 0xca, 0xe1, 0xea, 0xe1, 0x12, 0xf4, 0x5d, 0xff, 0xdb, 0xfe, 0x4f, 0xeb, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x2b, 0xe2, 0x9a, 0xfe, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x56, 0xf5, 0xea, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x2b, 0xe2, 0xd4, 0xf4, 0xbf, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0x19, 0xfe, 0xad, 0xea, 0x52, 0xf4, 0x9e, 0xff, 0xbb, 0xfe, 0x0e, 0xeb, 0xea, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0x12, 0xf4, 0xdf, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0xeb, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x2b, 0xe2, 0x15, 0xf5, 0xbf, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1d, 0xff, 0x9e, 0xff, 0xfc, 0xfe, 0x2e, 0xeb, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x2b, 0xe2, 0xb7, 0xfd,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0x56, 0xfd, 0x0b, 0xe2, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xcd, 0xea, 0xb7, 0xfd, 0xdf, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0xfd, 0x6c, 0xe2, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x8c,
|
||||
0xea, 0xd4, 0xf4, 0xfc, 0xfe, 0x9e, 0xff, 0x9e, 0xff, 0xdc, 0xfe, 0x73, 0xf4, 0x0b, 0xe2, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x0b, 0xe2, 0xb0, 0xeb, 0x9b, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x19, 0xfe, 0x4f, 0xeb, 0x2b,
|
||||
0xe2, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0x0b, 0xe2, 0x0e, 0xeb, 0xcd, 0xea, 0xea, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0x0b, 0xe2, 0xad, 0xea, 0x15, 0xf5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7e, 0xff,
|
||||
0xf9, 0xfd, 0x70, 0xeb, 0x2b, 0xe2, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca,
|
||||
0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xea, 0xe1, 0xad, 0xea, 0x56, 0xf5, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0x19, 0xfe, 0x52, 0xf4, 0x0e, 0xeb, 0x4c, 0xe2, 0xea, 0xe1, 0xea, 0xe1, 0xca, 0xe1,
|
||||
0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xca, 0xe1, 0xea, 0xe1, 0xea, 0xe1, 0x2b, 0xe2, 0xcd,
|
||||
0xea, 0xd1, 0xf3, 0x97, 0xfd, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x7e, 0xff, 0xfc, 0xfe, 0xf8, 0xfd, 0x73, 0xf4, 0x4f,
|
||||
0xeb, 0xad, 0xea, 0x8c, 0xea, 0x6c, 0xea, 0x8c, 0xea, 0xad, 0xea, 0x0e, 0xeb, 0x32, 0xf4, 0x97, 0xf5, 0xdb, 0xfe,
|
||||
0x5d, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xdf, 0xff, 0x9e, 0xff, 0x7e, 0xff, 0x9e, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x5d, 0xef, 0x3d, 0xef, 0x5d, 0xef, 0xdf, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbd, 0x2d, 0x6b, 0xec, 0x62, 0x0c, 0x63, 0xb7, 0xbd, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf,
|
||||
0xff, 0xbf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xbf,
|
||||
0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, 0xad, 0x8a, 0x5a, 0x6a, 0x52, 0x8a, 0x52, 0x55, 0xad, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9a, 0xd6, 0x55,
|
||||
0xad, 0xf4, 0xa4, 0xb3, 0x9c, 0x92, 0x94, 0x72, 0x94, 0x72, 0x94, 0x92, 0x94, 0xf3, 0xa4, 0xb6, 0xbd, 0xfb, 0xde,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x59, 0xce, 0xb3, 0x9c, 0x92, 0x94, 0x92,
|
||||
0x94, 0x55, 0xad, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7e, 0xf7, 0xb7, 0xbd, 0x92, 0x94,
|
||||
0xcf, 0x7b, 0xae, 0x7b, 0xaf, 0x7b, 0x10, 0x84, 0xd3, 0x9c, 0xf7, 0xbd, 0x7e, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x59, 0xce, 0xf4, 0xa4, 0x10, 0x8c, 0xaf, 0x7b,
|
||||
0x8e, 0x7b, 0xcf, 0x7b, 0x51, 0x8c, 0x35, 0xad, 0xba, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xa4, 0x8a, 0x52, 0x6a, 0x52, 0x8a, 0x52, 0x35, 0xad,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x9c,
|
||||
0x8a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0xab,
|
||||
0x5a, 0x51, 0x8c, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x9c, 0x6a, 0x52, 0x6a, 0x52,
|
||||
0x6a, 0x52, 0x2d, 0x6b, 0x9e, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xde, 0x8e, 0x73, 0x6a, 0x52, 0x6a,
|
||||
0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x8a, 0x52, 0xcb, 0x62, 0xf8, 0xc5, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xde, 0xcf, 0x7b, 0x8a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a,
|
||||
0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0xaa, 0x5a, 0x72, 0x94, 0xbe, 0xf7, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x9c, 0x8a, 0x52, 0x6a, 0x52, 0x8a, 0x52, 0x35,
|
||||
0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x72,
|
||||
0x94, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52,
|
||||
0x6a, 0x52, 0x8a, 0x52, 0x4d, 0x6b, 0xba, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x94, 0x6a, 0x52, 0x6a,
|
||||
0x52, 0x6a, 0x52, 0x2d, 0x6b, 0x7d, 0xef, 0xff, 0xff, 0xff, 0xff, 0x7a, 0xd6, 0x2c, 0x6b, 0x6a, 0x52, 0x6a, 0x52,
|
||||
0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x14, 0xa5, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x76, 0xb5, 0x0c, 0x63, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52,
|
||||
0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x8a, 0x5a, 0x3c, 0xe7, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x9c, 0x8a, 0x52, 0x6a, 0x52, 0x8a, 0x52,
|
||||
0x55, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0x30, 0x8c, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0xaa, 0x5a, 0xab, 0x5a, 0xab, 0x5a, 0x6a, 0x52, 0x6a,
|
||||
0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x51, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x71, 0x94, 0x6a, 0x52,
|
||||
0x6a, 0x52, 0x6a, 0x52, 0x0c, 0x6b, 0x5d, 0xef, 0xff, 0xff, 0xdf, 0xff, 0x31, 0x8c, 0x6a, 0x52, 0x6a, 0x52, 0x6a,
|
||||
0x52, 0x6a, 0x52, 0xcb, 0x62, 0x0c, 0x63, 0x0c, 0x63, 0xcb, 0x5a, 0x6a, 0x52, 0x6a, 0x52, 0xab, 0x5a, 0xdb, 0xde,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xc5, 0xcb, 0x62, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a,
|
||||
0x52, 0x6a, 0x52, 0x8a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x30, 0x8c, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x9c, 0x6a, 0x52, 0x6a, 0x52, 0x8a,
|
||||
0x5a, 0x55, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0x10, 0x84, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x8a, 0x5a, 0x75, 0xb5, 0x59, 0xce, 0x38, 0xc6, 0x14, 0xa5,
|
||||
0xcb, 0x5a, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x0c, 0x63, 0x7d, 0xef, 0xff, 0xff, 0xff, 0xff, 0x51, 0x8c, 0x6a,
|
||||
0x52, 0x6a, 0x52, 0x6a, 0x52, 0x0c, 0x6b, 0x3d, 0xef, 0xff, 0xff, 0x3d, 0xef, 0x0c, 0x63, 0x6a, 0x52, 0x6a, 0x52,
|
||||
0x6a, 0x52, 0xaf, 0x7b, 0x7a, 0xd6, 0x1c, 0xe7, 0xfc, 0xe6, 0x79, 0xce, 0x55, 0xad, 0x6d, 0x73, 0xf4, 0xa4, 0xdf,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xef, 0x6d, 0x73, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x8a, 0x52,
|
||||
0xcf, 0x83, 0x96, 0xb5, 0xf7, 0xbd, 0x76, 0xb5, 0x10, 0x84, 0xab, 0x5a, 0xcb, 0x62, 0xbb, 0xde, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x94, 0x6a, 0x52, 0x6a, 0x52,
|
||||
0x8a, 0x5a, 0x76, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5d, 0xef, 0x7a, 0xd6, 0xf8,
|
||||
0xc5, 0x18, 0xc6, 0x9a, 0xd6, 0x7d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xf7, 0xdb, 0xde,
|
||||
0x18, 0xc6, 0x96, 0xb5, 0xdb, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9a, 0xd6, 0xb7, 0xbd, 0x55, 0xad, 0x39,
|
||||
0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7a, 0xd6, 0x96, 0xb5, 0x59, 0xce, 0x3d, 0xef, 0xff, 0xff,
|
||||
0xff, 0xff, 0xf0, 0x83, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0xab, 0x5a, 0xdb, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0x14, 0xa5, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0xdb, 0xde, 0xff, 0xff, 0xff, 0xff, 0x51, 0x8c,
|
||||
0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x0c, 0x6b, 0x3d, 0xef, 0xff, 0xff, 0xbb, 0xde, 0xcb, 0x62, 0x6a, 0x52, 0x6a,
|
||||
0x52, 0x6a, 0x52, 0x34, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7e, 0xf7, 0xbe, 0xf7,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x14, 0xa5, 0x8a, 0x5a, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0xec, 0x62, 0x96,
|
||||
0xb5, 0x9e, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xba, 0xd6, 0xb7, 0xbd, 0xdf, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x94, 0x6a, 0x52, 0x6a,
|
||||
0x52, 0x8a, 0x5a, 0x96, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9e, 0xf7, 0x75, 0xad, 0x6e, 0x73, 0xcb, 0x5a,
|
||||
0xab, 0x5a, 0xab, 0x5a, 0xcb, 0x62, 0x8e, 0x7b, 0x96, 0xb5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0xbd, 0xec,
|
||||
0x62, 0xab, 0x5a, 0x8a, 0x5a, 0xb3, 0x9c, 0xdf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x10, 0x84, 0x8a, 0x5a, 0x8a, 0x52,
|
||||
0x4d, 0x73, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0x10, 0x84, 0x8a, 0x5a, 0xcb, 0x5a, 0x6e, 0x73, 0xdb,
|
||||
0xde, 0xff, 0xff, 0xf0, 0x83, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0xab, 0x5a, 0xdb, 0xde, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0x59, 0xce, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x59, 0xce, 0xff, 0xff, 0xff, 0xff, 0x51,
|
||||
0x8c, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x0c, 0x6b, 0x3d, 0xef, 0xff, 0xff, 0xfc, 0xe6, 0xeb, 0x62, 0x6a, 0x52,
|
||||
0x6a, 0x52, 0x6a, 0x52, 0xaf, 0x7b, 0x79, 0xce, 0x7e, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, 0xef, 0x8e, 0x73, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x8a, 0x52, 0x14, 0xa5,
|
||||
0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x72, 0x94, 0x6a, 0x52,
|
||||
0x6a, 0x52, 0x8a, 0x5a, 0x96, 0xb5, 0xff, 0xff, 0xff, 0xff, 0x9e, 0xf7, 0x72, 0x94, 0x8a, 0x5a, 0x6a, 0x52, 0x6a,
|
||||
0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0xab, 0x5a, 0x14, 0xa5, 0x9e, 0xf7, 0xff, 0xff, 0xff, 0xff, 0x39, 0xce,
|
||||
0xcb, 0x5a, 0x6a, 0x52, 0x6a, 0x52, 0x8e, 0x73, 0x7e, 0xf7, 0xff, 0xff, 0xff, 0xff, 0x35, 0xad, 0x6a, 0x52, 0x6a,
|
||||
0x52, 0x6a, 0x52, 0x9a, 0xd6, 0xff, 0xff, 0xff, 0xff, 0x1c, 0xe7, 0xeb, 0x62, 0x6a, 0x52, 0x6a, 0x52, 0x4d, 0x73,
|
||||
0x7d, 0xef, 0xdf, 0xff, 0xcf, 0x83, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0xab, 0x5a, 0xdb, 0xde, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0x96, 0xb5, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0xbb, 0xde, 0xff, 0xff, 0xff, 0xff,
|
||||
0x31, 0x8c, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x0c, 0x6b, 0x3c, 0xe7, 0xff, 0xff, 0x9e, 0xf7, 0x6e, 0x73, 0x6a,
|
||||
0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0xcb, 0x5a, 0x8e, 0x73, 0x92, 0x94, 0xf7, 0xbd, 0x3d, 0xef, 0xdf, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xde, 0xeb, 0x62, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x4d, 0x6b, 0x3c,
|
||||
0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x71, 0x94, 0x6a,
|
||||
0x52, 0x6a, 0x52, 0x8a, 0x5a, 0xb7, 0xbd, 0xff, 0xff, 0xdf, 0xff, 0xf3, 0xa4, 0x8a, 0x52, 0x6a, 0x52, 0x6a, 0x52,
|
||||
0x6a, 0x52, 0xab, 0x5a, 0xaa, 0x5a, 0xaa, 0x5a, 0x14, 0xa5, 0x7e, 0xf7, 0xd7, 0xbd, 0x96, 0xb5, 0xff, 0xff, 0x3d,
|
||||
0xef, 0x4d, 0x6b, 0x6a, 0x52, 0x6a, 0x52, 0xec, 0x62, 0xfc, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x9c, 0x6a, 0x52,
|
||||
0x6a, 0x52, 0x6a, 0x52, 0x71, 0x94, 0xff, 0xff, 0xff, 0xff, 0xd7, 0xbd, 0x8a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x71,
|
||||
0x94, 0xff, 0xff, 0xdf, 0xff, 0xcf, 0x7b, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x8a, 0x5a, 0xd7, 0xbd, 0xdb, 0xde,
|
||||
0x9a, 0xd6, 0x96, 0xb5, 0x2d, 0x6b, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x0c, 0x63, 0x7d, 0xf7, 0xff, 0xff, 0xff,
|
||||
0xff, 0x31, 0x8c, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x0c, 0x63, 0x3c, 0xe7, 0xff, 0xff, 0xff, 0xff, 0x35, 0xad,
|
||||
0x8a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0xab, 0x5a, 0x4d, 0x6b, 0xf3,
|
||||
0xa4, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0x79, 0xce, 0xab, 0x5a, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x51, 0x8c,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x51, 0x8c,
|
||||
0x6a, 0x52, 0x6a, 0x52, 0x8a, 0x5a, 0xf7, 0xbd, 0xff, 0xff, 0x3d, 0xef, 0x2d, 0x6b, 0x6a, 0x52, 0x6a, 0x52, 0xcb,
|
||||
0x62, 0xd3, 0x9c, 0x59, 0xce, 0x39, 0xce, 0x96, 0xb5, 0x9e, 0xf7, 0x18, 0xc6, 0xec, 0x62, 0x4d, 0x6b, 0x3c, 0xef,
|
||||
0xdf, 0xff, 0x31, 0x8c, 0x6a, 0x52, 0x6a, 0x52, 0xaa, 0x5a, 0x39, 0xce, 0xff, 0xff, 0x3d, 0xef, 0x0c, 0x6b, 0x6a,
|
||||
0x52, 0x6a, 0x52, 0x6a, 0x52, 0x2d, 0x6b, 0x9e, 0xf7, 0xff, 0xff, 0x92, 0x94, 0x6a, 0x52, 0x6a, 0x52, 0x8a, 0x52,
|
||||
0xb6, 0xbd, 0xff, 0xff, 0xbf, 0xff, 0xcf, 0x7b, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x8a,
|
||||
0x5a, 0x8a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x92, 0x94, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0x31, 0x8c, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x0c, 0x63, 0x3c, 0xe7, 0xff, 0xff, 0xff, 0xff, 0x7e,
|
||||
0xf7, 0x51, 0x8c, 0xcb, 0x5a, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52,
|
||||
0x6a, 0x52, 0xaf, 0x7b, 0x1c, 0xe7, 0xff, 0xff, 0x59, 0xce, 0xab, 0x5a, 0x6a, 0x52, 0x6a, 0x52, 0x8a, 0x52, 0xb3,
|
||||
0x9c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x71,
|
||||
0x94, 0x6a, 0x52, 0x6a, 0x52, 0xaa, 0x5a, 0x18, 0xc6, 0xff, 0xff, 0x59, 0xce, 0x8a, 0x5a, 0x6a, 0x52, 0x8a, 0x52,
|
||||
0x76, 0xb5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7a, 0xd6, 0xec, 0x62, 0x6a, 0x52, 0xab, 0x5a, 0x18,
|
||||
0xc6, 0xff, 0xff, 0x55, 0xad, 0x6a, 0x52, 0x6a, 0x52, 0x8a, 0x52, 0x14, 0xa5, 0xff, 0xff, 0xd7, 0xbd, 0x8a, 0x52,
|
||||
0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0xab, 0x5a, 0xdb, 0xde, 0x9e, 0xf7, 0x4d, 0x73, 0x6a, 0x52, 0x6a, 0x52, 0xab,
|
||||
0x5a, 0xfb, 0xde, 0xff, 0xff, 0xbf, 0xff, 0xaf, 0x7b, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52,
|
||||
0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x8a, 0x52, 0xef, 0x83, 0x1c, 0xe7, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0x31, 0x8c, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x0c, 0x6b, 0x3c, 0xe7, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0x9e, 0xf7, 0x18, 0xc6, 0x10, 0x84, 0x0c, 0x63, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a,
|
||||
0x52, 0x6a, 0x52, 0x6a, 0x52, 0x71, 0x94, 0xdf, 0xff, 0x9a, 0xd6, 0xab, 0x5a, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52,
|
||||
0x51, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0x71, 0x94, 0x6a, 0x52, 0x6a, 0x52, 0xaa, 0x5a, 0x39, 0xce, 0xff, 0xff, 0x75, 0xb5, 0x6a, 0x52, 0x6a, 0x52, 0xec,
|
||||
0x62, 0xbe, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xde, 0xec, 0x62, 0x6a, 0x52, 0x8a, 0x52,
|
||||
0x55, 0xad, 0xff, 0xff, 0x79, 0xce, 0x8a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0xcf, 0x7b, 0xbe, 0xf7, 0x31, 0x8c, 0x6a,
|
||||
0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x8a, 0x52, 0xf8, 0xc5, 0x7a, 0xd6, 0xcb, 0x5a, 0x6a, 0x52, 0x6a, 0x52,
|
||||
0x10, 0x84, 0xbe, 0xf7, 0xff, 0xff, 0xbf, 0xff, 0xaf, 0x7b, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0xaa,
|
||||
0x5a, 0x8a, 0x5a, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x71, 0x94, 0x9e, 0xf7, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0x51, 0x8c, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x0c, 0x6b, 0x3d, 0xef, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xdb, 0xde, 0xd7, 0xbd, 0x92, 0x94, 0x4d, 0x6b, 0x8a, 0x52,
|
||||
0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x2d, 0x6b, 0x5d, 0xef, 0xfb, 0xde, 0xec, 0x62, 0x6a, 0x52, 0x6a, 0x52, 0x6a,
|
||||
0x52, 0x6e, 0x73, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0x71, 0x94, 0x6a, 0x52, 0x6a, 0x52, 0xab, 0x5a, 0x59, 0xce, 0xff, 0xff, 0x75, 0xad, 0x6a, 0x52, 0x6a, 0x52,
|
||||
0x4d, 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, 0xef, 0x4d, 0x6b, 0x6a, 0x52, 0x8a,
|
||||
0x52, 0x35, 0xad, 0xff, 0xff, 0x5d, 0xef, 0x0c, 0x6b, 0x6a, 0x52, 0x6a, 0x52, 0x0c, 0x63, 0x59, 0xce, 0xec, 0x62,
|
||||
0x6a, 0x52, 0x8a, 0x5a, 0x6e, 0x73, 0x6a, 0x52, 0x6a, 0x52, 0xf3, 0xa4, 0xf3, 0xa4, 0x8a, 0x52, 0x6a, 0x52, 0xaa,
|
||||
0x5a, 0x18, 0xc6, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xff, 0xaf, 0x7b, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x0c, 0x6b,
|
||||
0x96, 0xb5, 0x14, 0xa5, 0xab, 0x5a, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0xef, 0x83, 0xbf, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0x51, 0x8c, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x0c, 0x6b, 0x3d, 0xef, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x3c, 0xe7, 0x6e,
|
||||
0x73, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0xeb, 0x62, 0xdb, 0xde, 0x7d, 0xef, 0x8e, 0x73, 0x6a, 0x52, 0x6a, 0x52,
|
||||
0x6a, 0x52, 0x8a, 0x52, 0x96, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0x71, 0x94, 0x6a, 0x52, 0x6a, 0x52, 0xab, 0x5a, 0x9a, 0xd6, 0xff, 0xff, 0x38, 0xce, 0x8a, 0x52, 0x6a,
|
||||
0x52, 0xab, 0x5a, 0x1c, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x59, 0xce, 0xcb, 0x5a, 0x6a, 0x52,
|
||||
0x8a, 0x5a, 0xb6, 0xbd, 0xff, 0xff, 0xdf, 0xff, 0xb3, 0x9c, 0x6a, 0x52, 0x6a, 0x52, 0xaa, 0x5a, 0xcf, 0x7b, 0x8a,
|
||||
0x52, 0x6a, 0x52, 0xae, 0x7b, 0x39, 0xce, 0x8a, 0x52, 0x6a, 0x52, 0x4d, 0x6b, 0x0c, 0x63, 0x6a, 0x52, 0x6a, 0x52,
|
||||
0x6d, 0x73, 0x7e, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xf7, 0xaf, 0x7b, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x8e,
|
||||
0x73, 0xbe, 0xf7, 0xdf, 0xff, 0x72, 0x94, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x8a, 0x5a, 0xf4, 0xa4, 0xdf, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x71, 0x94, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x2c, 0x6b, 0x5d, 0xef, 0xff,
|
||||
0xff, 0xff, 0xff, 0x59, 0xce, 0xb2, 0x9c, 0x9a, 0xd6, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff,
|
||||
0x10, 0x84, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0xec, 0x62, 0xfb, 0xde, 0xff, 0xff, 0xd3, 0x9c, 0x8a, 0x52, 0x6a,
|
||||
0x52, 0x6a, 0x52, 0x6a, 0x52, 0x4d, 0x6b, 0x39, 0xce, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x5d, 0xef,
|
||||
0x76, 0xb5, 0x14, 0xa5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0x71, 0x94, 0x6a, 0x52, 0x6a, 0x52, 0xab, 0x5a, 0xba, 0xde, 0xff, 0xff, 0xfc, 0xe6, 0xec, 0x62,
|
||||
0x6a, 0x52, 0x6a, 0x52, 0x30, 0x8c, 0x3c, 0xe7, 0xdf, 0xff, 0xdf, 0xff, 0x1c, 0xe7, 0xf0, 0x83, 0x6a, 0x52, 0x6a,
|
||||
0x52, 0xec, 0x62, 0xbb, 0xde, 0xff, 0xff, 0xff, 0xff, 0x39, 0xce, 0xcb, 0x5a, 0x6a, 0x52, 0x6a, 0x52, 0x8a, 0x52,
|
||||
0x6a, 0x52, 0x8a, 0x52, 0x14, 0xa5, 0x9e, 0xf7, 0x0c, 0x63, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a,
|
||||
0x52, 0x92, 0x94, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xf7, 0xaf, 0x7b, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52,
|
||||
0x8e, 0x7b, 0xbe, 0xf7, 0xff, 0xff, 0x3c, 0xe7, 0x4d, 0x6b, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x8a, 0x52, 0xf8,
|
||||
0xc5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x72, 0x94, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x2c, 0x6b, 0x5d, 0xef,
|
||||
0xff, 0xff, 0xdf, 0xff, 0x51, 0x8c, 0x8a, 0x52, 0xec, 0x62, 0x31, 0x8c, 0xb6, 0xbd, 0x59, 0xce, 0x38, 0xce, 0xf4,
|
||||
0xa4, 0xcb, 0x5a, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6e, 0x73, 0x7e, 0xf7, 0xff, 0xff, 0xdb, 0xde, 0x0c, 0x6b,
|
||||
0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0xcb, 0x62, 0x31, 0x8c, 0x75, 0xb5, 0x96, 0xb5, 0xd3, 0x9c, 0x6e,
|
||||
0x73, 0x8a, 0x5a, 0xcb, 0x62, 0x9a, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0x72, 0x94, 0x6a, 0x52, 0x6a, 0x52, 0xab, 0x5a, 0xdb, 0xde, 0xff, 0xff, 0xbf, 0xff, 0x10,
|
||||
0x84, 0x6a, 0x52, 0x6a, 0x52, 0x8a, 0x52, 0x4d, 0x6b, 0x92, 0x94, 0x72, 0x94, 0x2d, 0x6b, 0x8a, 0x52, 0x6a, 0x52,
|
||||
0x6a, 0x52, 0x72, 0x94, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5d, 0xef, 0x4d, 0x6b, 0x6a, 0x52, 0x6a, 0x52, 0x6a,
|
||||
0x52, 0x6a, 0x52, 0xcb, 0x5a, 0x9a, 0xd6, 0xdf, 0xff, 0xf0, 0x83, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52,
|
||||
0x8a, 0x5a, 0xf8, 0xc5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xf7, 0xaf, 0x7b, 0x6a, 0x52, 0x6a, 0x52, 0x6a,
|
||||
0x52, 0xae, 0x7b, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x59, 0xce, 0xcb, 0x62, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52,
|
||||
0x8e, 0x73, 0x7e, 0xf7, 0xff, 0xff, 0xff, 0xff, 0x92, 0x94, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x2d, 0x6b, 0x7d,
|
||||
0xef, 0xff, 0xff, 0x3c, 0xe7, 0x0c, 0x6b, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x8a, 0x52, 0xaa, 0x5a, 0x8a, 0x5a,
|
||||
0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x8a, 0x52, 0xf4, 0xa4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x14,
|
||||
0xa5, 0xaa, 0x5a, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52,
|
||||
0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x8e, 0x73, 0xbe, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x94, 0x6a, 0x52, 0x6a, 0x52, 0xab, 0x5a, 0xfc, 0xe6, 0xff, 0xff, 0xff, 0xff,
|
||||
0xdb, 0xde, 0x4d, 0x6b, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a,
|
||||
0x52, 0xaf, 0x7b, 0x1c, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x30, 0x8c, 0x6a, 0x52, 0x6a, 0x52,
|
||||
0x6a, 0x52, 0x6a, 0x52, 0xaf, 0x7b, 0xbf, 0xff, 0xff, 0xff, 0xf3, 0xa4, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a,
|
||||
0x52, 0x2d, 0x6b, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xaf, 0x7b, 0x6a, 0x52, 0x6a, 0x52,
|
||||
0x6a, 0x52, 0xaf, 0x7b, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xa4, 0x6a, 0x52, 0x6a, 0x52, 0x6a,
|
||||
0x52, 0x8a, 0x52, 0x72, 0x94, 0xdf, 0xff, 0xff, 0xff, 0x92, 0x94, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x2d, 0x6b,
|
||||
0x9e, 0xf7, 0xff, 0xff, 0xba, 0xd6, 0x0c, 0x6b, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a,
|
||||
0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x8a, 0x5a, 0x71, 0x94, 0x7d, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0x7e, 0xf7, 0x72, 0x94, 0x8a, 0x5a, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a,
|
||||
0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0xec, 0x62, 0xfb, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x9c, 0x8a, 0x52, 0x8a, 0x52, 0xcb, 0x5a, 0x1c, 0xe7, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0x1c, 0xe7, 0xcf, 0x83, 0xcb, 0x5a, 0x8a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x8a, 0x52, 0xeb, 0x62,
|
||||
0x10, 0x8c, 0x1c, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x35, 0xad, 0x8a, 0x52, 0x8a,
|
||||
0x52, 0x6a, 0x52, 0xab, 0x5a, 0xf7, 0xc5, 0xff, 0xff, 0xff, 0xff, 0x38, 0xce, 0x8a, 0x5a, 0x8a, 0x52, 0x6a, 0x52,
|
||||
0x8a, 0x52, 0xf4, 0xa4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xcf, 0x83, 0x8a, 0x52, 0x8a,
|
||||
0x52, 0x8a, 0x52, 0xf0, 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, 0xef, 0x4d, 0x6b, 0x6a, 0x52,
|
||||
0x8a, 0x5a, 0x2c, 0x6b, 0x92, 0x94, 0x9e, 0xf7, 0xff, 0xff, 0xb2, 0x9c, 0x8a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x4d,
|
||||
0x6b, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9a, 0xd6, 0x31, 0x8c, 0x2d, 0x6b, 0xcb, 0x5a, 0x8a, 0x5a, 0x8a, 0x52,
|
||||
0x8a, 0x52, 0x8a, 0x5a, 0xcb, 0x62, 0x4d, 0x73, 0x14, 0xa5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xbf, 0xff, 0xf4, 0xa4, 0x0c, 0x6b, 0x8a, 0x5a, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52, 0x6a, 0x52,
|
||||
0x6a, 0x52, 0x8a, 0x52, 0xcb, 0x62, 0xcf, 0x7b, 0xdb, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9a, 0xd6, 0x55, 0xad, 0x35, 0xad, 0x35, 0xad, 0x9e, 0xf7, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9e, 0xf7, 0x9a, 0xd6, 0x96, 0xb5, 0xb3, 0x9c, 0xd3, 0x9c, 0xb7, 0xbd, 0xdb,
|
||||
0xde, 0xbe, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xef, 0x96, 0xb5,
|
||||
0xf4, 0xa4, 0x92, 0x9c, 0x14, 0xa5, 0xbe, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xf7, 0xc5, 0x34, 0xad, 0xb3,
|
||||
0x9c, 0xd3, 0x9c, 0x1c, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x59, 0xce, 0x96, 0xb5,
|
||||
0xb7, 0xbd, 0x18, 0xc6, 0xbb, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xde, 0x51,
|
||||
0x8c, 0xf8, 0xc5, 0x1c, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x79, 0xd6, 0xf3, 0xa4, 0x92, 0x94, 0xb3, 0x9c,
|
||||
0x96, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x5d, 0xef, 0xba, 0xde, 0x39, 0xce, 0xd7,
|
||||
0xbd, 0xd7, 0xbd, 0x39, 0xce, 0xbb, 0xde, 0x7d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x1c, 0xe7, 0xd7, 0xbd, 0x51, 0x8c, 0x4d, 0x6b, 0xeb, 0x62, 0x2d,
|
||||
0x6b, 0x10, 0x84, 0x75, 0xb5, 0xba, 0xd6, 0x9e, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff,
|
||||
};
|
||||
@@ -0,0 +1,178 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#include "core/lucida_console_10pt.h"
|
||||
#include "demo_system.h"
|
||||
#include "fractal.h"
|
||||
#include "gpio.h"
|
||||
#include "lcd.h"
|
||||
#include "lowrisc_logo.h"
|
||||
#include "spi.h"
|
||||
#include "st7735/lcd_st7735.h"
|
||||
#include "timer.h"
|
||||
|
||||
// Constants.
|
||||
enum {
|
||||
// Pin out mapping.
|
||||
LcdCsPin = 0,
|
||||
LcdRstPin,
|
||||
LcdDcPin,
|
||||
LcdBlPin,
|
||||
LcdMosiPin,
|
||||
LcdSclkPin,
|
||||
// Spi clock rate.
|
||||
SpiSpeedHz = 5 * 100 * 1000,
|
||||
};
|
||||
|
||||
// Buttons
|
||||
typedef enum {
|
||||
BTN0 = 0b0001,
|
||||
BTN1 = 0b0010,
|
||||
BTN2 = 0b0100,
|
||||
BTN3 = 0b1000,
|
||||
} Buttons_t;
|
||||
|
||||
// Local functions declaration.
|
||||
static uint32_t spi_write(void *handle, uint8_t *data, size_t len);
|
||||
static uint32_t gpio_write(void *handle, bool cs, bool dc);
|
||||
static void timer_delay(uint32_t ms);
|
||||
static void fractal_test(St7735Context *lcd);
|
||||
static Buttons_t scan_buttons(uint32_t timeout, Buttons_t def);
|
||||
|
||||
int main(void) {
|
||||
timer_init();
|
||||
|
||||
// Set the initial state of the LCD control pins.
|
||||
set_output_bit(GPIO_OUT, LcdDcPin, 0x0);
|
||||
set_output_bit(GPIO_OUT, LcdBlPin, 0x1);
|
||||
set_output_bit(GPIO_OUT, LcdCsPin, 0x0);
|
||||
|
||||
// Init spi driver.
|
||||
spi_t spi;
|
||||
spi_init(&spi, DEFAULT_SPI, SpiSpeedHz);
|
||||
|
||||
// Reset LCD.
|
||||
set_output_bit(GPIO_OUT, LcdRstPin, 0x0);
|
||||
timer_delay(150);
|
||||
set_output_bit(GPIO_OUT, LcdRstPin, 0x1);
|
||||
|
||||
// Init LCD driver and set the SPI driver.
|
||||
St7735Context lcd;
|
||||
LCD_Interface interface = {
|
||||
.handle = &spi, // SPI handle.
|
||||
.spi_write = spi_write, // SPI write callback.
|
||||
.gpio_write = gpio_write, // GPIO write callback.
|
||||
.timer_delay = timer_delay, // Timer delay callback.
|
||||
};
|
||||
lcd_st7735_init(&lcd, &interface);
|
||||
|
||||
// Set the LCD orientation.
|
||||
lcd_st7735_set_orientation(&lcd, LCD_Rotate180);
|
||||
|
||||
// Setup text font bitmaps to be used and the colors.
|
||||
lcd_st7735_set_font(&lcd, &lucidaConsole_10ptFont);
|
||||
lcd_st7735_set_font_colors(&lcd, BGRColorWhite, BGRColorBlack);
|
||||
|
||||
// Clean display with a white rectangle.
|
||||
lcd_st7735_clean(&lcd);
|
||||
|
||||
// Draw the splash screen with a RGB 565 bitmap and text in the bottom.
|
||||
lcd_st7735_draw_rgb565(&lcd, (LCD_rectangle){.origin = {.x = (160 - 105) / 2, .y = 5}, .width = 105, .height = 80},
|
||||
(uint8_t *)lowrisc_logo_105x80);
|
||||
lcd_println(&lcd, "Booting...", alined_center, 7);
|
||||
timer_delay(1000);
|
||||
|
||||
do {
|
||||
lcd_st7735_clean(&lcd);
|
||||
|
||||
// Show the main menu.
|
||||
const char *items[] = {
|
||||
"0. Fractal",
|
||||
"1. Custom",
|
||||
};
|
||||
Menu_t main_menu = {
|
||||
.title = "Main menu",
|
||||
.color = BGRColorBlue,
|
||||
.selected_color = BGRColorRed,
|
||||
.background = BGRColorWhite,
|
||||
.items_count = sizeof(items) / sizeof(items[0]),
|
||||
.items = items,
|
||||
};
|
||||
lcd_show_menu(&lcd, &main_menu);
|
||||
lcd_st7735_puts(&lcd, (LCD_Point){.x = 5, .y = 106}, "Defaulting to item");
|
||||
lcd_st7735_puts(&lcd, (LCD_Point){.x = 5, .y = 118}, "0 after 3 seconds");
|
||||
|
||||
switch (scan_buttons(3000, BTN0)) {
|
||||
case BTN0:
|
||||
// Run the fractal examples.
|
||||
fractal_test(&lcd);
|
||||
break;
|
||||
case BTN1:
|
||||
lcd_st7735_puts(&lcd, (LCD_Point){.x = 5, .y = 80}, "Button 1 pressed");
|
||||
timer_delay(1000);
|
||||
break;
|
||||
case BTN2:
|
||||
break;
|
||||
case BTN3:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} while (1);
|
||||
}
|
||||
|
||||
static Buttons_t scan_buttons(uint32_t timeout, Buttons_t def) {
|
||||
do {
|
||||
// Sample buttons (debounced).
|
||||
const uint32_t in_val = read_gpio(GPIO_IN_DBNC) & 0xf;
|
||||
if (in_val == 0) {
|
||||
// No button pressed, so delay for 20ms and then try again, unless the timeout is reached.
|
||||
const uint32_t poll_delay = 20;
|
||||
timer_delay(poll_delay);
|
||||
if (timeout < poll_delay) {
|
||||
// Timeout reached, return default button.
|
||||
return def;
|
||||
} else {
|
||||
// Timeout not reached yet, decrease it and try again.
|
||||
timeout -= poll_delay;
|
||||
}
|
||||
} else {
|
||||
// Some button pressed, return the sampled value.
|
||||
return (Buttons_t)in_val;
|
||||
}
|
||||
} while (1);
|
||||
}
|
||||
|
||||
static void fractal_test(St7735Context *lcd) {
|
||||
fractal_mandelbrot_float(lcd);
|
||||
timer_delay(5000);
|
||||
fractal_mandelbrot_fixed(lcd);
|
||||
timer_delay(5000);
|
||||
}
|
||||
|
||||
static uint32_t spi_write(void *handle, uint8_t *data, size_t len) {
|
||||
const uint32_t data_sent = len;
|
||||
while (len--) {
|
||||
spi_send_byte_blocking(handle, *data++);
|
||||
}
|
||||
while ((spi_get_status(handle) & spi_status_fifo_empty) != spi_status_fifo_empty)
|
||||
;
|
||||
return data_sent;
|
||||
}
|
||||
|
||||
static uint32_t gpio_write(void *handle, bool cs, bool dc) {
|
||||
set_output_bit(GPIO_OUT, LcdDcPin, dc);
|
||||
set_output_bit(GPIO_OUT, LcdCsPin, cs);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void timer_delay(uint32_t ms) {
|
||||
// Configure timer to trigger every 1 ms
|
||||
timer_enable(50000);
|
||||
uint32_t timeout = get_elapsed_time() + ms;
|
||||
while (get_elapsed_time() < timeout) {
|
||||
asm volatile("wfi");
|
||||
}
|
||||
timer_disable();
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
add_definitions(-DTINYAES128C -DSS_VER=1 -DHAL_TYPE=HAL_ibex)
|
||||
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../../vendor/newae/crypto)
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../../vendor/newae/hal)
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../../vendor/newae/simpleserial)
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../../vendor/newae/crypto/tiny-AES128-C)
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../common)
|
||||
|
||||
add_library(simpleserial
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../vendor/newae/simpleserial/simpleserial.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../vendor/newae/hal/ibex/ibex_hal.c
|
||||
)
|
||||
|
||||
add_library(tiny-AES128
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../vendor/newae/crypto/aes-independant.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../../../vendor/newae/crypto/tiny-AES128-C/aes.c
|
||||
)
|
||||
|
||||
add_executable(simpleserial-aes ${CMAKE_CURRENT_SOURCE_DIR}/../../../../vendor/newae/simpleserial-aes/simpleserial-aes.c)
|
||||
|
||||
target_link_libraries(simpleserial-aes common simpleserial tiny-AES128)
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
ChipWhisperer simpleserial-aes application, intended to be run on a
|
||||
ChipWhisperer FPGA target (synth_cw305 or synth_cw312a35 targets).
|
||||
|
||||
This can then be used with any of the NewAE Jupyter-based courses
|
||||
(https://github.com/newaetech/chipwhisperer-jupyter/tree/master/courses)
|
||||
which use simpleserial-aes, with modifications to the target clock and baud
|
||||
rate:
|
||||
scope.clock.adc_mul = 1 # if using CW-Husky
|
||||
scope.clock.adc_src = 'clkgen_x1' # if using CW-lite/pro
|
||||
scope.clock.clkgen_freq = 100e6
|
||||
target.baud = 115200
|
||||
|
||||
Note that this application (and many others!) can also be built in the
|
||||
ChipWhisperer repository:
|
||||
https://github.com/newaetech/chipwhisperer/tree/develop/hardware/victims/firmware/simpleserial-aes
|
||||
using:
|
||||
make PLATFORM=CW305_IBEX CRYPTO_TARGET=TINYAES128C
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
set(LINKER_SCRIPT "${CMAKE_CURRENT_LIST_DIR}/../common/link.ld")
|
||||
set(CMAKE_SYSTEM_NAME Generic)
|
||||
set(CMAKE_C_COMPILER riscv32-unknown-elf-gcc)
|
||||
set(CMAKE_C_FLAGS_INIT
|
||||
"-march=rv32imc -mabi=ilp32 -mcmodel=medany -Wall -fvisibility=hidden -ffreestanding")
|
||||
set(CMAKE_ASM_FLAGS_INIT "-march=rv32imc")
|
||||
set(CMAKE_EXE_LINKER_FLAGS_INIT "-nostartfiles -T \"${LINKER_SCRIPT}\"")
|
||||
@@ -0,0 +1,113 @@
|
||||
/* Copyright lowRISC contributors.
|
||||
Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
SPDX-License-Identifier: Apache-2.0 */
|
||||
|
||||
OUTPUT_ARCH(riscv)
|
||||
|
||||
MEMORY
|
||||
{
|
||||
/* 60 KiB should be enough for anybody... */
|
||||
ram : ORIGIN = 0x00100000, LENGTH = 0xE000 /* 56 KiB */
|
||||
stack : ORIGIN = 0x0010E000, LENGTH = 0x2000 /* 4 KiB */
|
||||
|
||||
}
|
||||
|
||||
/* Stack information variables */
|
||||
_min_stack = 0x1000; /* 4K - minimum stack space to reserve */
|
||||
_stack_len = LENGTH(stack);
|
||||
_stack_start = ORIGIN(stack) + LENGTH(stack);
|
||||
|
||||
_entry_point = _vectors_start + 0x80;
|
||||
ENTRY(_entry_point)
|
||||
|
||||
/* Rust dependency */
|
||||
PROVIDE(_stext = ORIGIN(ram));
|
||||
PROVIDE(_stack_start = ORIGIN(stack) + LENGTH(stack));
|
||||
PROVIDE(_max_hart_id = 0);
|
||||
PROVIDE(_hart_stack_size = LENGTH(stack));
|
||||
PROVIDE(_heap_size = 0);
|
||||
PROVIDE(UserSoft = DefaultHandler);
|
||||
PROVIDE(SupervisorSoft = DefaultHandler);
|
||||
PROVIDE(MachineSoft = DefaultHandler);
|
||||
PROVIDE(UserTimer = DefaultHandler);
|
||||
PROVIDE(SupervisorTimer = DefaultHandler);
|
||||
PROVIDE(MachineTimer = DefaultHandler);
|
||||
PROVIDE(UserExternal = DefaultHandler);
|
||||
PROVIDE(SupervisorExternal = DefaultHandler);
|
||||
PROVIDE(MachineExternal = DefaultHandler);
|
||||
PROVIDE(DefaultHandler = DefaultInterruptHandler);
|
||||
PROVIDE(ExceptionHandler = DefaultExceptionHandler);
|
||||
PROVIDE(__pre_init = default_pre_init);
|
||||
PROVIDE(_mp_hook = default_mp_hook);
|
||||
PROVIDE(_start_trap = default_start_trap);
|
||||
PROVIDE(_setup_interrupts = default_setup_interrupts);
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
.text : {
|
||||
. = ALIGN(4);
|
||||
|
||||
_vectors_start = .;
|
||||
KEEP(*(.vectors))
|
||||
_vectors_end = .;
|
||||
|
||||
/* Rust dependency */
|
||||
KEEP(*(.init));
|
||||
KEEP(*(.init.rust));
|
||||
|
||||
*(.text)
|
||||
*(.text.*)
|
||||
. = ALIGN(4);
|
||||
} > ram
|
||||
|
||||
.rodata : {
|
||||
. = ALIGN(4);
|
||||
/* Small RO data before large RO data */
|
||||
*(.srodata)
|
||||
*(.srodata.*)
|
||||
*(.rodata);
|
||||
*(.rodata.*)
|
||||
. = ALIGN(4);
|
||||
} > ram
|
||||
|
||||
.data : {
|
||||
. = ALIGN(4);
|
||||
_sidata = LOADADDR(.data);
|
||||
_sdata = .;
|
||||
|
||||
/* Small data before large data */
|
||||
*(.sdata)
|
||||
*(.sdata.*)
|
||||
*(.data);
|
||||
*(.data.*)
|
||||
. = ALIGN(4);
|
||||
_edata = .;
|
||||
} > ram
|
||||
|
||||
.bss :
|
||||
{
|
||||
. = ALIGN(4);
|
||||
_bss_start = .;
|
||||
/* Small BSS before large BSS */
|
||||
*(.sbss)
|
||||
*(.sbss.*)
|
||||
*(.bss)
|
||||
*(.bss.*)
|
||||
*(COMMON)
|
||||
_bss_end = .;
|
||||
. = ALIGN(4);
|
||||
} > ram
|
||||
/* Rust dependency */
|
||||
_sbss = _bss_start;
|
||||
_ebss = _bss_end;
|
||||
|
||||
/* ensure there is enough room for stack */
|
||||
.stack (NOLOAD): {
|
||||
. = ALIGN(4);
|
||||
. = . + _min_stack ;
|
||||
. = ALIGN(4);
|
||||
stack = . ;
|
||||
_stack = . ;
|
||||
} > stack
|
||||
}
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
# Copyright lowRISC contributors.
|
||||
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
[build]
|
||||
target = "riscv32imc-unknown-none-elf"
|
||||
|
||||
[target.riscv32imc-unknown-none-elf]
|
||||
runner = "../../util/load_demo_system.sh run"
|
||||
rustflags = [
|
||||
"-C", "link-arg=-T../common/link.ld",
|
||||
]
|
||||
|
||||
[unstable]
|
||||
build-std = ["core"]
|
||||
|
||||
+1128
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,17 @@
|
||||
# Copyright lowRISC contributors.
|
||||
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
[workspace]
|
||||
members = [
|
||||
"ibex-demo-system-pac",
|
||||
"ibex-demo-system-hal",
|
||||
"demo/hello_world",
|
||||
"demo/led",
|
||||
"demo/led_hal",
|
||||
"demo/lcd_hal",
|
||||
"demo/pwm_hal",
|
||||
]
|
||||
|
||||
[profile.release]
|
||||
debug = true
|
||||
@@ -0,0 +1,15 @@
|
||||
# Ibex Rust stack
|
||||
This a embedded Rust software stack for whom is enthusiast about Rust, embedded systems, RISC-V and open source.
|
||||
|
||||
## Installation
|
||||
Install Rust:<https://www.rust-lang.org/tools/install>.
|
||||
|
||||
## Demos application
|
||||
- [Hello world](demo/hello_world/README.md)
|
||||
- [LED](demo/led/README.md)
|
||||
|
||||
## Running on the ARTY A7 FPGA
|
||||
Before running, you need to build and load the bitstream to the board as described [here](../../README.md#building-fpga-bitstream).
|
||||
```
|
||||
cargo run --bin led
|
||||
```
|
||||
@@ -0,0 +1,7 @@
|
||||
# Copyright lowRISC contributors.
|
||||
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
[target.riscv32imc-unknown-none-elf]
|
||||
runner = "riscv32-unknown-elf-gdb -q -x gdb_init"
|
||||
|
||||
@@ -0,0 +1,217 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "aho-corasick"
|
||||
version = "0.7.20"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bare-metal"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f8fe8f5a8a398345e52358e18ff07cc17a568fbca5c6f73873d3a62056309603"
|
||||
|
||||
[[package]]
|
||||
name = "bit_field"
|
||||
version = "0.10.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dcb6dd1c2376d2e096796e234a70e17e94cc2d5d54ff8ce42b28cef1d0d359a4"
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||
|
||||
[[package]]
|
||||
name = "critical-section"
|
||||
version = "1.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6548a0ad5d2549e111e1f6a11a6c2e2d00ce6a3dafe22948d67c2b443f775e52"
|
||||
|
||||
[[package]]
|
||||
name = "embedded-hal"
|
||||
version = "0.2.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "35949884794ad573cf46071e41c9b60efb0cb311e3ca01f7af807af1debc66ff"
|
||||
dependencies = [
|
||||
"nb 0.1.3",
|
||||
"void",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hello_world"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"panic-halt",
|
||||
"riscv 0.10.1",
|
||||
"riscv-rt",
|
||||
"riscv-semihosting",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lazy_static"
|
||||
version = "1.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
|
||||
|
||||
[[package]]
|
||||
name = "nb"
|
||||
version = "0.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "801d31da0513b6ec5214e9bf433a77966320625a37860f910be265be6e18d06f"
|
||||
dependencies = [
|
||||
"nb 1.0.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nb"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "546c37ac5d9e56f55e73b677106873d9d9f5190605e41a856503623648488cae"
|
||||
|
||||
[[package]]
|
||||
name = "panic-halt"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "de96540e0ebde571dc55c73d60ef407c653844e6f9a1e2fdbd40c07b9252d812"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.50"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "r0"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bd7a31eed1591dcbc95d92ad7161908e72f4677f8fabf2a32ca49b4237cbf211"
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.7.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
"regex-syntax",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex-syntax"
|
||||
version = "0.6.28"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
|
||||
|
||||
[[package]]
|
||||
name = "riscv"
|
||||
version = "0.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5e2856a701069e2d262b264750d382407d272d5527f7a51d3777d1805b4e2d3c"
|
||||
dependencies = [
|
||||
"bare-metal",
|
||||
"bit_field",
|
||||
"embedded-hal",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "riscv"
|
||||
version = "0.10.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "aa3145d2fae3778b1e31ec2e827b228bdc6abd9b74bb5705ba46dcb82069bc4f"
|
||||
dependencies = [
|
||||
"bit_field",
|
||||
"critical-section",
|
||||
"embedded-hal",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "riscv-rt"
|
||||
version = "0.11.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "102c52c89defde24dedf9ac077cc69df77b85aa2400dd2d5aad6eea6a6a5c089"
|
||||
dependencies = [
|
||||
"r0",
|
||||
"riscv 0.10.1",
|
||||
"riscv-rt-macros",
|
||||
"riscv-target",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "riscv-rt-macros"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f38509d7b17c2f604ceab3e5ff8ac97bb8cd2f544688c512be75c715edaf4daf"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "riscv-semihosting"
|
||||
version = "0.0.1"
|
||||
source = "git+https://github.com/riscv-rust/riscv-semihosting?branch=master#6e355849a5d4b73506ee17f6c178358fc1e26853"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"riscv 0.8.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "riscv-target"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "88aa938cda42a0cf62a20cfe8d139ff1af20c2e681212b5b34adb5a58333f222"
|
||||
dependencies = [
|
||||
"lazy_static",
|
||||
"regex",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.107"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc"
|
||||
|
||||
[[package]]
|
||||
name = "void"
|
||||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
|
||||
@@ -0,0 +1,16 @@
|
||||
# Copyright lowRISC contributors.
|
||||
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
[package]
|
||||
name = "hello_world"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
panic-halt = "0.2.0"
|
||||
riscv = "0.10"
|
||||
riscv-rt = "0.11.0"
|
||||
riscv-semihosting = {git="https://github.com/riscv-rust/riscv-semihosting", branch="master", features=["user-mode"]}
|
||||
@@ -0,0 +1,26 @@
|
||||
# Hello world
|
||||
|
||||
This demo prints a `Hello world` string to the JTAG semihosting interface.
|
||||
|
||||
How to run this demo:
|
||||
1. Build and load a [IBEX bitstream](../../../README.md#Building-FPGA-bitstream)
|
||||
2. Build and load the demo with `cargo run`.
|
||||
3. Connect [openocd](../../../README.md#Debugging-an-application)
|
||||
4. Run the gdb:
|
||||
|
||||
```console
|
||||
$ riscv32-unknown-elf-gdb ../../target/riscv32imc-unknown-none-elf/debug/led
|
||||
|
||||
(gdb) # Connect to OpenOCD
|
||||
(gdb) target remote :3333
|
||||
|
||||
(gdb) # Enable OpenOCD's semihosting support
|
||||
(gdb) monitor arm semihosting enable
|
||||
|
||||
(gdb) # Flash the program
|
||||
(gdb) load
|
||||
|
||||
(gdb) # Run the program
|
||||
(gdb) continue
|
||||
```
|
||||
The log will show up on the openocd console (Step 3).
|
||||
@@ -0,0 +1,27 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#![no_std]
|
||||
#![no_main]
|
||||
|
||||
extern crate panic_halt;
|
||||
extern crate riscv_rt;
|
||||
|
||||
use core::fmt::Write;
|
||||
use riscv_semihosting::hio;
|
||||
|
||||
use riscv_rt::entry;
|
||||
|
||||
#[entry]
|
||||
fn main() -> ! {
|
||||
// do something here
|
||||
jtag_print("Hello world!").unwrap();
|
||||
loop {}
|
||||
}
|
||||
|
||||
fn jtag_print(msg: &str) -> Result<(), core::fmt::Error> {
|
||||
let mut stdout = hio::hstdout().map_err(|_| core::fmt::Error)?;
|
||||
writeln!(stdout, "{}", msg)?;
|
||||
Ok(())
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
# Copyright lowRISC contributors.
|
||||
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
[target.riscv32imc-unknown-none-elf]
|
||||
runner = "riscv32-unknown-elf-gdb -q -x gdb_init"
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
# Copyright lowRISC contributors.
|
||||
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
[package]
|
||||
name = "lcd_hal"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
embedded-graphics = "0.8.0"
|
||||
st7735-lcd = "0.9.0"
|
||||
panic-halt = "0.2.0"
|
||||
riscv = {version = "0.10.1", features = ["critical-section-single-hart"]}
|
||||
riscv-rt = "0.11.0"
|
||||
ibex-demo-system-hal = {path = "../../ibex-demo-system-hal"}
|
||||
embedded-hal = "0.2.7"
|
||||
tinybmp = "0.5.0"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user