Adding files
This commit is contained in:
@@ -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"
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,72 @@
|
||||
// Copyright lowRISC contributors.
|
||||
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#![no_main]
|
||||
#![no_std]
|
||||
|
||||
extern crate panic_halt as _;
|
||||
|
||||
use riscv::delay::McycleDelay;
|
||||
use riscv_rt::entry;
|
||||
|
||||
use embedded_graphics::{
|
||||
image::{Image, ImageRaw, ImageRawLE},
|
||||
mono_font::{ascii::FONT_6X10, MonoTextStyle},
|
||||
pixelcolor::Rgb565,
|
||||
prelude::*,
|
||||
text::Text,
|
||||
};
|
||||
|
||||
use st7735_lcd;
|
||||
use st7735_lcd::Orientation;
|
||||
|
||||
use crate::hal::{pac, GpioExt};
|
||||
|
||||
use embedded_hal;
|
||||
use embedded_hal::{blocking::delay::DelayMs, digital::v2::OutputPin};
|
||||
|
||||
use ibex_demo_system_hal as hal;
|
||||
|
||||
const CPU_CLOCK_HZ: u32 = 50_000_000;
|
||||
|
||||
#[entry]
|
||||
fn main() -> ! {
|
||||
let mut delay = McycleDelay::new(CPU_CLOCK_HZ);
|
||||
let p = pac::Peripherals::take().unwrap();
|
||||
|
||||
let pins = p.GPIOA.pins();
|
||||
let mut led0 = pins.pin4.into_output();
|
||||
let mut cs = pins.pin0.into_output();
|
||||
let mut lcd_led = pins.pin3.into_output();
|
||||
let rst = pins.pin1.into_output();
|
||||
let dc = pins.pin2.into_output();
|
||||
|
||||
led0.set_high().unwrap();
|
||||
cs.set_low().unwrap();
|
||||
lcd_led.set_low().unwrap();
|
||||
|
||||
let spi = hal::spi::Spi::new(p.SPI0, cs);
|
||||
|
||||
let mut disp = st7735_lcd::ST7735::new(spi, dc, rst, true, false, 160, 128);
|
||||
disp.init(&mut delay).unwrap();
|
||||
disp.set_orientation(&Orientation::Landscape).unwrap();
|
||||
disp.clear(Rgb565::WHITE).unwrap();
|
||||
disp.set_offset(0, 0);
|
||||
lcd_led.set_high().unwrap();
|
||||
|
||||
let style = MonoTextStyle::new(&FONT_6X10, Rgb565::BLUE);
|
||||
|
||||
let image_raw: ImageRawLE<Rgb565> =
|
||||
ImageRaw::new(include_bytes!("../resorces/lowrisc.rgb565"), 105);
|
||||
let image: Image<_> = Image::new(&image_raw, Point::new((160 - 105) / 2, 0));
|
||||
image.draw(&mut disp).unwrap();
|
||||
|
||||
Text::new("Open to the core", Point::new(30, 90), style)
|
||||
.draw(&mut disp)
|
||||
.unwrap();
|
||||
|
||||
loop {
|
||||
delay.delay_ms(15);
|
||||
}
|
||||
}
|
||||
@@ -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,890 @@
|
||||
# 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 = "anstream"
|
||||
version = "0.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163"
|
||||
dependencies = [
|
||||
"anstyle",
|
||||
"anstyle-parse",
|
||||
"anstyle-query",
|
||||
"anstyle-wincon",
|
||||
"colorchoice",
|
||||
"is-terminal",
|
||||
"utf8parse",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "anstyle"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd"
|
||||
|
||||
[[package]]
|
||||
name = "anstyle-parse"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333"
|
||||
dependencies = [
|
||||
"utf8parse",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "anstyle-query"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b"
|
||||
dependencies = [
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "anstyle-wincon"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188"
|
||||
dependencies = [
|
||||
"anstyle",
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.71"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8"
|
||||
|
||||
[[package]]
|
||||
name = "arrayref"
|
||||
version = "0.3.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545"
|
||||
|
||||
[[package]]
|
||||
name = "arrayvec"
|
||||
version = "0.7.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
|
||||
|
||||
[[package]]
|
||||
name = "bit_field"
|
||||
version = "0.10.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dcb6dd1c2376d2e096796e234a70e17e94cc2d5d54ff8ce42b28cef1d0d359a4"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "2.3.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42"
|
||||
|
||||
[[package]]
|
||||
name = "blake2b_simd"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3c2f0dc9a68c6317d884f97cc36cf5a3d20ba14ce404227df55e1af708ab04bc"
|
||||
dependencies = [
|
||||
"arrayref",
|
||||
"arrayvec",
|
||||
"constant_time_eq",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.0.79"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
|
||||
|
||||
[[package]]
|
||||
name = "clap"
|
||||
version = "4.3.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "384e169cc618c613d5e3ca6404dda77a8685a63e08660dcc64abaf7da7cb0c7a"
|
||||
dependencies = [
|
||||
"clap_builder",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "clap_builder"
|
||||
version = "4.3.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ef137bbe35aab78bdb468ccfba75a5f4d8321ae011d34063770780545176af2d"
|
||||
dependencies = [
|
||||
"anstream",
|
||||
"anstyle",
|
||||
"clap_lex",
|
||||
"strsim",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "clap_lex"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b"
|
||||
|
||||
[[package]]
|
||||
name = "colorchoice"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
|
||||
|
||||
[[package]]
|
||||
name = "constant_time_eq"
|
||||
version = "0.2.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "21a53c0a4d288377e7415b53dcfc3c04da5cdc2cc95c8d5ac178b58f0b861ad6"
|
||||
|
||||
[[package]]
|
||||
name = "critical-section"
|
||||
version = "1.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6548a0ad5d2549e111e1f6a11a6c2e2d00ce6a3dafe22948d67c2b443f775e52"
|
||||
|
||||
[[package]]
|
||||
name = "darling"
|
||||
version = "0.14.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850"
|
||||
dependencies = [
|
||||
"darling_core",
|
||||
"darling_macro",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "darling_core"
|
||||
version = "0.14.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0"
|
||||
dependencies = [
|
||||
"fnv",
|
||||
"ident_case",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"strsim",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "darling_macro"
|
||||
version = "0.14.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e"
|
||||
dependencies = [
|
||||
"darling_core",
|
||||
"quote",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "derive_builder"
|
||||
version = "0.12.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8d67778784b508018359cbc8696edb3db78160bab2c2a28ba7f56ef6932997f8"
|
||||
dependencies = [
|
||||
"derive_builder_macro",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "derive_builder_core"
|
||||
version = "0.12.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c11bdc11a0c47bc7d37d582b5285da6849c96681023680b906673c5707af7b0f"
|
||||
dependencies = [
|
||||
"darling",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "derive_builder_macro"
|
||||
version = "0.12.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ebcda35c7a396850a55ffeac740804b40ffec779b98fffbb1738f4033f0ee79e"
|
||||
dependencies = [
|
||||
"derive_builder_core",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[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 = "env_logger"
|
||||
version = "0.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0"
|
||||
dependencies = [
|
||||
"humantime",
|
||||
"is-terminal",
|
||||
"log",
|
||||
"regex",
|
||||
"termcolor",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "equivalent"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "88bffebc5d80432c9b140ee17875ff173a8ab62faad5b257da912bd2f6c1c0a1"
|
||||
|
||||
[[package]]
|
||||
name = "errno"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
|
||||
dependencies = [
|
||||
"errno-dragonfly",
|
||||
"libc",
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "errno-dragonfly"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
|
||||
dependencies = [
|
||||
"cc",
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fnv"
|
||||
version = "1.0.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.14.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a"
|
||||
|
||||
[[package]]
|
||||
name = "hermit-abi"
|
||||
version = "0.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b"
|
||||
|
||||
[[package]]
|
||||
name = "html-escape"
|
||||
version = "0.2.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6d1ad449764d627e22bfd7cd5e8868264fc9236e07c752972b4080cd351cb476"
|
||||
dependencies = [
|
||||
"utf8-width",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "humantime"
|
||||
version = "2.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
|
||||
|
||||
[[package]]
|
||||
name = "ibex-demo-system-pac"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"critical-section",
|
||||
"riscv",
|
||||
"svd2rust",
|
||||
"vcell",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ident_case"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
|
||||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
version = "2.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d"
|
||||
dependencies = [
|
||||
"equivalent",
|
||||
"hashbrown",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "inflections"
|
||||
version = "1.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a"
|
||||
|
||||
[[package]]
|
||||
name = "irx-config"
|
||||
version = "3.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3b0071d0561e65904b6ea900e6e09d84579766c20a2b6b4d628eaf3caf9ec9ee"
|
||||
dependencies = [
|
||||
"blake2b_simd",
|
||||
"clap",
|
||||
"derive_builder",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"serde_yaml",
|
||||
"thiserror",
|
||||
"toml",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "is-terminal"
|
||||
version = "0.4.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "24fddda5af7e54bf7da53067d6e802dbcc381d0a8eef629df528e3ebf68755cb"
|
||||
dependencies = [
|
||||
"hermit-abi",
|
||||
"rustix",
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "itoa"
|
||||
version = "1.0.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a"
|
||||
|
||||
[[package]]
|
||||
name = "lazy_static"
|
||||
version = "1.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
||||
|
||||
[[package]]
|
||||
name = "led"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"critical-section",
|
||||
"embedded-hal",
|
||||
"ibex-demo-system-pac",
|
||||
"panic-halt",
|
||||
"riscv",
|
||||
"riscv-rt",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.147"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
|
||||
|
||||
[[package]]
|
||||
name = "linux-raw-sys"
|
||||
version = "0.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0"
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4"
|
||||
|
||||
[[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 = "once_cell"
|
||||
version = "1.18.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
|
||||
|
||||
[[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.63"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.28"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488"
|
||||
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.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",
|
||||
"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 1.0.107",
|
||||
]
|
||||
|
||||
[[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 = "roxmltree"
|
||||
version = "0.14.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "921904a62e410e37e215c40381b7117f830d9d89ba60ab5236170541dd25646b"
|
||||
dependencies = [
|
||||
"xmlparser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustix"
|
||||
version = "0.38.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "aabcb0461ebd01d6b79945797c27f8529082226cb630a9865a71870ff63532a4"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"errno",
|
||||
"libc",
|
||||
"linux-raw-sys",
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
version = "1.0.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9"
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.166"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d01b7404f9d441d3ad40e6a636a7782c377d2abdbe4fa2440e2edcc2f4f10db8"
|
||||
dependencies = [
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.166"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5dd83d6dde2b6b2d466e14d9d1acce8816dedee94f735eac6395808b3483c6d6"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.23",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_json"
|
||||
version = "1.0.99"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "46266871c240a00b8f503b877622fe33430b3c7d963bdc0f2adc511e54a1eae3"
|
||||
dependencies = [
|
||||
"itoa",
|
||||
"ryu",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_spanned"
|
||||
version = "0.6.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_yaml"
|
||||
version = "0.9.22"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "452e67b9c20c37fa79df53201dc03839651086ed9bbe92b3ca585ca9fdaa7d85"
|
||||
dependencies = [
|
||||
"indexmap",
|
||||
"itoa",
|
||||
"ryu",
|
||||
"serde",
|
||||
"unsafe-libyaml",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "strsim"
|
||||
version = "0.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
|
||||
|
||||
[[package]]
|
||||
name = "svd-parser"
|
||||
version = "0.14.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3e93e3a9aafae32a19b9c07470b628d2dd71192a34e01147852a54087bf41694"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"roxmltree",
|
||||
"svd-rs",
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "svd-rs"
|
||||
version = "0.14.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d08273bc4ca66b632299903960efa8a306aac61dc6381bcf07450c20b1a5443c"
|
||||
dependencies = [
|
||||
"once_cell",
|
||||
"regex",
|
||||
"serde",
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "svd2rust"
|
||||
version = "0.29.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fa74088ddea858d2715bf812b0a6347a1340a13e1b91803376967a9dc84602f8"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"clap",
|
||||
"env_logger",
|
||||
"html-escape",
|
||||
"inflections",
|
||||
"irx-config",
|
||||
"log",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"regex",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"serde_yaml",
|
||||
"svd-parser",
|
||||
"svd-rs",
|
||||
"syn 1.0.107",
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
[[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 = "syn"
|
||||
version = "2.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "59fb7d6d8281a51045d62b8eb3a7d1ce347b76f312af50cd3dc0af39c87c1737"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "termcolor"
|
||||
version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"
|
||||
dependencies = [
|
||||
"winapi-util",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror"
|
||||
version = "1.0.40"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac"
|
||||
dependencies = [
|
||||
"thiserror-impl",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror-impl"
|
||||
version = "1.0.40"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.23",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml"
|
||||
version = "0.7.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1ebafdf5ad1220cb59e7d17cf4d2c72015297b75b19a10472f99b89225089240"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"serde_spanned",
|
||||
"toml_datetime",
|
||||
"toml_edit",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_datetime"
|
||||
version = "0.6.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_edit"
|
||||
version = "0.19.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "266f016b7f039eec8a1a80dfe6156b633d208b9fccca5e4db1d6775b0c4e34a7"
|
||||
dependencies = [
|
||||
"indexmap",
|
||||
"serde",
|
||||
"serde_spanned",
|
||||
"toml_datetime",
|
||||
"winnow",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc"
|
||||
|
||||
[[package]]
|
||||
name = "unsafe-libyaml"
|
||||
version = "0.2.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1865806a559042e51ab5414598446a5871b561d21b6764f2eabb0dd481d880a6"
|
||||
|
||||
[[package]]
|
||||
name = "utf8-width"
|
||||
version = "0.1.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5190c9442dcdaf0ddd50f37420417d219ae5261bbf5db120d0f9bab996c9cba1"
|
||||
|
||||
[[package]]
|
||||
name = "utf8parse"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
|
||||
|
||||
[[package]]
|
||||
name = "vcell"
|
||||
version = "0.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "77439c1b53d2303b20d9459b1ade71a83c716e3f9c34f3228c00e6f185d6c002"
|
||||
|
||||
[[package]]
|
||||
name = "void"
|
||||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
|
||||
|
||||
[[package]]
|
||||
name = "winapi"
|
||||
version = "0.3.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
|
||||
dependencies = [
|
||||
"winapi-i686-pc-windows-gnu",
|
||||
"winapi-x86_64-pc-windows-gnu",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winapi-i686-pc-windows-gnu"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
||||
|
||||
[[package]]
|
||||
name = "winapi-util"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
|
||||
dependencies = [
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winapi-x86_64-pc-windows-gnu"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
||||
|
||||
[[package]]
|
||||
name = "windows-sys"
|
||||
version = "0.48.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
|
||||
dependencies = [
|
||||
"windows-targets",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-targets"
|
||||
version = "0.48.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f"
|
||||
dependencies = [
|
||||
"windows_aarch64_gnullvm",
|
||||
"windows_aarch64_msvc",
|
||||
"windows_i686_gnu",
|
||||
"windows_i686_msvc",
|
||||
"windows_x86_64_gnu",
|
||||
"windows_x86_64_gnullvm",
|
||||
"windows_x86_64_msvc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_gnullvm"
|
||||
version = "0.48.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_msvc"
|
||||
version = "0.48.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_gnu"
|
||||
version = "0.48.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_msvc"
|
||||
version = "0.48.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnu"
|
||||
version = "0.48.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnullvm"
|
||||
version = "0.48.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_msvc"
|
||||
version = "0.48.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
|
||||
|
||||
[[package]]
|
||||
name = "winnow"
|
||||
version = "0.4.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ca0ace3845f0d96209f0375e6d367e3eb87eb65d27d445bdc9f1843a26f39448"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "xmlparser"
|
||||
version = "0.13.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4d25c75bf9ea12c4040a97f829154768bbbce366287e2dc044af160cd79a13fd"
|
||||
@@ -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
|
||||
|
||||
[package]
|
||||
name = "led"
|
||||
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 = {version = "0.10.1", features = ["critical-section-single-hart"]}
|
||||
riscv-rt = "0.11.0"
|
||||
ibex-demo-system-pac = {path = "../../ibex-demo-system-pac"}
|
||||
embedded-hal = "0.2.7"
|
||||
@@ -0,0 +1,14 @@
|
||||
# LED
|
||||
|
||||
This is a interactive demo application that light the LEDs based on the the buttons pressed on the ARTY A7 board while outputs the logs via UART.
|
||||
|
||||
## How to build and load
|
||||
1. Build and Load the bistream as described [here](../../../../README.md#building-fpga-bitstream).
|
||||
2. Connect to UART to see the console.
|
||||
```sh
|
||||
screen /dev/ttyUSB1 115200
|
||||
```
|
||||
3. Build and load the application
|
||||
```
|
||||
cargo run
|
||||
```
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user