diff --git a/.gitignore b/.gitignore
index 85052db..100c169 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,7 +5,6 @@ tests/*.s
examples/*.s
!runtime.s
!stdlibwrap.s
-!sprites.s
*.o
*.exe
*.bin
@@ -26,7 +25,6 @@ graph1.pas
graph2.pas
chase.pas
pcomp/libgen
-pcomp/shortgen
pcomp/lsymgen
pcomp/pcomp
pcomp/sasm
@@ -34,18 +32,16 @@ pcomp/sdis
tridoraemu/tridoraemu
**/tridoracpu.cache/
**/tridoracpu.hw/
-**/tridoracpu.gen/
**/tridoracpu.ip_user_files/
**/tridoracpu.runs/
*.log
*.jou
**/mig_dram_0/_tmp/*
-**/mig_dram_0/mig_dram_0/*
**/mig_dram_0/doc/*
+**/mig_dram_0/mig_dram_0*
**/mig_dram_0/xil_txt.*
**/mig_dram_0/*.veo
**/mig_dram_0/*.tcl
**/mig_dram_0/*.xml
**/mig_dram_0/*.v
**/mig_dram_0/*.vhdl
-**/mig_dram_0/*.dcp
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index 7ed0e72..0000000
--- a/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "rogue"]
- path = rogue
- url = https://gitlab.com/slederer/ecl-rogue-m.git
diff --git a/LICENSE.md b/LICENSE.md
index 6392510..3755dbb 100644
--- a/LICENSE.md
+++ b/LICENSE.md
@@ -4,7 +4,7 @@ All files, except where explicitly stated otherwise, are licensed according to t
------------------------------------------------------------------------------
-Copyright 2024-2026 Sebastian Lederer
+Copyright 2024 Sebastian Lederer
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
diff --git a/README.md b/README.md
index fe930a7..1be73d5 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-# Tridora-CPU
-The Tridora-CPU is a homebrew CPU written in Verilog and a matching software environment,
+# Tridora System
+Tridora is a homebrew CPU written in Verilog and a matching software environment,
including a Pascal compiler and assembler.
Everything was created from the ground up (except soldering stuff).
Everything is as simple as possible while still being reasonably useful.
@@ -8,7 +8,7 @@ Everything is open source, so you can read, understand and modify the whole syst
## Overview
- homebrew CPU written in Verilog implemented on an FPGA
- 32-bit word-oriented stack machine architecture
-- running at 77 MHz on an Arty-A7 board with four clocks per instruction
+- running at 83 MHz on an Arty-A7 board with four clocks per instruction
- has its own instruction set architecture, compatible with nothing
- additional IO controllers on FPGA: UART (serial console), SD-Card, VGA
- Pascal compiler written from zero
@@ -30,59 +30,13 @@ has a strange mixture of features from three different eras of computing:
- speed is like a fast 16-bit CPU, also 16-bit instruction words
- 32-bit word size from the 32-bit era
-It might remind you of the UCSD-P-System and early Turbo-Pascal versions.
-
-Other inspirations were, among others, in no particular order:
-
-- the Novix 4016 CPU (a stack machine CPU designed for Forth, mainly by Charles Moore)
-- the J1 CPU by James Bowman (which is not entirely unlike the Novix 4016)
-- the Lilith computer by Niklaus Wirth and his team (a stack CPU designed for Modula-2)
-- the PERQ workstation (also a stack CPU designed for Pascal)
-- the Magic-1 by Bill Buzbee
-- the OPC by revaldinho
-
-## October 2025 Update
-This update introduces a data cache for the Tridora-CPU. It is similar to the instruction cache
-as it caches the 16 bytes coming from the DRAM memory controller. It is a write-back cache, i.e.
-when a word inside the cached area is written, it updates the cache instead of invalidating it.
-
-This is important because there are many idioms in the stack machine assembly language where you
-store a local variable and then read it again (e.g. updating a loop variable).
-
-Since for most programs, the user stack and parts of the heap are inside the DRAM area, the data cache
-has a more noticable impact. In the benchmark program that was already used for the last update,
-the data cache results in a 50% improvement for the empty loop test. This is in comparison to the version
-without data cache but with the instruction cache, both running code out of DRAM.
-
-It is also noticable for compile times: With the data cache, compiling and assembling the
-"hello,world" program takes 16 seconds instead of 20. With a little tweak of the SD-Card controller
-that slightly increased the data transfer rate, the build time goes down to 15 seconds.
-
-Also, an audio controller was added that allows interrupt-driven sample playback via an AMP2 PMOD.
-
-## April 2025 Update
-The clock has been reduced to 77 MHz from 83 MHz. Apparently the design was at the limit and
-timing problems were cropping up seemingly at random. Reducing the clock speed made some
-enhancements and bugfixes possible. Also, the project files work with Vivado 2024 now.
-
-Most importantly, the Tridora-CPU now has an instruction cache with a size of 16 bytes or eight instructions.
-This increases execution speed when running code out of DRAM (that is, above 64KB). In a simple
-benchmark program, the CPU is about twice as fast.
-Many programs fit into the lower 64KB of RAM, which can be accessed without latency, and will
-have no noticable speed increase.
-
-There have also been a number of bug fixes for the compiler and some for the assembler. This makes
-compiling even larger and more complex programs possible. An example of this is ECL-Rogue, a variant of Rogue written
-Pascal, which has been ported to Tridora-Pascal and is now included
-on the emulator image.
-
## Links/Downloads
- the [source repository](https://gitlab.com/slederer/Tridora-CPU)
- the [Hackaday project](https://hackaday.io/project/198324-tridora-cpu) (mostly copy-paste from this README)
- the [YouTube channel](https://www.youtube.com/@tridoracpu/videos) with some demo videos
-- the [emulator](https://git.insignificance.de/slederer/-/packages/generic/tridoraemu/0.0.5/files/12) (source and windows binary)
-- the [FPGA bitstream](https://git.insignificance.de/slederer/-/packages/generic/tdr-bitstream/0.0.4/files/16) for the Arty-A7-35T board
-- an [SD-card image](https://git.insignificance.de/slederer/-/packages/generic/tdr-cardimage/0.0.4/files/13)
+- the [emulator](https://git.insignificance.de/slederer/-/packages/generic/tridoraemu/0.0.2/files/8) (source and windows binary)
+- the [FPGA bitstream](https://git.insignificance.de/slederer/-/packages/generic/tdr-bitstream/0.0.1/files/3) for the Arty-A7-35T board
+- an [SD-card image](https://git.insignificance.de/slederer/-/packages/generic/tdr-cardimage/0.0.2/files/7)
Contact the author here: tridoracpu [at] insignificance.de
@@ -113,7 +67,7 @@ Two Pmods are used for a complete system:
As the Arty-A7-35T is no longer in production, it should be easy to
use the Arty-A7-100T instead, but this has not been tested yet.
-Other boards under consideration are the Digilent Nexys-A7 and the Arty-S7.
+Other boards under consideration are the Digilent Nexys-A7 and the Olimex GateMateA1-EVB.
## Pascal Language
- Wirth Pascal
@@ -122,7 +76,7 @@ Other boards under consideration are the Digilent Nexys-A7 and the Arty-S7.
- safe strings (runtime information about max/current size)
- tiny sets (machine word sized), that means no SET OF CHAR
- array literals with IN-operator, which can replace most uses of SET OF CHAR
-- nested procedures
+- nested procedures with some limitations
- 32 bit software floating point with low precision (5-6 digits)
- break and exit statements, no continue yet
- static variable initialization for global variables
@@ -153,7 +107,7 @@ Other boards under consideration are the Digilent Nexys-A7 and the Arty-S7.
- for **rom.mem** and **rommon.prog**, find both files in the **lib** directory after running **make nativeprogs** (or **make.bat**) in the **pcomp** directory (see above)
## Building the FPGA bitstream
-- install Vivado (April-2025-Update tested with 2024.2)
+- install Vivado (known to work with 2020.1, known NOT to work with 2024.1)
- install the package for your board in Vivado (Tools -> Vivado Store -> Boards)
- copy the ROM image (**rom.mem**) into the **tridoracpu** directory (see above)
- start Vivado and open the project file **tridoracpu.xpr** in the **tridoracpu** directory
@@ -174,8 +128,3 @@ See the emulator [README](tridoraemu/README.md).
- [The Mostly Missing Pascal Programming Guide](doc/pascalprogramming.md)
More documentation is coming, as time permits.
-
-## Credits
-The Tridora-CPU uses the UART from the J1 CPU by James Bowman (*uart.v*), see https://github.com/jamesbowman/j1
-
-The VGA framebuffer uses code from Project F by Will Green, see https://projectf.io
diff --git a/doc/irqctrl.md b/doc/irqctrl.md
index bf76999..580c123 100644
--- a/doc/irqctrl.md
+++ b/doc/irqctrl.md
@@ -9,13 +9,12 @@ The interrupt controller uses a single register at address: $980
|_bit_ |15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00|
|- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |
-|_Value_|t |t |t |t |t |t |t |t |- |- |- |- |- |p2 |p1 |p0 |
+|_Value_|t |t |t |t |t |t |t |t |- |- |- |- |- |- |p1 |p0 |
|Bitfields|Description|
|---------|-----------|
| _t_ | unsigned 24 bit counter of timer ticks since reset
-| _p2_ | IRQ 2 (audio) interrupt pending if 1
| _p1_ | IRQ 1 (timer tick) interrupt pending if 1
| _p0_ | IRQ 0 (UART) interrupt pending if 1
diff --git a/doc/mem.md b/doc/mem.md
index 29177b2..e24fbe2 100644
--- a/doc/mem.md
+++ b/doc/mem.md
@@ -22,12 +22,11 @@ The _BSEL_ and _BPLC_ instructions are designed to assist with accessing bytes w
The byte ordering is big-endian.
## Accessing the I/O Area
-The I/O area uses the same word addressing in increments of four to access the registers of the I/O controllers. In practice, only the VGA framebuffer controller and the audio controller use multiple registers.
-For the other controllers, there is a single 32 bit register that is repeated all over the address space of the corresponding I/O slot.
+The I/O area organizes memory slightly different. Here, pointing out individual bytes is not very useful, so the I/O controllers use register addresses with increments of one. In practice, there is only the VGA framebuffer controller which uses multiple registers.
The individual I/O controllers each have a memory area of 128 bytes, so there is a maximum number of 16 I/O controllers.
-Currently, only I/O slots 0-4 are being used.
+Currently, only I/O slots 0-3 are being used.
|I/O slot| Address | Controller |
|--------|---------|------------|
@@ -35,4 +34,3 @@ Currently, only I/O slots 0-4 are being used.
| 1 | $880 | SPI-SD |
| 2 | $900 | VGA |
| 3 | $980 | IRQC |
-| 4 | $A00 | TDRAUDIO |
diff --git a/doc/pascalprogramming.md b/doc/pascalprogramming.md
index 454b46b..1007213 100644
--- a/doc/pascalprogramming.md
+++ b/doc/pascalprogramming.md
@@ -44,7 +44,7 @@ var a:array [1..3] of integer;
...
- a[1] := 3; a[2] := 2; a[3] := 1;
+ a[1] := 3; a[3] := 2; a[5] := 1;
for i in a do
writeln(i);
@@ -66,7 +66,7 @@ var c:char;
```
In Tridora Pascal, this syntax also works because `[ 'y', 'n' ]` will not be treated as a set literal, but as an array literal.
-The _in_ operator also works for linear arrays, so the above _if_ statement will have the same result.
+The _in_ operator also works for linear arrays, so the _if_ statement will have the same result.
Note that the array _in_ operator will be more inefficient for larger ranges (i.e. `'A'..'z'`), but more efficient for sparse sets (i.e. `'A','z'`).
@@ -103,16 +103,6 @@ Tridora-Pascal only supports the _break_ statement at the moment.
The _exit_ statement can be used to exit the current procedure or function. If it is a function, the return value of the function is undefined if _exit_ is
used before a return value is assigned.
-
-## Dynamic Memory Allocation
-Memory allocation generally works as expected with the *new* and *dispose* special procedures. The variant of *new* with two parameters that is specified in Wirth Pascal is not supported (partial allocation of a variant record). Instead, there is a variant of *new* that has a second parameter for allocating strings (see above).
-
-If heap allocation fails, *new* does not return and instead causes a runtime error. To avoid this, a different special procedure called *newOrNil* can be used. This procedure sets the pointer
-variable to *niL* if heap allocation fails.
-
-The function *MemAvail* returns the number of free bytes on the heap. It does not guarantee that this amount of memory can be allocated with *new*, because heap space can be fragmented.
-The function *MaxAvail*, which exists in some versions of Turbo Pascal and returns the size of the largest contiguous block of available heap memory, is not (yet) implemented.
-
## I/O
I/O handling in Tridora Pascal is mostly compatible with other Pascal dialects when reading/writing simple variables from/to the console. There are big differences when opening/reading/writing files explicitly.
@@ -133,7 +123,7 @@ The implementation also has the following properties:
- _read_/_write_ do ASCII conversion on scalar variables, records and arrays are processed as binary
- enums and booleans are treated as integers
- _readln_/_writeln_ operate as expected, that is, they perform _read_/_write_ and then wait for/write a newline sequence
-- other file operations available are _eof_, _eoln_, _seek_ and _filepos_
+- other file operations available are _eof_, _eoln_ and _seek_
- for error handling there is a function _IOResult_
- terminating the program without calling _close_ on open files will lose data
@@ -163,12 +153,10 @@ var f:file;
### Error Handling
When an I/O error occurs, the _IOResult_ function can be called to get the error code. Unlike TP, the _IOResult_ function requires a
file variable as a parameter. When you call _IOResult_, an error that may have occurred is considered to be _acknowledged_. If an
-error is not ackowledged and you do another I/O operation on that file, a runtime error is thrown.
+error is not ackowledged and you do another I/O operation, a runtime error is thrown.
That means you can either write programs without checking for I/O errors, while resting assured that the program will exit if an I/O error occurs. You can also choose to check for errors with _IOResult_ if you want to avoid having runtime errors.
-If an I/O error occurs on a file, it is then considered closed. Closing a file in this state, or a file that has been closed normally, will cause a runtime error.
-
The function _ErrorStr_ from the standard library takes an error code as an argument and returns the corresponding textual description as a string.
Example:
@@ -203,8 +191,7 @@ Possible error codes from _IOResult_ are:
| 8 | IOReadOnly | file is readonly | |
| 9 | IOInvalidOp | invalid operation | |
| 10 | IOInvalidFormat | invalid format | when parsing numbers with _read_ |
-| 11 | IONoMem | not enough memory | heap allocation failed inside the standard library, e.g. open() |
-| 12 | IOUserIntr | interrupted by user | program terminated by ^C, not visible from _IOResult_ |
+| 11 | IOUserIntr | interrupted by user | program terminated by ^C, not visible from _IOResult_ |
### Read, Readln and Line Input
In Turbo Pascal, using _read_ (and _readln_) from the console always waits until a complete line has been entered.
@@ -235,85 +222,6 @@ In Wirth Pascal, labels must be numbers. Other Pascal dialects also allow normal
Tridora-Pascal only allows identifiers as labels.
-## Units
-Units are the method to create libraries in Tridora-Pascal, that is, codes module that can
-be reused in other programs.
-
-Tridora-Pascal follows the unit syntax that has been established in UCSD-Pascal and is also
-used in Turbo Pascal.
-
-Units are imported with the *USES* keyword, right after the *PROGRAM* statement.
-Multiple units can be imported by separating the unit names with commas.
-
-There are some differences: In Tridora-Pascal, the unit file does not contain the interface
-section, only the implementation section. The interface section is instead placed into a
-separate file with the extension *.inc*, without any *UNIT* or *INTERFACE* keywords.
-
-This file will be included by the compiler and should contain
-procedure or function declarations (as *EXTERNAL*). It can also contain *TYPE*,
-*CONST* and *VAR* statements.
-
-All Pascal symbols of the unit are imported into the main program. There
-is no separate namespace for units.
-
-### Using an Existing Unit
-An existing unit is imported with the *USES* statement that must be placed
-immediately after the *PROGRAM* statement.
-
-The compiler will look for an include file with the unit name and an *.inc* extension.
-It will also
-tell the assembler to include an assembly language file for each
-unit. The filename must be the unit name plus an *.s* extension.
-
-Since there is no linker in Tridora-Pascal, all imported units will be
-assembled together with the main program.
-
-The compiler looks for unit *.inc* and *.s* files in the current volume or
-in the *SYSTEM* volume.
-
-### Compiling a Unit
-A unit implementation file should start with a *UNIT* statement instead of a *PROGRAM*
-statement.
-
-It should be compiled, not assembled.
-
-When building a program that uses units, the assembler will include an assembly language
-file for each unit.
-
-It is possible to write units in assembly language. This is done by
-directly providing the *.s* file and creating an *.inc* file with
-the *EXTERNAL* declarations matching the assembly language
-file.
-#### Example
-```pascal
-(* UnitExamples.pas *)
-program UnitExample;
-uses hello;
-
-begin
- sayHello('unit');
-end.
-```
-
-#### Example Unit Implementation File
-```pascal
-(* hello.pas *)
-unit hello;
-
-implementation
-
-procedure sayHello(s:string);
-begin
- writeln('hello, ', s);
-end;
-
-end.
-```
-#### Example Unit Include File
-```pascal
-(* hello.inc *)
-procedure sayHello(s:string); external;
-```
## Compiler Directives
Tridora-Pascal understands a small number of compiler directives which are introduced as usual with a comment and a dollar-sign. Both comment styles can be used.
diff --git a/doc/tdraudio.md b/doc/tdraudio.md
deleted file mode 100644
index 5d8b22f..0000000
--- a/doc/tdraudio.md
+++ /dev/null
@@ -1,104 +0,0 @@
-# Audio Controller
-The audio controller provides four channels of 16-bit PCM audio playback.
-
-It uses multiple registers starting at address $A00.
-
-Each of the four channels has three registers.
-
-For the first channel the register addresses are:
-
-|Address|Description|
-|-------|-----------|
-| $A00 | Control Register |
-| $A04 | Clock Divider Register |
-| $A08 | Amplitude Register |
-
-The register addresses for the second channel start at $A10,
-the third channel at $A20
-and the fourth channel at $A30.
-
-## Reading the control register
-
-|_bit_ |31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
-|- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |
-|_Value_|- |- |- |- |- |- |- |- |- |-|- |- |- |- |- |- |
-
-|_bit_ |15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00|
-|- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |
-|_Value_|- |- |- |- |- |- |- |- |- |- |- |i |f | e | p | c |
-
-
-|Bitfields|Description|
-|---------|-----------|
-| _i_ | interrupt is enabled for this channel when 1 |
-| _f_ | sample buffer is full when 1 |
-| _e_ | sample buffer is empty when 1 |
-| _p_ | changes from 0 to 1 and vice versa on each sample clock |
-| _c_ | channel is enabled if 1 |
-
-## Writing the control register
-
-|_bit_ |31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
-|- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |
-|_Value_|- |- |- |- |- |- |- |- |- |-|- |- |- |- |- |- |
-
-|_bit_ |15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00|
-|- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |
-|_Value_|- |- |- |- |- |- |- |- |- |- |- |i |- | - | - | c |
-
-
-|Bitfields|Description|
-|---------|-----------|
-| _c_ | enable channel if 1, disable if 0 |
-| _i_ | enable channel interrupt if 1, disable if 0 |
-
-
-## Writing the clock divider register
-
-|_bit_ |31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
-|- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |
-|_Value_|d |d |d |d |d |d |d |d |d |d|d |d |d |d |d |d |
-
-|_bit_ |15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00|
-|- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |
-|_Value_|d |d |d |d |d |d |d |d |d |d|d |d |d |d |d |d |
-
-
-|Bitfields|Description|
-|---------|-----------|
-| _d_ | an unsigned 32-bit value for the clock divider |
-
-
-## Writing the amplitude register
-
-|_bit_ |31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
-|- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |
-|_Value_|- |- |- |- |- |- |- |- |- |-|- |- |- |- |- |- |
-
-|_bit_ |15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00|
-|- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |
-|_Value_|a |a |a |a |a |a |a |a |a |a |a |a |a | a | a | a |
-
-
-|Bitfields|Description|
-|---------|-----------|
-| _a_ | an unsigned 16-bit value for the amplitude (sample) value with a bias of 32768 |
-
-## Notes
-The clock divider specifies the number of CPU clock ticks between two samples.
-
-Writing to the amplitude register adds the sample value to the sample buffer. The sample buffer is organized as a FIFO with 16 elements.
-
-Amplitude (sample) values are represented as unsigned, biased 16-bit numbers. The bias is 32768, so given an amplitude range of 1.0 to -1.0, a 1.0 is represented by 65535, 0.0 by 32768 and -1.0 by 0.
-
-Interrupt processing needs to be enabled for each channel if required.
-
-An interrupt on any channel will be signalled to the interrupt controller
-as IRQ 2. The interrupt service routine should check all running channels
-for an emtpy buffer.
-
-If an audio interrupt has occured on a channel, the interrupt enable flag
-is cleared for that channel. It needs to be re-enabled in the interrupt service routine.
-
-Interrupts also need to be enabled on the interrupt controller,
-and re-enabled there after each interrupt.
diff --git a/doc/uart.md b/doc/uart.md
index 6a6d191..b349eb4 100644
--- a/doc/uart.md
+++ b/doc/uart.md
@@ -37,7 +37,7 @@ It uses a fixed serial configuration of 115200 bps, 8 data bits, 1 stop bit, no
## Notes
-A 64 byte FIFO is used when receiving data.
+A 16 byte FIFO is used when receiving data.
When reading data, each byte needs to be acknowledged by writing the _C_ flag to the UART register.
diff --git a/doc/vga.md b/doc/vga.md
index 76520f2..b53f56d 100644
--- a/doc/vga.md
+++ b/doc/vga.md
@@ -4,16 +4,13 @@ Registers
|Name|Address|Description|
|----|-------|-----------|
|_FB_RA_ | $900 | Read Address |
-|_FB_WA_ | $904 | Write Address |
-| _FB_IO_ | $908 | I/O Register |
-| _FB_PS_ | $90C | Palette Select |
-| _FB_PD_ | $910 | Palette Data |
-| _FB_CTL_ | $914 | Control Register |
-| _FB_SHIFTER | $918 | Shift Assist Register |
-| _FB_SHIFTCOUNT | $91C | Shift Count Register |
-| _FB_SHIFTERM | $920 | Shifted Mask Register |
-| _FB_SHIFTERSP | $924 | Shifter Spill Register |
-| _FB_MASKGEN | $928 | Mask Generator Register |
+|_FB_WA_ | $901 | Write Address |
+| _FB_IO_ | $902 | I/O Register |
+| _FB_PS_ | $903 | Palette Select |
+| _FB_PD_ | $904 | Palette Data |
+| _FB_CTL_ | $905 | Control Register |
+
+
## Pixel Data
Pixel data is organized in 32-bit-words. With four bits per pixel, one word
@@ -84,54 +81,3 @@ The control register contains status information. It can only be read.
The _m_ field indicates the current graphics mode. At the time of writing, it is
always 1 which denotes a 640x400x4 mode.
The _vb_ bit is 1 when the video signal generator is in its vertical blank phase.
-
-## Shift Assist Register
-The *shift assist register* can be used to accelerate shifting pixel/bitmap data.
-Writing a word of pixel data to this register initialises the shifting process.
-
-After writing to the shift count register (see below), reading the shift assist
-register retrieves the shifted pixel data.
-
-Writing to the shift assist register will reset the shift count.
-
-## Shift Count Register
-Writing a number from 0-7 to the *shift count register* triggers shifting the
-contents of the shift assist register. Pixel data is shifted by four bits
-to the right times the shift count. Bits 31-3 of the shift count are ignored, so you can
-directly write a horizontal screen coordinate to the register.
-
-This register cannot be read.
-
-## Shifter Mask Register
-The *shifter mask register* contains the shifted pixel data converted into
-a mask. See the *mask generator register* for an
-explanation of the mask.
-
-## Shifter Spill Register
-The *shifter spill register* contains the pixel data that has
-been shifted out to the right. For example, if the shift count is two,
-the spill register contains the two rightmost pixels (bits 7-0) of
-the original pixel data, placed into the two topmost pixels (bits 31-24).
-
-The rest of the register is set to zero.
-
-## Mask Generator Register
-The *mask generator register* creates a mask from pixel data.
-For each four bits of a pixel, the corresponding four mask bits
-are all set to one if the pixel value is not zero.
-
-This can be used to combine foreground and background pixel data
-with a pixel value of zero for a transparent background color.
-
-Usually, the mask will be inverted with a *NOT* instruction
-to clear all pixels in the background that are set in the foreground
-with an *AND* instruction
-before *ORing* foreground and background together.
-
-Example in hexadecimal, each digit is a pixel:
-| Pixel Data | Mask |
-|------------|------|
-| $00000000 | $00000000 |
-| $00000001 | $0000000F |
-| $0407000F | $0F0F000F |
-| $1234ABC0 | $FFFFFFF0 |
diff --git a/examples/3dplot.pas b/examples/3dplot.pas
deleted file mode 100644
index 07ec51b..0000000
--- a/examples/3dplot.pas
+++ /dev/null
@@ -1,97 +0,0 @@
-program threedeeplot;
-const w = 640;
- h = 400;
-
-var u0,v0:integer;
-
-function fun(x0,y0:real):real;
-const vscale = 50.0;
- hscale = 20.0;
-
-var x,y,f:real;
-begin
- x := x0 / hscale;
- y := y0 / hscale;
- f := sin(sqrt(x*x + y*y));
-
- fun := f * vscale;
-end;
-
-procedure plot;
-var maxV,minV:array [0..w] of real;
- shift:integer;
- x,y,z:integer;
- lastZ:integer;
- numLines:integer;
- i:integer;
- u,v,lastU,lastV:integer;
- color:integer;
-
- procedure resetCurve;
- begin
- lastU := -1;
- lastV := -1;
- end;
-
-begin
- for i := 0 to w do
- begin
- maxV[i] := -10000;
- minV[i] := 10000;
- end;
-
- color := 1;
- shift := 4;
- x := 0;
- numLines := 80;
- u0 := w div 2;
- v0 := h div 2;
-
- for i := -(numLines div 2) to numLines do
- begin
- resetCurve;
- x := i * (w div numLines);
- for y := -w to w do
- begin
- z := round(fun(x,y));
- u := round(y + u0 + i * shift);
- v := round(-z + v0 - i * shift);
-
- if (u >= 0) and (u < w) then
- begin
- if (v < maxV[u]) and (v > minV[u]) then
- resetCurve
- else
- begin
- if (u >= 0) and (u < w) and (v > maxV[u]) then
- maxV[u] := v;
- if (u >= 0) and (u < w) and (v < minV[u]) then
- minV[u] := v;
-
- if lastZ < z then
- color := 8
- else
- color := 1;
-
- if (u >= w) or (u < 0) or (v >= h) or (v < 0) then
- resetCurve
- else
- begin
- if lastU = -1 then
- putpixel(u,v,color)
- else
- drawline(lastU,lastV,u,v,color);
- end;
- lastU := u;
- lastV := v;
- lastZ := z;
- end;
- end;
- end;
- end;
-end;
-
-begin
- initgraphics;
- plot;
-end.
diff --git a/examples/LICENSES.md b/examples/LICENSES.md
index 6f0bb8b..8992b88 100644
--- a/examples/LICENSES.md
+++ b/examples/LICENSES.md
@@ -7,9 +7,4 @@ https://commons.wikimedia.org/wiki/File:Ara-Zoo-Muenster-2013.jpg
https://commons.wikimedia.org/wiki/File:Snow_leopard_portrait.jpg
* shinkansen.pict: 投稿者が撮影, CC BY-SA 3.0 , via Wikimedia Commons
https://commons.wikimedia.org/wiki/File:0key22-86.JPG
-* Toco_Toucan.pict: Bernard DUPONT, CC BY-SA 2.0 , via Wikimedia Commons
-https://commons.wikimedia.org/wiki/File:Toco_Toucan_(Ramphastos_toco)_-_48153967707.jpg
-* 1911_Detroit_Electric.pict: Cullen328, CC BY-SA 3.0 , via Wikimedia Commons
-https://commons.wikimedia.org/wiki/File:1911_Detroit_Electric.jpg
-* ADDS-Envoy-620.pict: ADDS Envoy-1.jpg from terminals-wiki.org, CC-BY-SA 3.0
-https://terminals-wiki.org/wiki/index.php/File:ADDS_Envoy-1.jpg
+
diff --git a/examples/Toco_Toucan.pict b/examples/Toco_Toucan.pict
deleted file mode 100644
index 341f692..0000000
Binary files a/examples/Toco_Toucan.pict and /dev/null differ
diff --git a/examples/animate.pas b/examples/animate.pas
deleted file mode 100644
index 0e4bb73..0000000
--- a/examples/animate.pas
+++ /dev/null
@@ -1,164 +0,0 @@
-program animate;
-uses sprites;
-
-type PictData = record
- magic,mode:integer;
- palette: array [0..15] of integer;
- pixeldata: array [0..31999] of integer;
- end;
-
- Sprite = record
- x,y:integer;
- oldX,oldY:integer;
- xdelta,ydelta:integer;
- curFrame:integer;
- frameCount:integer;
- frameTime:integer;
- frameLeft:integer;
- changed:boolean;
- frame:array [0..3] of SpritePixels;
- end;
-
-var pic:PictData;
- filename:string;
- infile:file;
- ch:char;
- stickMan:Sprite;
- rocket:Sprite;
-
-procedure WaitVSync; external;
-
-procedure loadPalette(var pic:PictData);
-var i:integer;
-begin
- for i := 0 to 15 do
- setpalette(i, pic.palette[i]);
-end;
-
-procedure showPic(var pic:PictData);
-begin
- PutScreen(pic.pixeldata);
-end;
-
-procedure loadSpriteFrame(var aSprite:Sprite;spriteIndex:integer;
- var sheetFile:file;sheetIndex:integer);
-begin
- seek(sheetFile, 8 + sheetIndex * 512);
- read(sheetFile, aSprite.frame[spriteIndex]);
- if aSprite.frameCount <= spriteIndex then
- aSprite.frameCount := spriteIndex + 1;
-
- aSprite.curFrame := 0;
- writeln('loaded sprite frame ', spriteIndex, ' from ', sheetIndex);
-end;
-
-procedure animateSprite(var aSprite:Sprite);
-var frameIndex:integer;
- frameTime,frameLeft:integer;
- ydelta:integer;
- oldX,oldY:integer;
-begin
- ydelta := aSprite.ydelta;
- frameIndex := aSprite.curFrame;
- frameTime := aSprite.frameTime;
- frameLeft := aSprite.frameLeft;
- oldX := aSprite.x; oldY := aSprite.y;
- aSprite.oldX := oldX; aSprite.oldY := oldY;
-
- frameLeft := frameLeft - 1;
- if frameLeft <= 0 then
- begin
- frameIndex := frameIndex + 1;
- frameLeft := aSPrite.frameTime;
- aSprite.frameLeft := frameLeft;
- aSprite.curFrame := frameIndex;
- if frameIndex >= aSprite.frameCount then
- aSprite.curFrame := 0;
-
- aSprite.frameLeft := frameLeft;
-
- aSprite.x := aSprite.x + aSprite.xdelta;
- aSprite.y := aSprite.y + aSprite.ydelta;
-
- if aSprite.x > 608 then aSprite.x := 0;
-
- if aSprite.y < 0 then
- begin
- aSprite.y := 200;
- aSprite.x := 0;
- end;
- end;
- aSprite.frameLeft := frameLeft;
-end;
-
-procedure animLoop;
-var i:integer;
- oldX,oldY:integer;
- roldX,roldY:integer;
-begin
- stickMan.x := 0;
- stickMan.y := 310;
- stickMan.frameTime := 6;
- stickMan.frameLeft := stickMan.frameTime;
- stickMan.curFrame := 0;
- stickMan.xdelta := 2;
- stickMan.ydelta := 0;
-
-
- rocket.x := 0;
- rocket.y := 200;
- rocket.frameTime := 1;
- rocket.frameLeft := rocket.frameTime;
- rocket.curFrame := 0;
- rocket.xdelta := 2;
- rocket.ydelta := -1;
-
- while not ConAvail do
- begin
- oldX := stickMan.x;
- oldY := stickMan.y;
-
- roldX := rocket.x;
- roldY := rocket.y;
-
- PutSprite(roldX, roldY, rocket.frame[rocket.curFrame]);
- PutSprite(oldX, oldY, stickMan.frame[stickMan.curFrame]);
-
- animateSprite(rocket);
- animateSprite(stickMan);
-
- {Delay(1);}
- WaitVSync;
-
- UndrawSprite(oldX, oldY, pic.pixeldata);
- UndrawSprite(roldX, roldY, pic.pixeldata);
- end;
-end;
-
-begin
- filename := 'background.pict';
- open(infile, filename, ModeReadonly);
- read(infile, pic);
- close(infile);
-
- writeln('magic: ', pic.magic, ' mode:', pic.mode);
-
- loadPalette(pic);
- showPic(pic);
-
- open(infile, 'walking.sprt', ModeReadOnly);
- loadSpriteFrame(stickMan, 0, infile, 0);
- loadSpriteFrame(stickMan, 1, infile, 1);
- loadSpriteFrame(stickMan, 2, infile, 2);
- loadSpriteFrame(stickMan, 3, infile, 3);
- close(infile);
-
- open(infile, 'rocket.sprt', ModeReadOnly);
- loadSpriteFrame(rocket, 0, infile, 0);
- loadSpriteFrame(rocket, 1, infile, 1);
- loadSpriteFrame(rocket, 2, infile, 2);
- loadSpriteFrame(rocket, 3, infile, 3);
- close(infile);
-
- animLoop;
-end.
diff --git a/examples/background.pict b/examples/background.pict
deleted file mode 100644
index 55e7a2c..0000000
Binary files a/examples/background.pict and /dev/null differ
diff --git a/examples/benchmarks.pas b/examples/benchmarks.pas
deleted file mode 100644
index c5ec5fe..0000000
--- a/examples/benchmarks.pas
+++ /dev/null
@@ -1,299 +0,0 @@
-{$H350}
-program benchmarks;
-var starttime:DateTime;
- endtime:DateTime;
-
-procedure startBench(name:string);
-begin
- write(name:35, ' ');
- starttime := GetTime;
-end;
-
-procedure endBench;
-var secDelta, minDelta, hourDelta:integer;
- procedure write2Digits(i:integer);
- begin
- if i < 10 then
- write('0');
- write(i);
- end;
-begin
- endtime := GetTime;
-
- hourDelta := endtime.hours - starttime.hours;
- minDelta := endtime.minutes - starttime.minutes;
- secDelta := endtime.seconds - starttime.seconds;
-
- if secDelta < 0 then
- begin
- secDelta := 60 + secDelta;
- minDelta := minDelta - 1;
- end;
-
- if minDelta < 0 then
- begin
- minDelta := 60 + minDelta;
- hourDelta := hourDelta - 1;
- end;
-
- write2Digits(hourDelta);
- write(':');
- write2Digits(minDelta);
- write(':');
- write2Digits(secDelta);
- writeln;
-end;
-
-procedure bench0;
-var i:integer;
-begin
- startBench('empty loop 10M');
- for i := 1 to 10000000 do;
- endBench;
-end;
-
-procedure bench1;
-var i:integer;
- v:integer;
-begin
- startBench('write variable 10M');
- for i := 1 to 10000000 do
- v := 0;
- endBench;
-end;
-
-procedure bench2;
-var i:integer;
- v,r:integer;
-begin
- v := 4711;
- startBench('read variable 10M');
- for i := 1 to 10000000 do
- r := v;
- endBench;
-end;
-
-procedure bench3;
-var i:integer;
- a,b:integer;
-begin
- a := 0;
- b := 100;
-
- startBench('integer addition 10M');
- for i := 1 to 10000000 do
- a := b + i;
- endBench;
-end;
-
-procedure bench4;
-var i:integer;
- a,b:real;
-begin
- a := 0.0;
- b := 100.0;
-
- startBench('real addition 1M');
- for i := 1 to 1000000 do
- a := b + i;
- endBench;
-end;
-
-procedure bench5;
-var i:integer;
- a,b:integer;
-begin
- a := 0;
- b := 100;
-
- startBench('integer multiplication 1M');
- for i := 1 to 1000000 do
- a := b * i;
- endBench;
-end;
-
-procedure bench6;
-var i:integer;
- a,b:real;
-begin
- a := 0;
- b := 100;
-
- startBench('real multiplication 1M');
- for i := 1 to 1000000 do
- a := b * i;
- endBench;
-end;
-
-procedure bench7;
-var i:integer;
- a,b:integer;
-begin
- a := 0;
- b := 31415926;
-
- startBench('integer division 1M');
- for i := 1 to 1000000 do
- a := b div i;
- endBench;
-end;
-
-procedure bench8;
-var i:integer;
- a,b,c:real;
-begin
- a := 0;
- b := 31415926.0;
-
- startBench('real division 1M');
- for i := 1 to 1000000 do
- a := b / i;
- endBench;
-end;
-
-procedure bench9;
-var i,j:integer;
- s:string[100];
- c:char;
-begin
- s := '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn';
-
- startBench('string indexing 1M');
- for i := 1 to 100000 do
- for j := 1 to 100 do
- c := s[j];
- endBench;
-end;
-
-procedure bench10;
-var i:integer;
- s:string[100];
- c,d:char;
-begin
- s := '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn';
-
- startBench('string iteration 1M');
- for i := 1 to 100000 do
- for c in s do
- d := c;
- endBench;
-end;
-
-procedure bench11;
-var ptr: ^array[0..255] of integer;
- dummy1,dummy2,dummy3: ^array[0..127] of boolean;
- i:integer;
-begin
- new(dummy1);
- new(dummy2);
- new(dummy3);
- dispose(dummy1);
-
- startBench('new/dispose 1k 1M');
- for i := 1 to 1000000 do
- begin
- new(ptr);
- dispose(ptr);
- end;
- endBench;
-
- dispose(dummy2);
- dispose(dummy3);
-end;
-
-procedure bench12;
-var ptr: ^array[0..32767] of integer;
- dummy1,dummy2,dummy3: ^array[0..127] of boolean;
- i:integer;
-begin
- new(dummy1);
- new(dummy2);
- new(dummy3);
- dispose(dummy1);
-
- startBench('new/dispose 128k 1M');
- for i := 1 to 1000000 do
- begin
- new(ptr);
- dispose(ptr);
- end;
- endBench;
-
- dispose(dummy2);
- dispose(dummy3);
-end;
-
-procedure bench13;
-var ptr1: ^array[0..255] of integer;
- ptr2: ^array[0..255] of integer;
- i:integer;
-begin
- new(ptr1);
- new(ptr2);
- startBench('array copy 1k 10K');
- for i := 1 to 10000 do
- ptr1^ := ptr2^;
- endBench;
- dispose(ptr1);
- dispose(ptr2);
-end;
-
-procedure bench14;
-var ptr1: ^array[0..32767] of integer;
- ptr2: ^array[0..32767] of integer;
- i:integer;
-begin
- new(ptr1);
- new(ptr2);
- startBench('array copy 128k 1K');
- for i := 1 to 1000 do
- ptr1^ := ptr2^;
- endBench;
- dispose(ptr1);
- dispose(ptr2);
-end;
-
-procedure bench15;
-var i,j:integer;
- a:real;
-begin
- startBench('exp() 10K');
- for i := 1 to 1000 do
- for j := 1 to 10 do
- a := exp(j);
- endBench;
-end;
-
-procedure bench16;
-var i,j:integer;
- a,b:real;
-begin
- startBench('cos() 10K');
- b := 0.0;
- for i := 1 to 10000 do
- begin
- a := cos(b);
- b := b + 0.0001;
- end;
- endBench;
-end;
-
-begin
- bench0;
- bench1;
- bench2;
- bench3;
- bench4;
- bench5;
- bench6;
- bench7;
- bench8;
- bench9;
- bench10;
- bench11;
- bench12;
- bench13;
- bench14;
- bench15;
- bench16;
-end.
diff --git a/examples/benchmarks.results.text b/examples/benchmarks.results.text
deleted file mode 100644
index c05b034..0000000
--- a/examples/benchmarks.results.text
+++ /dev/null
@@ -1,196 +0,0 @@
-------------------------
-Arty-A7-35T
-83MHz, 64KB SRAM, 256MB DRAM
-
-Running benchmarks.prog
- empty loop 10M 00:00:09
- write variable 10M 00:00:10
- read variable 10M 00:00:12
- integer addition 10M 00:00:16
- real addition 1M 00:00:27
- integer multiplication 1M 00:01:07
- real multiplication 1M 00:00:58
- integer division 1M 00:01:44
- real division 1M 00:01:06
- string indexing 1M 00:00:27
- string iteration 1M 00:00:11
- new/dispose 1k 1M 00:00:19
- new/dispose 128k 1M 00:00:19
- array copy 1k 10K 00:00:02
- array copy 128k 1K 00:00:44
- exp() 10K 00:00:29
- cos() 10K 00:00:06
-
---------------------------------------
-Arty-A7-35T
-83MHz, 64KB SRAM, 256MB DRAM
-running in DRAM (except corelib, stdlib, runtime)
-
-Running benchmarks.prog
- empty loop 10M 00:00:30
- write variable 10M 00:00:37
- read variable 10M 00:00:40
- integer addition 10M 00:00:48
- real addition 1M 00:00:31
- integer multiplication 1M 00:01:11
- real multiplication 1M 00:01:03
- integer division 1M 00:01:48
- real division 1M 00:01:11
- string indexing 1M 00:01:13
- string iteration 1M 00:00:47
- new/dispose 1k 1M 00:00:27
- new/dispose 128k 1M 00:00:27
- array copy 1k 10K 00:00:03
- array copy 128k 1K 00:00:44
- exp() 10K 00:00:29
- cos() 10K 00:00:06
-
---------------------------------------
-Arty-A7-35T
-76.92MHz, 64KB SRAM, 256MB DRAM
-running in DRAM (except corelib, stdlib, runtime)
-
-Running benchmarks.prog
- empty loop 10M 00:00:32
- write variable 10M 00:00:40
- read variable 10M 00:00:43
- integer addition 10M 00:00:52
- real addition 1M 00:00:34
- integer multiplication 1M 00:01:17
- real multiplication 1M 00:01:08
- integer division 1M 00:01:57
- real division 1M 00:01:17
- string indexing 1M 00:01:19
- string iteration 1M 00:00:51
- new/dispose 1k 1M 00:00:29
- new/dispose 128k 1M 00:00:30
- array copy 1k 10K 00:00:03
- array copy 128k 1K 00:00:48
- exp() 10K 00:00:32
- cos() 10K 00:00:06
-
---------------------------------------
-Arty-A7-35T
-76.92MHz, 64KB SRAM, 256MB DRAM, 16B instruction cache
-running in DRAM (except corelib, stdlib, runtime)
-
-Running benchmarks.prog
- empty loop 10M 00:00:16
- write variable 10M 00:00:17
- read variable 10M 00:00:19
- integer addition 10M 00:00:24
- real addition 1M 00:00:30
- integer multiplication 1M 00:01:14
- real multiplication 1M 00:01:05
- integer division 1M 00:01:53
- real division 1M 00:01:13
- string indexing 1M 00:00:41
- string iteration 1M 00:00:21
- new/dispose 1k 1M 00:00:25
- new/dispose 128k 1M 00:00:26
- array copy 1k 10K 00:00:03
- array copy 128k 1K 00:00:48
- exp() 10K 00:00:32
- cos() 10K 00:00:06
-
---------------------------------------
-Arty-A7-35T
-76.92MHz, 64KB SRAM, 256MB DRAM,
- 16B instruction cache, 16B wt data cache
-running in SRAM
-
-Running benchmarks.prog
- empty loop 10M 00:00:07
- write variable 10M 00:00:17
- read variable 10M 00:00:20
- integer addition 10M 00:00:20
- real addition 1M 00:00:28
- integer multiplication 1M 00:01:11
- real multiplication 1M 00:00:59
- integer division 1M 00:01:36
- real division 1M 00:01:05
- string indexing 1M 00:00:39
- string iteration 1M 00:00:19
- new/dispose 1k 1M 00:00:19
- new/dispose 128k 1M 00:00:19
- array copy 1k 10K 00:00:03
- array copy 128k 1K 00:00:39
- exp() 10K 00:00:26
- cos() 10K 00:00:05
-
-
-
---------------------------------------
-Arty-A7-35T
-76.92MHz, 64KB SRAM, 256MB DRAM,
- 16B instruction cache, 16B wb data cache
-running in SRAM
-
-Running benchmarks.prog
- empty loop 10M 00:00:04
- write variable 10M 00:00:11
- read variable 10M 00:00:18
- integer addition 10M 00:00:18
- real addition 1M 00:00:27
- integer multiplication 1M 00:00:49
- real multiplication 1M 00:00:58
- integer division 1M 00:01:06
- real division 1M 00:01:04
- string indexing 1M 00:00:36
- string iteration 1M 00:00:19
- new/dispose 1k 1M 00:00:18
- new/dispose 128k 1M 00:00:18
- array copy 1k 10K 00:00:03
- array copy 128k 1K 00:00:39
- exp() 10K 00:00:25
- cos() 10K 00:00:05
-
---------------------------------------
-Arty-A7-35T
-76.92MHz, 32KB SRAM, 256MB DRAM,
- 16B instruction cache, 16B wb data cache
-running in SRAM
-
-Running benchmarks.prog
- empty loop 10M 00:00:04
- write variable 10M 00:00:11
- read variable 10M 00:00:18
- integer addition 10M 00:00:18
- real addition 1M 00:00:27
- integer multiplication 1M 00:00:49
- real multiplication 1M 00:00:58
- integer division 1M 00:01:06
- real division 1M 00:01:04
- string indexing 1M 00:00:36
- string iteration 1M 00:00:19
- new/dispose 1k 1M 00:00:18
- new/dispose 128k 1M 00:00:18
- array copy 1k 10K 00:00:03
- array copy 128k 1K 00:00:39
- exp() 10K 00:00:25
- cos() 10K 00:00:05
-
---------------------------------------------
-Arty-A7-35T
-76.92MHz, 64KB SRAM, 256MB DRAM,
- 16B instruction cache, 16B wb data cache
-running in DRAM (except corelib, stdlib, runtime)
-
-Running benchmarks.prog
- empty loop 10M 00:00:10
- write variable 10M 00:00:11
- read variable 10M 00:00:11
- integer addition 10M 00:00:13
- real addition 1M 00:00:27
- integer multiplication 1M 00:00:35
- real multiplication 1M 00:00:43
- integer division 1M 00:01:05
- real division 1M 00:00:51
- string indexing 1M 00:00:36
- string iteration 1M 00:00:20
- new/dispose 1k 1M 00:00:23
- new/dispose 128k 1M 00:00:23
- array copy 1k 10K 00:00:03
- array copy 128k 1K 00:00:48
- exp() 10K 00:00:28
- cos() 10K 00:00:04
diff --git a/examples/fastfire.inc b/examples/fastfire.inc
deleted file mode 100644
index bf0dce6..0000000
--- a/examples/fastfire.inc
+++ /dev/null
@@ -1,5 +0,0 @@
-const FIREWIDTH = 319; FIREHEIGHT = 79; (* keep in sync with fastfire.s! *)
-type FireBuf = array [0..FIREHEIGHT, 0..FIREWIDTH] of integer;
-
-procedure FastFireUpdate(var f:FireBuf); external;
-procedure FastFireDraw(var f:FireBuf;screenx, screeny:integer); external;
diff --git a/examples/fastfire.s b/examples/fastfire.s
deleted file mode 100644
index 63ace51..0000000
--- a/examples/fastfire.s
+++ /dev/null
@@ -1,326 +0,0 @@
- ; width and height of the fire cell matrix
- ; Be sure to sync this with fastfire.inc!
- .EQU FIREWIDTH 319
- .EQU FIREHEIGHT 79
-
- ;
- ; The cell matrix actually has one column
- ; and one row more than FIREWIDTH and
- ; FIREHEIGHT to handle the negative
- ; X offsets when calculating new
- ; cell values.
- ; Likewise, there is one more row.
- ; So rows are processed from 0 to FIREHEIGHT - 2
- ; and columms from 1 to FIREWIDTH - 1.
-
- ; cells considered for calculating new
- ; value for cell O (reference cells):
- ; .....O......
- ; ....123.....
- ; .....4......
-
-; args: pointer to fire cell buffer
- .EQU FF_ROW_COUNT 0
- .EQU FF_COL_COUNT 4
- .EQU FF_ROW_OFFS 8
- .EQU FF_OFFS1 12
- .EQU FF_OFFS2 16
- .EQU FF_OFFS3 20
- .EQU FF_OFFS4 24
- .EQU FF_CELL_PTR 28
- .EQU FF_FS 32
-FASTFIREUPDATE:
- FPADJ -FF_FS
- STORE FF_CELL_PTR
- LOADC FIREHEIGHT-1
- STORE FF_ROW_COUNT
-
- ; calculate offsets for reference cells
- LOADC FIREWIDTH+1
- SHL 2
- DUP
- STORE FF_ROW_OFFS ; offset to next row: WIDTH*4
- DEC 4 ; offset to cell 1: row offset - 4
- DUP
- STORE FF_OFFS1
- INC 4
- DUP
- STORE FF_OFFS2 ; offset to cell 2: + 4
- INC 4
- STORE FF_OFFS3 ; offset to cell 3: + 4
- LOAD FF_ROW_OFFS
- SHL 1 ; offset to cell 4: row offset * 2
- STORE FF_OFFS4
-
- ; start at column 1
- LOAD FF_CELL_PTR
- INC 4
- STORE FF_CELL_PTR
-FF_ROW:
- LOADC FIREWIDTH-1
- STORE FF_COL_COUNT
-
-FF_COL:
- LOAD FF_CELL_PTR
- LOAD FF_OFFS1
- ADD
- LOADI
-
- LOAD FF_CELL_PTR
- LOAD FF_OFFS2
- ADD
- LOADI
-
- LOAD FF_CELL_PTR
- LOAD FF_OFFS3
- ADD
- LOADI
-
- LOAD FF_CELL_PTR
- LOAD FF_OFFS4
- ADD
- LOADI
-
- ADD
- ADD
- ADD
-
- SHR
- SHR
-
- ; if new cell value > 0, subtract 1 to cool down
- DUP
- CBRANCH.Z FF_SKIP
- DEC 1
-FF_SKIP:
- LOAD FF_CELL_PTR ; load cell ptr
- SWAP ; swap with new value
- STOREI 4 ; store with postincrement
- STORE FF_CELL_PTR ; save new ptr value
-
- LOAD FF_COL_COUNT ; decrement column count
- DEC 1
- DUP
- STORE FF_COL_COUNT
- CBRANCH.NZ FF_COL ; loop if col count <> 0
-
- ; at the end of a row, go to next row
- ; by adding 8 to the cell pointer,
- ; skipping the first cell of the next row
- LOAD FF_CELL_PTR
- INC 8
- STORE FF_CELL_PTR
-
- LOAD FF_ROW_COUNT ; decrement row count
- DEC 1
- DUP
- STORE FF_ROW_COUNT
- CBRANCH.NZ FF_ROW ; loop if row count <> 0
-
-FF_EXIT:
- FPADJ FF_FS
- RET
-
-; framebuffer controller registers
- .EQU FB_RA $900
- .EQU FB_WA $904
- .EQU FB_IO $908
- .EQU FB_PS $90C
- .EQU FB_PD $910
- .EQU FB_CTL $914
- .EQU WORDS_PER_LINE 80
-
-; fire width in vmem words (strict left-to-right evaluation)
- .EQU FFD_ROW_WORDS 1 + FIREWIDTH / 8
-
-; draw all fire cells
-; args: pointer to fire cell buffer, screen x, screen y
- .EQU FFD_CELL_PTR 0
- .EQU FFD_X 4
- .EQU FFD_Y 8
- .EQU FFD_ROW_COUNT 12
- .EQU FFD_ROW_WORDCOUNT 16
- .EQU FFD_VMEM_PTR 20
- .EQU FFD_FS 24
-FASTFIREDRAW:
- FPADJ -FFD_FS
- STORE FFD_Y
- STORE FFD_X
- STORE FFD_CELL_PTR
-
- ; calculate video memory addr
- ; addr = y * 80 + X / 8
- LOAD FFD_Y
- SHL 2 ; y * 16
- SHL 2
- DUP
- SHL 2 ; + y * 64
- ADD ; = y * 80
-
- LOAD FFD_X
- SHR
- SHR
- SHR
- ADD ; + x / 8
-
- DUP
- STORE FFD_VMEM_PTR
- LOADC FB_WA ; set vmem write address
- SWAP
- STOREI
- DROP
-
- LOADC FIREHEIGHT + 1
- STORE FFD_ROW_COUNT
-FFD_ROW:
- LOADC FFD_ROW_WORDS
- STORE FFD_ROW_WORDCOUNT
-
- LOADC FB_WA ; set vmem write address
- LOAD FFD_VMEM_PTR
- STOREI
- DROP
-
-FFD_WORD:
- LOAD FFD_CELL_PTR ; load cell ptr
- LOADC 0 ; vmem word, start with 0
-
- ; leftmost pixel (0)
- OVER ; [ cptr, vmemw, cptr ]
- LOADI ; load cell value [ cptr, vmemw, cellval ]
- SHR ; scale it down (from 7 bits to 4)
- SHR
- SHR ; [ cptr, vmemw, cellval shr 3 ]
- OR ; [ cptr, vmemw ]
- SWAP ; [ vmemw, cptr ]
- INC 4 ; increment cell ptr on stack [ vmemw, cptr + 4 ]
- SWAP ; [ cptr + 4, vmemw ]
-
- SHL 2 ; move bits to left for next pixel
- SHL 2
-
- ; pixel 1
- OVER
- LOADI ; load cell value
- SHR ; scale it down (from 7 bits to 4)
- SHR
- SHR
- OR
- SWAP
- INC 4 ; increment cell ptr on stack
- SWAP
-
- SHL 2 ; move bits to left for next pixel
- SHL 2
-
- ; pixel 2
- OVER
- LOADI ; load cell value
- SHR ; scale it down (from 7 bits to 4)
- SHR
- SHR
- OR
- SWAP
- INC 4 ; increment cell ptr on stack
- SWAP
-
- SHL 2 ; move bits to left for next pixel
- SHL 2
-
- ; pixel 3
- OVER
- LOADI ; load cell value
- SHR ; scale it down (from 7 bits to 4)
- SHR
- SHR
- OR
- SWAP
- INC 4 ; increment cell ptr on stack
- SWAP
-
- SHL 2 ; move bits to left for next pixel
- SHL 2
-
- ; pixel 4
- OVER
- LOADI ; load cell value
- SHR ; scale it down (from 7 bits to 4)
- SHR
- SHR
- OR
- SWAP
- INC 4 ; increment cell ptr on stack
- SWAP
-
- SHL 2 ; move bits to left for next pixel
- SHL 2
-
- ; pixel 5
- OVER
- LOADI ; load cell value
- SHR ; scale it down (from 7 bits to 4)
- SHR
- SHR
- OR
- SWAP
- INC 4 ; increment cell ptr on stack
- SWAP
-
- SHL 2 ; move bits to left for next pixel
- SHL 2
-
- ; pixel 6
- OVER
- LOADI ; load cell value
- SHR ; scale it down (from 7 bits to 4)
- SHR
- SHR
- OR
- SWAP
- INC 4 ; increment cell ptr on stack
- SWAP
-
- SHL 2 ; move bits to left for next pixel
- SHL 2
-
- ; pixel 7
- OVER
- LOADI ; load cell value
- SHR ; scale it down (from 7 bits to 4)
- SHR
- SHR
- OR
- SWAP
- INC 4 ; increment cell ptr on stack
- SWAP
-
- ; store word to vmem
- ; vmem write addr will autoincrement
- LOADC FB_IO
- SWAP
- STOREI
- DROP
-
- STORE FFD_CELL_PTR
-
- ; prepare for next word
- LOAD FFD_ROW_WORDCOUNT
- DEC 1
- DUP
- STORE FFD_ROW_WORDCOUNT
- CBRANCH.NZ FFD_WORD
-
- ; prepare for next row
- LOAD FFD_VMEM_PTR
- LOADC WORDS_PER_LINE
- ADD
- STORE FFD_VMEM_PTR
-
- LOAD FFD_ROW_COUNT
- DEC 1
- DUP
- STORE FFD_ROW_COUNT
- CBRANCH.NZ FFD_ROW
-FFD_EXIT:
- FPADJ FFD_FS
- RET
diff --git a/examples/fire.pas b/examples/fire.pas
deleted file mode 100644
index 22f0217..0000000
--- a/examples/fire.pas
+++ /dev/null
@@ -1,76 +0,0 @@
-{$H1}
-{$S2}
-program fire;
-const MAXX = 30;
- MAXY = 50;
-var firebuf: array [0..MAXY, 0..MAXX] of integer;
-
- firepalette: array [0..15] of integer =
- ( $FFA, $FF8, $FF4, $FF0, $FE0, $FD0, $FA0, $F90,
- $F00, $E00, $D00, $A00, $800, $600, $300, $000);
- x,y:integer;
-
-procedure createPalette;
-var i:integer;
-begin
- for i := 15 downto 0 do
- setpalette(15 - i, firepalette[i]);
-end;
-
-procedure fireItUp;
-var x,y:integer;
-begin
- y := MAXY - 1;
- for x := 1 to MAXX - 1 do
- firebuf[y, x] := random and 127;
-end;
-
-procedure updateFire;
-var i,x,y:integer;
-begin
- for y := 0 to MAXY - 2 do
- for x := 1 to MAXX - 1 do
- begin
- i :=
- ((firebuf[y + 1, x - 1]
- + firebuf[y + 1, x]
- + firebuf[y + 1, x + 1]
- + firebuf[y + 2, x])
- ) shr 2;
- if i > 0 then
- i := i - 1;
- firebuf[y, x] := i;
- end;
-end;
-
-procedure drawFire;
-var x, y, col:integer;
-begin
- for y := 0 to MAXY - 1 do
- begin
- x := 0;
- for col in firebuf[y] do
- begin
- putpixel(300 + x, 150 + y, col shr 3);
- x := x + 1;
- end;
- end;
-end;
-
-begin
- randomize;
- initgraphics;
- createPalette;
- while not conavail do
- begin
- fireItUp;
- updateFire;
- drawFire;
- end;
-
- for y := 0 to MAXY do
- begin
- x := firebuf[y, 10];
- drawline(0, y, x, y, 1);
- end;
-end.
diff --git a/examples/fire2.pas b/examples/fire2.pas
deleted file mode 100644
index 72fb254..0000000
--- a/examples/fire2.pas
+++ /dev/null
@@ -1,84 +0,0 @@
-{$H1}
-{$S1}
-program fire2;
-uses fastfire;
-
-const MAXX = FIREWIDTH;
- MAXY = FIREHEIGHT;
-
-var firecells: FireBuf;
-
- firepalette: array [0..15] of integer =
- { ( $FFA, $FF8, $FF4, $FF0, $FE0, $FD0, $FA0, $F90,
- $F00, $E00, $D00, $A00, $800, $600, $300, $000); }
- ( $FFA, $FFA, $FFA, $FFA, $FF0, $FF0, $FF0, $FF0,
- $FF0, $FD0, $FA0, $C00, $A00, $700, $400, $000);
- x,y:integer;
-
-procedure createPalette;
-var i:integer;
-begin
- for i := 15 downto 0 do
- setpalette(15 - i, firepalette[i]);
-end;
-
-procedure fireItUp;
-var x,y:integer;
-begin
- y := MAXY - 1;
- for x := 1 to MAXX - 1 do
- firecells[y, x] := random and 127;
-end;
-
-
-procedure updateFire;
-var i,x,y:integer;
-begin
- for y := 0 to MAXY - 2 do
- for x := 1 to MAXX - 1 do
- begin
- i :=
- ((firecells[y + 1, x - 1]
- + firecells[y + 1, x]
- + firecells[y + 1, x + 1]
- + firecells[y + 2, x])
- ) shr 2;
- if i > 0 then
- i := i - 1;
- firecells[y, x] := i;
- end;
-end;
-
-procedure drawFire;
-var x, y, col:integer;
-begin
- for y := 0 to MAXY - 1 do
- begin
- x := 0;
- for col in firecells[y] do
- begin
- putpixel(100 + x, 150 + y, col shr 3);
- x := x + 1;
- end;
- end;
-end;
-
-begin
- randomize;
- initgraphics;
- createPalette;
- while not conavail do
- begin
- fireItUp;
- FastFireUpdate(firecells);
- { updateFire; }
- FastFireDraw(firecells, 160, 100);
- { drawFire; }
- end;
-
- for y := 0 to MAXY do
- begin
- x := firecells[y, 10];
- drawline(0, y, x, y, 1);
- end;
-end.
diff --git a/examples/graphbench.pas b/examples/graphbench.pas
deleted file mode 100644
index 9abbfba..0000000
--- a/examples/graphbench.pas
+++ /dev/null
@@ -1,125 +0,0 @@
-program graphbench;
-uses sprites;
-
-var starttime,endtime:DateTime;
- spriteData:SpritePixels;
-
-procedure readSpriteData(filename:string);
-var f:file;
-begin
- open(f,filename,ModeReadOnly);
- seek(f,8); (* skip file header *)
- read(f,spriteData);
- close(f);
-end;
-
-procedure startBench(name:string);
-begin
- write(name:20, ' ');
- starttime := GetTime;
-end;
-
-procedure endBench;
-var secDelta, minDelta, hourDelta:integer;
- procedure write2Digits(i:integer);
- begin
- if i < 10 then
- write('0');
- write(i);
- end;
-begin
- endTime := GetTime;
-
- hourDelta := endtime.hours - starttime.hours;
- minDelta := endtime.minutes - starttime.minutes;
- secDelta := endtime.seconds - starttime.seconds;
-
- if secDelta < 0 then
- begin
- secDelta := 60 + secDelta;
- minDelta := minDelta - 1;
- end;
-
- if minDelta < 0 then
- begin
- minDelta := 60 + minDelta;
- hourDelta := hourDelta - 1;
- end;
-
- write2Digits(hourDelta);
- write(':'); write2Digits(minDelta);
- write(':'); write2Digits(secDelta);
- writeln;
-end;
-
-function randint(lessthan:integer):integer;
-var r:integer;
-begin
- r := random and 511;
- if r >= lessthan then
- r := r - lessthan;
- randint := r;
-end;
-
-procedure drawsprites(count:integer);
-var i,col,x,y:integer;
-begin
- col := 1;
- for i := 1 to count do
- begin
- x := randint(350);
- y := randint(350);
- PutSprite(x,y,spriteData);
- col := col + 1;
- if col > 15 then col := 1;
- end;
-end;
-
-procedure drawlines(count:integer);
-var i,col,x1,y1,x2,y2:integer;
-begin
- col := 1;
- for i := 1 to count do
- begin
- x1 := randint(500);
- y1 := randint(400);
- x2 := randint(500);
- y2 := randint(400);
- DrawLine(x1,y1,x2,y2,col);
- col := col + 1;
- if col > 15 then col := 1;
- end;
-end;
-
-procedure drawpoints(count:integer);
-var i,col,x,y:integer;
-begin
- col := 1;
- for i := 1 to count do
- begin
- x := randint(500);
- y := randint(400);
- PutPixel(x,y,col);
- col := col + 1;
- if col > 15 then col := 1;
- end;
-end;
-
-begin
- readSpriteData('rocket.sprt');
-
- InitGraphics;
- startBench('points 200K');
- drawpoints(200000);
- endBench;
-
- InitGraphics;
- startBench('lines 10K');
- drawlines(10000);
- endBench;
-
- InitGraphics;
- startBench('sprites 50K');
- drawsprites(50000);
- endBench;
-end.
diff --git a/examples/grey.pict b/examples/grey.pict
deleted file mode 100644
index da05406..0000000
Binary files a/examples/grey.pict and /dev/null differ
diff --git a/examples/pcmtest.pas b/examples/pcmtest.pas
deleted file mode 100644
index 5122219..0000000
--- a/examples/pcmtest.pas
+++ /dev/null
@@ -1,56 +0,0 @@
-{$H2560}
-program pcmtest2;
-uses pcmaudio;
-
-var filename:string;
- buf:SndBufPtr;
- sampleRate:integer;
- err:integer;
- done:boolean;
- c:char;
-
-function readAudioFile(fname:string):SndBufPtr;
-var i,size:integer;
- c:char;
- buf:SndBufPtr;
- f:file;
-begin
- open(f, fname, ModeReadOnly);
- size := FileSize(f);
- new(buf, size);
-
- buf^ := '';
- write('Reading ', size, ' bytes...');
- for i := 1 to size do
- begin
- read(f,c);
- AppendChar(buf^,c);
- end;
- writeln;
-
- close(f);
-
- readAudioFile := buf;
-end;
-
-begin
- if ParamCount > 0 then
- filename := ParamStr(1)
- else
- begin
- write('Filename> ');
- readln(filename);
- end;
-
- err := 1;
- if ParamCount > 1 then
- val(ParamStr(2), sampleRate, err);
- if err > 0 then
- sampleRate := 22050;
-
- buf := readAudioFile(filename);
-
- PlaySample(buf, sampleRate);
-
- dispose(buf);
-end.
diff --git a/examples/pcmtest2.pas b/examples/pcmtest2.pas
deleted file mode 100644
index b5bf47a..0000000
--- a/examples/pcmtest2.pas
+++ /dev/null
@@ -1,74 +0,0 @@
-{$H2560}
-program pcmtest2;
-uses pcmaudio;
-
-var filename:string;
- buf:SndBufPtr;
- sampleRate:integer;
- err:integer;
- done:boolean;
- c:char;
-
-function readAudioFile(fname:string):SndBufPtr;
-var i,size:integer;
- c:char;
- buf:SndBufPtr;
- f:file;
-begin
- open(f, fname, ModeReadOnly);
- size := FileSize(f);
- new(buf, size);
-
- buf^ := '';
- write('Reading ', size, ' bytes...');
- for i := 1 to size do
- begin
- read(f,c);
- AppendChar(buf^,c);
- end;
- writeln;
-
- close(f);
-
- readAudioFile := buf;
-end;
-
-begin
- if ParamCount > 0 then
- filename := ParamStr(1)
- else
- begin
- write('Filename> ');
- readln(filename);
- end;
-
- err := 1;
- if ParamCount > 1 then
- val(ParamStr(2), sampleRate, err);
- if err > 0 then
- sampleRate := 32000;
-
- buf := readAudioFile(filename);
-
- SampleQStart(buf, false, sampleRate);
-
- write('Press ESC to stop> ');
- done := false;
- while not done do
- begin
- read(c);
- if c = #27 then
- begin
- done := true; writeln(';');
- end
- else
- if c = '?' then
- begin
- writeln; writeln('Queue: ', SampleQSize);
- end;
- end;
-
- SampleQStop;
-
- dispose(buf);
-end.
diff --git a/examples/rocket.sprt b/examples/rocket.sprt
deleted file mode 100644
index 3108b4a..0000000
Binary files a/examples/rocket.sprt and /dev/null differ
diff --git a/examples/shinkansen.pict b/examples/shinkansen.pict
index e180d5b..7b1ac55 100644
Binary files a/examples/shinkansen.pict and b/examples/shinkansen.pict differ
diff --git a/examples/snow_leopard.pict b/examples/snow_leopard.pict
index 91422f7..8ea4ab8 100644
Binary files a/examples/snow_leopard.pict and b/examples/snow_leopard.pict differ
diff --git a/examples/sprites.inc b/examples/sprites.inc
deleted file mode 100644
index 2713c8e..0000000
--- a/examples/sprites.inc
+++ /dev/null
@@ -1,5 +0,0 @@
-type SpritePixels = array[0..128] of integer;
-type BackgroundPixels = array[0..31999] of integer;
-
-procedure PutSprite(x,y:integer; var sprite: SpritePixels); external;
-procedure UndrawSprite(x,y:integer; var background: BackgroundPixels); external;
diff --git a/examples/sprites.s b/examples/sprites.s
deleted file mode 100644
index 5f50081..0000000
--- a/examples/sprites.s
+++ /dev/null
@@ -1,287 +0,0 @@
- .EQU SPRITE_HEIGHT 32 ; height in lines
- .EQU SPRITE_STRIPES 4 ; width in words i.e. 8-pixel stripes
-
- .EQU WORDS_PER_LINE 80
- .EQU FB_RA $900
- .EQU FB_WA $904
- .EQU FB_IO $908
- .EQU FB_PS $90C
- .EQU FB_PD $910
- .EQU FB_CTL $914
- .EQU FB_SHIFTER $918
- .EQU FB_SHIFTCOUNT $91C
- .EQU FB_SHIFTERM $920
- .EQU FB_SHIFTERSP $924
- .EQU FB_MASKGEN $928
-
-; calculate vmem address from coordinates
-; args: x,y
-; returns: vmem word number
-CALC_VMEM_ADDR:
- ; only works if WORDS_PER_LINE is 80
- ; and pixels per word is 8
-
- DUP
- ; y
- SHL 2
- SHL 2
- SHL 2 ; * 64
-
- SWAP
- ; + y
- SHL 2
- SHL 2 ; * 16
- ADD
-
- SWAP
- ; word offset = X/8
- SHR
- SHR
- SHR
- ADD
-
- RET
-
-; put a sprite on screen
-; arg: x,y pointer to sprite data
- .EQU PS_VMEM_ADDR 0
- .EQU PS_SPRITE_DATA 4
- .EQU PS_SPRITE_LINES 8
- .EQU PS_X 12
- .EQU PS_Y 16
- .EQU PS_SHIFT_C 20
- .EQU PS_SPILL 24
- .EQU PS_STRIPE_C 28
- .EQU PS_BPSAVE 32
- .EQU PS_FS 36
-PUTSPRITE:
- FPADJ -PS_FS
- STORE PS_SPRITE_DATA
- STORE PS_Y
- STORE PS_X
-
- LOADREG BP
- STORE PS_BPSAVE
- LOADC 0
- STOREREG BP
-
- ; calculate vmem address
- LOAD PS_X
- LOAD PS_Y
- LOADCP CALC_VMEM_ADDR
- CALL
- STORE PS_VMEM_ADDR
-
- LOADC SPRITE_HEIGHT
- STORE PS_SPRITE_LINES
-
- ; loop over each line of the sprite
-PS_LOOP1:
- ; set read and write address
- ; in the vga controller
- LOAD PS_VMEM_ADDR
- DUP
- STORE.B FB_RA
- STORE.B FB_WA
-
- LOAD PS_SPRITE_DATA ; address of sprite data
- DUP
- INC 4 ; increment pointer
- STORE PS_SPRITE_DATA ; and store it again
- LOADI ; load word from orig. address
-
- ; ------- one word of sprite pixels on stack
-
- STORE.B FB_SHIFTER
- LOAD PS_X
- STORE.B FB_SHIFTCOUNT
-
- LOAD.B FB_SHIFTERM ; get shifted mask
- NOT
- LOAD.B FB_IO ; and background pixel data
- AND ; remove foreground pixels
-
- LOAD.B FB_SHIFTER ; get shifted pixels
- OR ; combine with background
- STORE.B FB_IO ; store into vmem
-
- ; set counter for remaining stripes
- LOADC SPRITE_STRIPES - 1
- STORE PS_STRIPE_C
-
- ;
- ; process spilled bits and next vertical stripe of sprite data
- ;
-PS_NEXT_STRIPE:
- ;use spill bits from first column
- LOAD.B FB_SHIFTERSP
-
- LOAD PS_SPRITE_DATA ; address of sprite data
- DUP
- INC 4 ; increment pointer
- STORE PS_SPRITE_DATA ; and store it again
- LOADI ; load word from orig. address
-
- STORE.B FB_SHIFTER ; store into shifter
- LOAD PS_X
- STORE.B FB_SHIFTCOUNT ; shift stuff
- LOAD.B FB_SHIFTER ; get shifted pixels
- OR ; combine with spill bits (see above)
- DUP
- STORE.B FB_MASKGEN ; store to mask reg to get new mask
-
- LOAD.B FB_MASKGEN ; get mask for spill bits + shifted pixels
- NOT
- LOAD.B FB_IO ; get vmem data
- AND ; remove foreground pixels from bg
-
- OR ; combine with shifted pixels
- STORE.B FB_IO ; write to vmem
-
- LOAD PS_STRIPE_C ; decrement stripe count
- DEC 1
- DUP
- STORE PS_STRIPE_C
- CBRANCH.NZ PS_NEXT_STRIPE ; if non-zero, next stripe
-
- ; write spilled bits of the last stripe into next vmem word
- LOAD.B FB_SHIFTERSP ; get spill bits
- DUP
- STORE.B FB_MASKGEN
- LOAD.B FB_MASKGEN ; get sprite mask for spill bits
- NOT
-
- LOAD.B FB_IO ; load next vmem word
- AND ; apply sprite mask
-
- OR ; OR in spill bits
-
- STORE.B FB_IO ; write to vmem
-
- LOAD PS_SPRITE_LINES ; decrement lines count
- DEC 1
- DUP
- CBRANCH.Z PS_L_XT ; exit if zero
- STORE PS_SPRITE_LINES
- ; prepare next line
- LOAD PS_VMEM_ADDR
- LOADC WORDS_PER_LINE ; increment to next screen line
- ADD
- STORE PS_VMEM_ADDR
- BRANCH PS_LOOP1
-PS_L_XT:
- DROP
-
- LOAD PS_BPSAVE
- STOREREG BP
-
- FPADJ PS_FS
- RET
-
-; undraw a sprite, i.e. draw background data
-; over a sprite location
-; args: x,y, ptr to background data
- .EQU UD_S_X 0
- .EQU UD_S_Y 4
- .EQU UD_S_PXS 8
- .EQU UD_S_BGDATA 12
- .EQU UD_S_OFFSET 16
- .EQU UD_S_BGORIG 20
- .EQU UD_STRIPE_C 24
- .EQU UD_S_FS 28
-UNDRAWSPRITE:
- FPADJ -UD_S_FS
- STORE UD_S_BGORIG
- STORE UD_S_Y
- STORE UD_S_X
-
- ; calculate pixel shift
- LOAD UD_S_X
- LOADC $7
- AND
- STORE UD_S_PXS
-
- ; calculate vmem offset
- LOAD UD_S_X
- LOAD UD_S_Y
- LOADCP CALC_VMEM_ADDR
- CALL
-
- DUP
- STORE UD_S_OFFSET
-
- ; calculate background data address from offset
- SHL 2
- LOAD UD_S_BGORIG
- ADD
- STORE UD_S_BGDATA
-
- LOADC SPRITE_HEIGHT ; line count
-UD_S_L1:
- ; store vmem offset into write addr reg
- LOADCP FB_WA
- LOAD UD_S_OFFSET
- STOREI 4 ; ugly but fast: reuse addr
- ; with postincrement to
- ; get to FB_IO for STOREI below
-
- ; load a word of background data
- LOAD UD_S_BGDATA
- LOADI
- ; and write it to vmem
- STOREI
- ; reuse addr from STOREI
-
- LOADC SPRITE_STRIPES - 1 ; set remaining stripe count
- STORE UD_STRIPE_C
-
-UD_NEXT_STRIPE:
- ; load next word of background data
- LOAD UD_S_BGDATA
- INC 4
- DUP
- STORE UD_S_BGDATA
- LOADI
- STOREI ; and write it to vmem
- ; reuse addr from STOREI
-
- LOAD UD_STRIPE_C ; decrease remaining stripe count
- DEC 1
- DUP
- STORE UD_STRIPE_C
- CBRANCH.NZ UD_NEXT_STRIPE ; if non-zero, next stripe
-
- DROP ; remove addr from STOREI
-
- ; if pixel shift is zero, no spill word
- LOAD UD_S_PXS
- CBRANCH.Z UD_S_L2
-
- ; load next word of background data
- LOADCP FB_IO
- LOAD UD_S_BGDATA
- INC 4
- LOADI
- STOREI ; and write it to vmem
- DROP
-
-UD_S_L2:
- LOAD UD_S_OFFSET
- LOADCP WORDS_PER_LINE
- ADD
- DUP
- STORE UD_S_OFFSET
- SHL 2
- LOAD UD_S_BGORIG
- ADD
- STORE UD_S_BGDATA
-
- DEC 1 ; decrement counter
- DUP
- CBRANCH.NZ UD_S_L1 ; check for zero
-
- DROP ; remove counter
-
- FPADJ UD_S_FS
- RET
-
diff --git a/examples/sprites.sprt b/examples/sprites.sprt
deleted file mode 100644
index 475bd4d..0000000
Binary files a/examples/sprites.sprt and /dev/null differ
diff --git a/examples/pictviewer.pas b/examples/viewpict.pas
similarity index 90%
rename from examples/pictviewer.pas
rename to examples/viewpict.pas
index 6fffe95..78e061d 100644
--- a/examples/pictviewer.pas
+++ b/examples/viewpict.pas
@@ -1,4 +1,4 @@
-program pictviewer;
+program viewpict;
type PictData = record
magic, mode:integer;
palette: array [0..15] of integer;
@@ -40,4 +40,5 @@ begin
loadPalette(pic);
loadPic(pic);
+ read(ch);
end.
diff --git a/examples/walking.sprt b/examples/walking.sprt
deleted file mode 100644
index 2cdd0ce..0000000
Binary files a/examples/walking.sprt and /dev/null differ
diff --git a/examples/xmas.pas b/examples/xmas.pas
deleted file mode 100644
index 406e944..0000000
--- a/examples/xmas.pas
+++ /dev/null
@@ -1,224 +0,0 @@
-(* This program does not work anymore, because
- it uses the old sprite routines with 16x16 sprites.
- It is only included for historical reasons.
- *)
-program XmasAnimation;
-uses sprites;
-
-type PictData = record
- magic, mode:integer;
- palette: array [0..15] of integer;
- pixeldata: array [0..31999] of integer;
- end;
-
- Sprite = record
- x,y:integer;
- oldX,oldY:integer;
- xdelta,ydelta:integer;
- curFrame:integer;
- frameCount:integer;
- frameTime:integer;
- frameLeft:integer;
- changed:boolean;
- frame:array [0..3] of SpritePixels;
- end;
-
-var pic:PictData;
- filename:string;
- infile:file;
- ch:char;
- santaSprite: Sprite;
- deerSprite: Sprite;
- ohDeerSprite: Sprite;
- rudolfSprite: Sprite;
- smokeSprite: Sprite;
-
-procedure WaitVSync; external;
-
-procedure loadPalette(var pic:PictData);
-var i:integer;
-begin
- for i := 0 to 15 do
- setpalette(i, pic.palette[i]);
-end;
-
-procedure showPic(var pic:PictData);
-begin
- PutScreen(pic.pixeldata);
-end;
-
-procedure loadSpriteFrame(var aSprite:Sprite;spriteIndex:integer;
- var sheetFile:file;sheetIndex:integer);
-begin
- seek(sheetFile, 8 + sheetIndex * 128);
- read(sheetFile, aSprite.frame[spriteIndex]);
- if aSprite.frameCount <= spriteIndex then
- aSprite.frameCount := spriteIndex + 1;
-
- aSprite.curFrame := 0;
- writeln('loaded sprite frame ', spriteIndex, ' from ', sheetIndex);
-end;
-
-procedure animateSprite(var aSprite:Sprite);
-var frameIndex:integer;
- frameTime,frameLeft:integer;
- ydelta:integer;
- oldX,oldY:integer;
-begin
- ydelta := aSprite.ydelta;
- frameIndex := aSprite.curFrame;
- frameTime := aSprite.frameTime;
- frameLeft := aSprite.frameLeft;
- oldX := aSprite.x; oldY := aSprite.y;
- aSprite.oldX := oldX; aSprite.oldY := oldY;
-
- frameLeft := frameLeft - 1;
- if frameLeft <= 0 then
- begin
- frameIndex := frameIndex + 1;
- frameLeft := aSprite.frameTime;
- aSprite.frameLeft := frameLeft;
- aSprite.curFrame := frameIndex;
- if frameIndex >= aSprite.frameCount
- then
- aSprite.curFrame := 0;
-
- if frameIndex = 1 then
- begin
- ydelta := - ydelta;
- aSprite.ydelta := ydelta;
- end;
- aSprite.y := aSprite.y + ydelta;
- end;
-
- aSprite.frameLeft := frameLeft;
-
- aSprite.x := aSprite.x + aSprite.xdelta;
- if aSprite.x > 620 then aSprite.x := 0;
-end;
-
-procedure animate;
-var i:integer;
- ydelta:integer;
- frameIndex:integer;
- frameTime:integer;
- oldX,oldY:integer;
-begin
- santaSprite.x := 0;
- santaSprite.y := 60;
- santaSprite.frameTime := 10;
- santaSprite.xdelta := 2;
- santaSprite.ydelta := 1;
-
- smokeSprite.x := 434;
- smokeSprite.y := 252;
- smokeSprite.frameTime := 20;
-
- deerSprite.x := 18;
- deerSprite.y := 60;
- deerSprite.frameTime := 10;
- deerSprite.xdelta := 2;
- deerSprite.ydelta := 1;
-
- ohDeerSprite.x := 33;
- ohDeerSprite.y := 61;
- ohDeerSprite.frameTime := 10;
- ohDeerSprite.xdelta := 2;
- ohDeerSprite.ydelta := 1;
-
- rudolfSprite.x := 49;
- rudolfSprite.y := 60;
- rudolfSprite.frameTime := 10;
- rudolfSprite.xdelta := 2;
- rudolfSprite.ydelta := 1;
-
- ydelta := 1;
-
- frameTime := santaSprite.frameTime;
-
- while not ConAvail do
- begin
- frameIndex := santaSprite.curFrame;
- oldX := santaSprite.x; oldY := santaSprite.y;
- PutSprite(oldX, oldY, santaSprite.frame[frameIndex]);
- i := i + 1;
- frameTime := frameTime - 1;
- if frameTime = 0 then
- begin
- frameTime := santaSprite.frameTime;
- santaSprite.curFrame := frameIndex + 1;
- if frameIndex >= santaSprite.frameCount
- then
- santaSprite.curFrame := 0;
-
- if frameIndex = 0 then ydelta := - ydelta;
- santaSprite.y := santaSprite.y + ydelta;
- end;
- santaSprite.x := santaSprite.x + 2;
- if santaSprite.x > 620 then santaSprite.x := 0;
-
- PutSprite(deerSprite.x, deerSprite.y,
- deerSprite.frame[deerSprite.curFrame]);
-
- PutSprite(ohDeerSprite.x, ohDeerSprite.y,
- ohDeerSprite.frame[ohDeerSprite.curFrame]);
-
- PutSprite(rudolfSprite.x, rudolfSprite.y,
- rudolfSprite.frame[rudolfSprite.curFrame]);
-
- PutSprite(smokeSprite.x, smokeSprite.y,
- smokeSprite.frame[smokeSprite.curFrame]);
-
- animateSprite(deerSprite);
- animateSprite(ohDeerSprite);
- animateSprite(rudolfSprite);
- animateSprite(smokeSprite);
-
- Delay(10);
- WaitVSync;
-
- UndrawSprite(oldX, oldY, pic.pixeldata);
- UndrawSprite(deerSprite.oldX, deerSprite.oldY, pic.pixeldata);
- UndrawSprite(ohDeerSprite.oldX, ohDeerSprite.oldY, pic.pixeldata);
- UndrawSprite(rudolfSprite.oldX, rudolfSprite.oldY, pic.pixeldata);
- UndrawSprite(smokeSprite.oldX, smokeSprite.oldY, pic.pixeldata);
- end;
-end;
-
-
-begin
- filename := 'background.pict';
- open(infile, filename, ModeReadonly);
- read(infile, pic);
- close(infile);
-
- writeln('magic: ', pic.magic, ' mode:', pic.mode);
-
- loadPalette(pic);
- showPic(pic);
-
- open(infile, 'sprites.sprt', ModeReadOnly);
- loadSpriteFrame(santaSprite, 0, infile, 0);
- loadSpriteFrame(santaSprite, 1, infile, 1);
-
- loadSpriteFrame(deerSprite, 0, infile, 5);
- loadSpriteFrame(deerSprite, 1, infile, 6);
- loadSpriteFrame(deerSprite, 2, infile, 7);
-
- loadSpriteFrame(ohDeerSprite, 0, infile, 7);
- loadSpriteFrame(ohDeerSprite, 1, infile, 5);
- loadSpriteFrame(ohDeerSprite, 2, infile, 6);
-
- loadSpriteFrame(rudolfSprite, 0, infile, 3);
- loadSpriteFrame(rudolfSprite, 1, infile, 4);
- loadSpriteFrame(rudolfSprite, 2, infile, 2);
-
- loadSpriteFrame(smokeSprite, 0, infile, 8);
- loadSpriteFrame(smokeSprite, 1, infile, 9);
- loadSpriteFrame(smokeSprite, 2, infile, 10);
- loadSpriteFrame(smokeSprite, 3, infile, 11);
-
- close(infile);
-
- animate;
-end.
diff --git a/examples/xmas25.pas b/examples/xmas25.pas
deleted file mode 100644
index 1a7d8b5..0000000
--- a/examples/xmas25.pas
+++ /dev/null
@@ -1,251 +0,0 @@
-{$H2560}
-{$S8}
-program xmas252;
-uses pcmaudio, fastfire, tiles;
-
-const MAXX = FIREWIDTH;
- MAXY = FIREHEIGHT;
-
-(* type PixelData = array[0..31999] of integer; *)
-
-type Picture = record
- magic:integer;
- mode:integer;
- palette: array[0..15] of integer;
- pixels: PixelData;
- end;
-
-var firecells: FireBuf;
-
- firepalette: array [0..15] of integer =
- { ( $FFA, $FF8, $FF4, $FF0, $FE0, $FD0, $FA0, $F90,
- $F00, $E00, $D00, $A00, $800, $600, $300, $000); }
- { ( $FFA, $FFA, $FFA, $FFA, $FF0, $FF0, $FF0, $FF0, }
- ( $00F, $00F, $00F, $00F, $00F, $00F, $00F, $00F,
- $FF0, $FD0, $FA0, $C00, $A00, $700, $400, $000);
- x,y:integer;
- infile:file;
- pic:^Picture;
- tilesheet:^Picture;
- animationTick:integer;
- animationHold:integer;
- animationState:integer;
-
- filename: string;
-
- audiodata: SndBufPtr;
-
-procedure createPalette;
-var i:integer;
-begin
- for i := 15 downto 0 do
- setpalette(15 - i, firepalette[i]);
-end;
-
-procedure fireItUp;
-var x,y:integer;
-begin
- y := MAXY - 1;
- for x := 1 to MAXX - 1 do
- firecells[y, x] := random and 127;
-end;
-
-
-procedure updateFire;
-var i,x,y:integer;
-begin
- for y := 0 to MAXY - 2 do
- for x := 1 to MAXX - 1 do
- begin
- i :=
- ((firecells[y + 1, x - 1]
- + firecells[y + 1, x]
- + firecells[y + 1, x + 1]
- + firecells[y + 2, x])
- ) shr 2;
- if i > 0 then
- i := i - 1;
- firecells[y, x] := i;
- end;
-end;
-
-procedure drawFire(startX,startY:integer);
-var x, y, col, col2:integer;
-begin
- for y := 0 to MAXY - 1 do
- begin
- x := 0;
- for col in firecells[y] do
- begin
- { scale and clamp color value }
- col2 := col shr 3;
- if col2 > FIREMAXCOLOR then col2 := FIREMAXCOLOR;
-
- putpixel(startX + x, startY + y, col2);
- x := x + 1;
- end;
- end;
-end;
-
-procedure readBackgroundPic(filename:string);
-var i:integer;
-begin
- open(infile, filename, ModeReadonly);
- read(infile, pic^);
- close(infile);
-
- for i := 0 to 15 do
- SetPalette(i, pic^.palette[i]);
-
- PutScreen(pic^.pixels);
-end;
-
-procedure animate;
-var tileSrcX,tilesrcY:integer;
-begin
- animationTick := animationTick + 1;
-
- if animationHold = 0 then
- animationHold := 40;
-
- if animationTick < animationHold then
- exit;
-
- animationTick := 0;
-
- case animationState of
- 0: begin
- tileSrcX := 0;
- tileSrcY := 0;
- animationHold := 40;
- end;
- 1: begin
- tileSrcX := 19;
- tileSrcY := 0;
- animationHold := 20;
-
- if random and 7 > 4 then
- animationState := -1;
- end;
- 2: begin
- tileSrcX := 38;
- tileSrcY := 0;
- animationHold := 2;
- end;
- 3: begin;
- tileSrcX := 57;
- tileSrcY := 0;
- animationHold := 2;
- end;
- 4: begin
- tileSrcX := 0;
- tileSrcY := 13;
- animationHold := 15;
- end;
- 5: begin
- tileSrcX := 57;
- tileSrcY := 0;
- animationHold := 2;
- end;
- 6: begin
- tileSrcX := 38;
- tileSrcY := 0;
- animationHold := 2;
- end;
- 7: begin
- tileSrcX := 0;
- tileSrcY := 0;
- animationHold := 2;
- animationState := -1;
- end;
- end;
-
- CopyTilesScr(tilesheet^.pixels,
- tileSrcX, tileSrcY,
- 34,34,
- 19,13);
-
- animationState := animationState + 1;
-end;
-
-
-procedure readTilesheet;
-var filename:string;
- i:integer;
-begin
- filename := 'tilesheet.pict';
- open(infile, filename, ModeReadonly);
- read(infile, tilesheet^);
- close(infile);
-end;
-
-function newAudioData(fname:string):SndBufPtr;
-var i,size:integer;
- c:char;
- buf:SndBufPtr;
- f:file;
-begin
- open(f, fname, ModeReadOnly);
- size := FileSize(f);
- new(buf, size);
-
- buf^ := '';
- write('Reading ', size, ' bytes...');
- for i := 1 to size do
- begin
- read(f,c);
- AppendChar(buf^,c);
- end;
- writeln;
-
- close(f);
-
- newAudioData := buf;
-end;
-
-
-begin
- if ParamCount > 0 then
- filename := ParamStr(1)
- else
- filename := 'xmas25bg.pict';
-
- Randomize;
-
- audiodata := newAudioData('fireplace-loop.tdrau');
-
- InitGraphics;
-
- new(pic);
- readBackgroundPic(filename);
-
- new(tilesheet);
- readTilesheet;
-
- SampleQStart(audiodata, true, 22050);
-
- while not ConAvail do
- begin
- fireItUp;
- FastFireUpdate(firecells);
- { updateFire; }
- FastFireDraw(firecells, 216, 165);
- { drawFire(216, 165); }
- animate;
- end;
-
- SampleQStop;
-
- for y := 0 to MAXY do
- begin
- x := firecells[y, 10];
- drawline(0, y, x, y, 1);
-
- end;
-
- InitGraphics;
-
- dispose(tilesheet);
- dispose(pic);
- dispose(audiodata);
-end.
diff --git a/lib/corelib.s b/lib/corelib.s
index 1ac12e9..57f35a8 100644
--- a/lib/corelib.s
+++ b/lib/corelib.s
@@ -588,19 +588,13 @@ DIVU_END:
; wait approx. 1 millisecond
;
-; the ROM at address 4
-; contains the cpu clock freq in KHz
- .EQU CLK_KHZ_ADDR 4
+; 83.333 MHz Clock, three instructions a 4 cycles
+; 83333 / 12 = 6944.4166
+; works only if executed without wait states (i.e.
+; from BRAM/SRAM)
WAIT1MSEC:
- LOADC CLK_KHZ_ADDR
- LOADI
- ; divide by 16
- SHR
- SHR
- SHR
- SHR
+ LOADCP 6944
WAIT1LOOP:
- INC 0 ; NOP to make the loop 16 cycles long
DEC 1
DUP
CBRANCH.NZ WAIT1LOOP
@@ -612,9 +606,6 @@ WAIT1LOOP:
; length must be multiple of wordsize.
; if it is not, the last (partial) word is not cleared.
_CLEARMEM:
- OVER ; check for null pointer
- CBRANCH.Z CLEARMEM_X
-
SHR
SHR ; calculate length in words
@@ -701,37 +692,113 @@ CMPWORDS_XT2:
; --------- Graphics Library ---------------
; vga controller registers
.EQU FB_RA $900
- .EQU FB_WA $904
- .EQU FB_IO $908
- .EQU FB_PS $90C
- .EQU FB_PD $910
- .EQU FB_CTL $914
- .EQU FB_SHIFTER $918
- .EQU FB_SHIFTCOUNT $91C
- .EQU FB_SHIFTERM $920
- .EQU FB_SHIFTERSP $924
- .EQU FB_MASKGEN $928
+ .EQU FB_WA $901
+ .EQU FB_IO $902
+ .EQU FB_PS $903
+ .EQU FB_PD $904
+ .EQU FB_CTL $905
+; set a pixel in fb memory
+; parameters: x,y - coordinates
+PUTPIXEL_1BPP:
+ ; calculate vmem address:
+ OVER ; duplicate x
+ ; divide x by 32
+ SHR
+ SHR
+ SHR
+ SHR
+ SHR
+ SWAP
+ ; multiply y by words per line
+ SHL 2
+ SHL 2
+ SHL
-; draw a single pixel
-; args: x, y, color
+ ADD ; add results together for vmem addr
+ DUP
+ LOADCP FB_WA
+ SWAP
+ STOREI ; store to framebuffer write addr register
+ DROP
+ LOADCP FB_RA ; and to framebuffer read addr register
+ SWAP
+ STOREI
+ DROP
+
+ ; x is now at top of stack
+ ; get bit value from x modulo 32
+ LOADC 31
+ AND
+ SHL 2 ; (x & 31) * 4 = offset into table
+ LOADCP INT_TO_PIX_TABLE
+ ADD
+ LOADI
+
+ LOADCP FB_IO
+ ; read old vmem value
+ LOADCP FB_IO
+ LOADI
+ ; or in new bit
+ OR
+ ; write new value
+ STOREI
+ DROP
+
+ RET
+
+INT_TO_PIX_TABLE:
+ .WORD %10000000_00000000_00000000_00000000
+ .WORD %01000000_00000000_00000000_00000000
+ .WORD %00100000_00000000_00000000_00000000
+ .WORD %00010000_00000000_00000000_00000000
+ .WORD %00001000_00000000_00000000_00000000
+ .WORD %00000100_00000000_00000000_00000000
+ .WORD %00000010_00000000_00000000_00000000
+ .WORD %00000001_00000000_00000000_00000000
+ .WORD %00000000_10000000_00000000_00000000
+ .WORD %00000000_01000000_00000000_00000000
+ .WORD %00000000_00100000_00000000_00000000
+ .WORD %00000000_00010000_00000000_00000000
+ .WORD %00000000_00001000_00000000_00000000
+ .WORD %00000000_00000100_00000000_00000000
+ .WORD %00000000_00000010_00000000_00000000
+ .WORD %00000000_00000001_00000000_00000000
+ .WORD %00000000_00000000_10000000_00000000
+ .WORD %00000000_00000000_01000000_00000000
+ .WORD %00000000_00000000_00100000_00000000
+ .WORD %00000000_00000000_00010000_00000000
+ .WORD %00000000_00000000_00001000_00000000
+ .WORD %00000000_00000000_00000100_00000000
+ .WORD %00000000_00000000_00000010_00000000
+ .WORD %00000000_00000000_00000001_00000000
+ .WORD %00000000_00000000_00000000_10000000
+ .WORD %00000000_00000000_00000000_01000000
+ .WORD %00000000_00000000_00000000_00100000
+ .WORD %00000000_00000000_00000000_00010000
+ .WORD %00000000_00000000_00000000_00001000
+ .WORD %00000000_00000000_00000000_00000100
+ .WORD %00000000_00000000_00000000_00000010
+ .WORD %00000000_00000000_00000000_00000001
+
+PUTMPIXEL:
+ LOADC 1
+; set a pixel in fb memory
+; parameters: x,y,color - coordinates, color value (0-15)
PUTPIXEL:
PUTPIXEL_4BPP:
.EQU PUTPIXEL_X 0
.EQU PUTPIXEL_Y 4
.EQU PUTPIXEL_COLOR 8
- .EQU PUTPIXEL_BPSAV 12
+ .EQU PUTPIXEL_PIXPOS 12
.EQU PUTPIXEL_FS 16
FPADJ -PUTPIXEL_FS
+
STORE PUTPIXEL_COLOR
STORE PUTPIXEL_Y
STORE PUTPIXEL_X
- LOADREG BP
- STORE PUTPIXEL_BPSAV
- LOADC 0
- STOREREG BP
; calculate vmem address: (x / 8) + (y * 80)
LOAD PUTPIXEL_X
@@ -746,60 +813,86 @@ PUTPIXEL_4BPP:
SHL 2 ; * 16
DUP
SHL 2; * 64
- ADD ; y*16 + y*64
+ ADD ; x*16 + x*64
ADD ; add results together for vmem addr
- DUP
- STORE.B FB_WA ; set as write and read addresses
- STORE.B FB_RA
+ LOADCP FB_WA
+ OVER
+ STOREI ; store to framebuffer write addr register
+ DROP
+ LOADCP FB_RA ; and to framebuffer read addr register
+ SWAP ; swap addr and value for STOREI
+ STOREI
+ DROP
+
+ LOAD PUTPIXEL_X
+ ; |0000.0000|0000.0000|0000.0000|0000.1111|
+ LOADC 7
+ AND ; calculate pixel position in word
+ LOADC 7
+ SWAP
+ SUB ; pixpos = 7 - (x & 7)
+ STORE PUTPIXEL_PIXPOS
LOAD PUTPIXEL_COLOR
- CBRANCH.Z PUTPX_CLR ; color 0 is special case
-
- ; create pixel data from color value in
- ; leftmost pixel data bits (31-28)
- LOADC 0
- LOAD PUTPIXEL_COLOR
- BPLC
+ LOAD PUTPIXEL_PIXPOS
+ SHR ; rcount = pixpos / 2
+ROTLOOP_:
+ DUP ; exit loop if rcount is 0
+ CBRANCH.Z ROTLOOP_END
+ SWAP ; pixel value is now on top of stack
+ BROT ; value = value << 8
+ SWAP ; rcount is now on top of stack
+ DEC 1 ; rcount = rcount - 1
+ BRANCH ROTLOOP_
+ROTLOOP_END:
+ DROP ; drop rcount
+ ; shifted pixel value is now at top of stack
+ LOAD PUTPIXEL_PIXPOS
+ LOADC 1
+ AND
+ CBRANCH.Z EVEN_PIXPOS
+ SHL 2 ; if pixpos is odd, shift by 4 bits
SHL 2
- SHL 2
- STORE.B FB_SHIFTER ; store pixel into shifter
+EVEN_PIXPOS:
+ LOAD PUTPIXEL_X
+ ; get bit value from x modulo 8
+ LOADC 7
+ AND
+ SHL 2 ; (x & 7) * 4 = offset into table
+ LOADCP INT_TO_MASK_TABLE
+ ADD
+ LOADI
- LOAD PUTPIXEL_X ; use x coord as shift count
- STORE.B FB_SHIFTCOUNT ; writing triggers shifting
+ ; read old vmem value
+ LOADCP FB_IO
+ LOADI
+ ; mask bits
+ AND
+ ; or in shifted pixel value
+ OR
- LOAD.B FB_SHIFTERM ; get shift result as mask
- NOT ; invert to get background mask
- LOAD.B FB_IO ; get background pixel data
- AND ; remove bits for new pixel from bg
-
- LOAD.B FB_SHIFTER ; load shifted pixel
- OR ; OR in new pixel bits
- STORE.B FB_IO ; write new pixel data word to vmem
-
-PUTPX_XT:
- LOAD PUTPIXEL_BPSAV
- STOREREG BP
+ ; write new value
+ LOADCP FB_IO
+ SWAP
+ STOREI
+ DROP
FPADJ PUTPIXEL_FS
RET
-PUTPX_CLR:
- LOADCP $F0000000 ; mask for leftmost pixel
- STORE.B FB_SHIFTER ; shift accordingly
- LOAD PUTPIXEL_X
- STORE.B FB_SHIFTCOUNT
-
- LOAD.B FB_SHIFTER ; get shifted value
- NOT ; invert for real mask
- LOAD.B FB_IO ; get background pixels
- AND ; clear pixel with mask
- STORE.B FB_IO ; no need to OR in new pixel, just store to vmem
-
- BRANCH PUTPX_XT
-
+ .CPOOL
+INT_TO_MASK_TABLE:
+ .WORD %00001111_11111111_11111111_11111111
+ .WORD %11110000_11111111_11111111_11111111
+ .WORD %11111111_00001111_11111111_11111111
+ .WORD %11111111_11110000_11111111_11111111
+ .WORD %11111111_11111111_00001111_11111111
+ .WORD %11111111_11111111_11110000_11111111
+ .WORD %11111111_11111111_11111111_00001111
+ .WORD %11111111_11111111_11111111_11110000
; draw a line between two points
; parameters: x0, y0, x1, y1, color
diff --git a/lib/pcmaudio.inc b/lib/pcmaudio.inc
deleted file mode 100644
index dc1dbba..0000000
--- a/lib/pcmaudio.inc
+++ /dev/null
@@ -1,7 +0,0 @@
-type SndBuf = string[32768];
-type SndBufPtr = ^SndBuf;
-
-procedure PlaySample(buf:SndBufPtr;sampleRate:integer); external;
-procedure SampleQStart(buf:SndBufPtr;loop:boolean;sampleRate:integer); external;
-procedure SampleQStop; external;
-function SampleQSize:integer; external;
diff --git a/lib/pcmaudio.s b/lib/pcmaudio.s
deleted file mode 100644
index ebe812a..0000000
--- a/lib/pcmaudio.s
+++ /dev/null
@@ -1,304 +0,0 @@
- .EQU AUDIO_BASE $A00
- .EQU IRQC_REG $980
- .EQU IRQC_EN $80
- .EQU CPU_FREQ 77000000
-
-; args: sample rate
-START_PCMAUDIO:
- ; calculate clock divider
- LOADCP CPU_FREQ
- SWAP
- LOADCP _DIV
- CALL
-
- LOADC AUDIO_BASE + 4
- SWAP ; put clock divider on ToS
- STOREI 4
- LOADCP 32768 ; set amplitude to biased 0
- STOREI
- DROP
-
- LOADC AUDIO_BASE
- LOADC 1 ; enable channel
- STOREI
- DROP
- RET
-
-STOP_AUDIO:
- LOADC AUDIO_BASE
- LOADC 0
- STOREI
- DROP
- RET
-
-; args: pointer to pascal string, sample rate
- .EQU PS_PTR 0
- .EQU PS_COUNT 4
- .EQU PS_FS 12
-PLAYSAMPLE:
- FPADJ -PS_FS
-
- LOADCP START_PCMAUDIO
- CALL
-
- DUP
- LOADI ; get string size from header
- SHR ; divide by 4 to get word count
- SHR
-
- STORE PS_COUNT
- INC 8 ; skip rest of header
- STORE PS_PTR ; store sample data pointer
-
-PS_L0:
- LOAD PS_PTR ; load pointer
- INC.S1.X2Y 4 ; increment and keep old value
- STORE PS_PTR ; store incremented value
-
- LOADI ; load 32 bit word
- DUP
- BROT ; get upper 16 bit word
- BROT
- LOADCP $FFFF
- AND
-
- LOADCP PLAY_1SAMPLE
- CALL
-
- LOADCP $FFFF ; get lower 16 bit word
- AND
- LOADCP PLAY_1SAMPLE
- CALL
-
- LOAD PS_COUNT ; load word count
- DEC 1 ; decrement
- DUP
- STORE PS_COUNT
- CBRANCH.NZ PS_L0 ; loop if not zero
-
- LOADCP STOP_AUDIO
- CALL
-
- FPADJ PS_FS
- RET
-
-; play one sample, waiting
-; for the clock divider, which
-; is visible via the phase flag
-; args: 16-bit unsigned sample
-PLAY_1SAMPLE:
-
-PLAY1_L0:
- LOADC AUDIO_BASE
- LOADI
- LOADC 8 ; get fifo_full flag
- AND
- CBRANCH.NZ PLAY1_L0 ; loop if fifo is full
-
- LOADC AUDIO_BASE+8 ; store amplitude value
- SWAP
- STOREI
- DROP
- RET
-
-; set sample queue count and pointer from string header
-; args: pointer to string/SndBufPtr
-_STR2SMPLQPTR:
- LOADCP SMPLQ_COUNT
- OVER
- LOADI ; get string size from header
- SHR ; divide by 4 to get word count
- SHR
- STOREI
- DROP
-
- LOADCP SMPLQ_PTR
- SWAP
- INC 8 ; skip rest of header
- STOREI ; store sample data pointer
- DROP
- RET
-
-; start interrupt-driven sample playback
-; args: pointer to pascal string, loop flag, sample rate
-SAMPLEQSTART:
- LOADCP START_PCMAUDIO ; sample rate is on ToS as arg to subroutine
- CALL
-
- SWAP ; swap loop flag and buf ptr
-
- LOADCP _STR2SMPLQPTR
- CALL
-
- ; loop flag is now on ToS
- CBRANCH.Z SQ_S_1
- ; if nonzero, set loop ptr
- LOADCP SMPLQ_PTR
- LOADI
- DEC 8 ; subtract offset for string header again
- BRANCH SQ_S_0
-SQ_S_1:
- LOADC 0
-SQ_S_0:
- LOADCP SMPLQ_NEXT
- SWAP
- STOREI
- DROP
-
- LOADC AUDIO_BASE
- LOADC 17 ; enable channel, enable interrupt
- STOREI
- DROP
-
- LOADCP SMPLQ_ISR ; set interrupt handler
- STOREREG IV
-
- LOADC IRQC_REG ; enable irq
- LOADC IRQC_EN
- STOREI
- DROP
-
- RET
-
-SAMPLEQSTOP:
- LOADCP SMPLQ_PTR
- LOADC 0
- STOREI
- DROP
-
- LOADCP STOP_AUDIO
- CALL
-
- LOADC IRQC_REG ; disable irq
- LOADC 0
- STOREI
- DROP
- RET
-
-SAMPLEQSIZE:
- LOADCP SMPLQ_COUNT
- LOADI
- RET
-
-SMPLQ_PTR: .WORD 0
-SMPLQ_COUNT: .WORD 0
-SMPLQ_NEXT: .WORD 0
-
-SMPLQ_ISR:
- LOADC IRQC_REG
- LOADI
- LOADC 4 ; check for audio interrupt
- AND
- CBRANCH.Z SMPLQ_I_XT ; if flag not set, exit
-
-SMPLQ_I_L:
- LOADCP SMPLQ_PTR
- LOADI ; load word pointer
- DUP
- CBRANCH.NZ SMPLQ_I_B ; check for null pointer
- DROP
- BRANCH SMPLQ_I_XT ; if null, end interrupt routine
-SMPLQ_I_B:
- LOADI ; load next word which contains two samples
- DUP
-
- BROT ; get high half-word
- BROT
- LOADCP $FFFF
- AND
-
- LOADC AUDIO_BASE+8
- SWAP
- STOREI ; write sample, keep addr
-
- SWAP ; addr to NoS, lower halfword on ToS
- LOADCP $FFFF
- AND
- STOREI ; write sample
- DROP
-
- ; decrement word count
- LOADCP SMPLQ_COUNT
- LOADI.S1.X2Y ; load counter, keep addr
- DEC 1
- DUP
- CBRANCH.Z SMPLQ_I_END ; end if zero
-
- STOREI ; store new counter value
- DROP
-
- ; increment pointer
- LOADCP SMPLQ_PTR
- LOADI.S1.X2Y
- INC 4
- STOREI
- DROP
-
- ; put up to 16 samples into the sample queue
- LOADCP SMPLQ_COUNT
- LOADI ; load word counter again
- LOADC 7 ; check if count modulo 7 = 0
- AND
- CBRANCH.NZ SMPLQ_I_L ; if not, next two samples
-
- ; check if fifo is full
- ; does not work reliably when running in DRAM,
- ; maybe because at least one sample has already played
- ; since start of ISR?
-; LOADC AUDIO_BASE
-; LOADI
-; LOADC 8 ; fifo_full
-; AND
-; CBRANCH.Z SMPLQ_I_L ; next sample if not full
-
- BRANCH SMPLQ_I_XT
-
- ; end of sample buffer, check for next
-SMPLQ_I_END:
- DROP
- DROP
-
- LOADCP SMPLQ_NEXT ; skip to end
- LOADI ; if NEXT ptr is zero
- DUP
- CBRANCH.Z SMPLQ_I_END1
-
- LOADCP _STR2SMPLQPTR
- CALL
-
- BRANCH SMPLQ_I_XT
-
- ; end playback, set ptr and counter to zero
-SMPLQ_I_END1:
- DROP
- LOADCP SMPLQ_PTR
- LOADC 0
- STOREI
- DROP
- LOADCP SMPLQ_COUNT
- LOADC 0
- STOREI
- DROP
-
- ; set amplitude out to zero (biased)
- LOADC AUDIO_BASE+8
- LOADCP 32768
- STOREI
- DROP
-
- ; exit without enabling interrupts for this channel
- BRANCH SMPLQ_I_XT2
-
-SMPLQ_I_XT:
- LOADC AUDIO_BASE
- LOADC 17 ; re-enable channel interrupt
- STOREI
- DROP
-
-SMPLQ_I_XT2:
- LOADC IRQC_REG ; re-enable interrupts
- LOADC IRQC_EN
- STOREI
- DROP
- LOADREG IR ; jump via interrupt return register
- JUMP
diff --git a/lib/rommon.s b/lib/rommon.s
index a1034c5..a967e4b 100644
--- a/lib/rommon.s
+++ b/lib/rommon.s
@@ -7,16 +7,8 @@
.EQU UART_REG 2048
.EQU MON_ADDR 64512
- .EQU CLK_KHZ 76923
-
BRANCH 2 ; the very first instruction is not
; executed correctly
- BRANCH MON_START ; branch over constant
-
-CLK_KHZ_ADDR:
- .WORD CLK_KHZ ; to calibrate the delay loop
-
-MON_START:
LOADCP 65020 ; initialise FP and RP registers
STOREREG FP
LOADCP 65024
@@ -790,17 +782,13 @@ COPY_BLK1:
; wait approx. 1 millisecond
;
+; 83.333 MHz Clock, three instructions a 4 cycles
+; 83333 / 12 = 6944.4166
+; works only if executed without wait states (i.e.
+; from BRAM/SRAM)
WAIT1MSEC:
- ; get clock freq in khz
- LOADC CLK_KHZ_ADDR
- LOADI
- ; divide by 16
- SHR
- SHR
- SHR
- SHR
+ LOADCP 6944
WAIT1LOOP:
- INC 0 ; NOP to make loop 16 cycles long
DEC 1
DUP
CBRANCH.NZ WAIT1LOOP
@@ -810,7 +798,7 @@ WAIT1LOOP:
%include "sdcardboot.s"
.CPOOL
MESSAGE:
- .BYTE 13,10,"ROM Monitor v3.1.0", 13, 10,
+ .BYTE 13,10,"ROM Monitor v3.0.3", 13, 10,
"Set A)ddress D)eposit eX)amine L)oad G)o B)oot",13,10,0
PROMPT2:
.BYTE "]> ",0
diff --git a/lib/runtime.s b/lib/runtime.s
index 9eb35d7..f4ad875 100644
--- a/lib/runtime.s
+++ b/lib/runtime.s
@@ -1616,7 +1616,7 @@ MEM_FREE_XT:
; Since the return stack is no longer valid afterwards, directly
; jumps to _MAIN instead of using RET.
-; parameters: [ start of heap address ]
+; parameters: [ _MAIN entry point, start of heap address ]
_MEM_INIT:
; initialize anchor chunk with start of heap address
; and heap size - header size
@@ -1764,34 +1764,6 @@ MEM_DUMP_L0:
DROP
RET
-; calculate total free heap space
-; args: none
-; returns: cumulative size of all free chunks in bytes
-MEMAVAIL:
- FPADJ -4
- LOADC 0
- STORE 0 ; start with zero as result
-
- LOADCP _HEAP_ANCHOR
-MAV_L:
- DUP ; dup chunk ptr for later
- INC 4 ; move to size field
- LOADI ; load chunk size
- LOAD 0 ; add to current result value
- ADD
- STORE 0
-
- LOADI ; load next ptr
- DUP
- LOADCP _HEAP_ANCHOR ; compare with anchor
- CMPU NE
- CBRANCH MAV_L ; if not equal, loop
-MAX_XT:
- DROP ; drop chunk ptr
- LOAD 0 ; put result value on stack
- FPADJ 4
- RET
-
; check if a pointer is part of the free list
; args: pointer returned by MEM_ALLOC
; throws runtime error if the pointer is found
@@ -1931,12 +1903,6 @@ _CLEARESTACK_XT:
; Terminate program: clear estack and
; jump to coreloader
PTERM:
- ; just to be safe, disable interrupts
- LOADC $980
- LOADC 0
- STOREI
- DROP
-
LOADCP _CLEARESTACK
CALL
LOADCP LOADER_START
diff --git a/lib/sdcardlib.s b/lib/sdcardlib.s
index eca85d4..9b45e05 100644
--- a/lib/sdcardlib.s
+++ b/lib/sdcardlib.s
@@ -264,8 +264,8 @@ CARD_OK:
; set fast transfer rate
CARDFASTCLK:
LOADC SPIREG
- ; set clock divider to ~2.75MHz
- LOADCP SPI_CLK_DIV_WR,7 ; using the LOADCP with offset syntax here
+ ; set clock divider to ~2,6MHz
+ LOADCP SPI_CLK_DIV_WR,10 ; using the LOADCP with offset syntax here
STOREI
DROP
RET
diff --git a/lib/stdlib.inc b/lib/stdlib.inc
index 5304403..ee107b3 100644
--- a/lib/stdlib.inc
+++ b/lib/stdlib.inc
@@ -18,9 +18,8 @@ const IONoError = 0;
IOReadOnly = 8;
IOInvalidOp = 9;
IOInvalidFormat = 10;
- IONoMem = 11;
- IOUserIntr = 12;
- IOMaxErr = 12;
+ IOUserIntr = 11;
+ IOMaxErr = 11;
const PArgMax = 7;
@@ -149,11 +148,10 @@ procedure appendchar(var s:string; aChar:char); external;
procedure strmoveup(var s:string;index,length,delta:integer); external;
procedure strmovedown(var s:string;index,length,delta:integer); external;
procedure RuntimeError(var s:string); external;
-function MemAvail:integer; external;
(* from stdlib *)
-function copy(s:string[256];index,count:integer):string[256]; external;
-procedure insert(ins:string[256]; var dest:string[256]; position:integer); external;
+function copy(s:string;index,count:integer):string; external;
+procedure insert(ins: string; var dest: string; position:integer); external;
procedure delete(var s:string; from:integer; count:integer); external;
function pos(substr:string;var s:string):integer; external;
function pwroften(exp:integer):real; external;
@@ -207,7 +205,7 @@ procedure readvolumeblks(volumeid:integer; destbuf:^iobuffer; blkno:integer; blk
procedure writevolumeblks(volumeid:integer; srcbuf:^iobuffer; blkno:integer; blkCount: integer; var error:integer);
external;
function findvolume(name:string):integer; external;
-procedure openvolumeid(volid:integer;var error:integer); external;
+procedure openvolumeid(volid:integer); external;
procedure closevolumeid(volid:integer); external;
function IOResult(var fil:file):integer; external;
function ErrorStr(err:integer):string; external;
@@ -242,7 +240,6 @@ procedure freadreal(var v:real;var f:file); external;
procedure openchannel(name:filenamestr; var f:file; mode:filemode; var error:integer); external;
procedure open(var f:file; name:pathnamestr; mode: filemode); external;
procedure noecho(var f:file; noecho:boolean; var old:boolean); external;
-procedure nointr(var f:file; aBool:boolean; var old:boolean); external;
procedure intstr(v:integer; fieldWith:integer; var rbuf:string);
external;
@@ -272,8 +269,8 @@ procedure TextDefault; external;
procedure PTerm; external; (* from runtime.s *)
procedure PExec(prgfile:pathnamestr; var args:PArgVec; argCount:integer;var error:integer); external;
-procedure PExec1(prgfile:pathnamestr; arg1:string; var error:integer); external;
-procedure PExec2(prgfile:pathnamestr; arg1, arg2:string; var error:integer); external;
+procedure PExec2(prgfile:pathnamestr; arg1:string; var error:integer); external;
+procedure PExec3(prgfile:pathnamestr; arg1, arg2:string; var error:integer); external;
function ParamStr(i:integer):string; external;
function ParamCount():integer; external;
diff --git a/lib/stdlib.pas b/lib/stdlib.pas
index 84025b3..c1da7de 100644
--- a/lib/stdlib.pas
+++ b/lib/stdlib.pas
@@ -26,9 +26,8 @@ const IONoError = 0;
IOReadOnly = 8;
IOInvalidOp = 9;
IOInvalidFormat = 10;
- IONoMem = 11;
- IOUserIntr = 12;
- IOMaxErr = 12;
+ IOUserIntr = 11;
+ IOMaxErr = 11;
const PArgMax = 7;
@@ -48,7 +47,7 @@ type file = record
ateof:boolean;
noecho:boolean; (* read chars are not echoed *)
raw:boolean; (* turn off backspace processing on input, CR processing on output *)
- nointr:boolean); (* turn off keyboard interrupt character processing *)
+ nointr: boolean); (* turn off keyboard interrupt character processing *)
IODiskFile: (volumeid: integer;fileno: integer; filpos:integer; bufStart:integer;
size:integer; sizeExtents:integer;
@@ -134,7 +133,7 @@ var DefaultVolumeId:integer;
character to the runtime error routine
which takes null-terminated strings.
*)
-var ioerrordesc: array [0..IOMaxErr] of string[20] = (
+var ioerrordesc: array [0..11] of string[20] = (
'No error',
'File not found',
'Volume not found',
@@ -146,14 +145,13 @@ var ioerrordesc: array [0..IOMaxErr] of string[20] = (
'File is readonly',
'Invalid operation',
'Invalid format',
- 'Not enough memory',
'Interrupted by user'
);
matherror:string[38] = 'Invalid argument to sqrt/ln/tan/cotan';
pexecerror:string[28]= 'Invalid arguments for PExec';
- random_state:integer = -42;
+ random_state:integer;
PArgs:array [0..PArgMax] of string external;
PArgCount:integer external;
@@ -404,7 +402,7 @@ begin
GetCurTimestamp := GetTimestamp(now);
end;
-function copy(s:string[256];index,count:integer):string[256];
+function copy(s:string;index,count:integer):string;
var len:integer;
begin
copy := '';
@@ -418,7 +416,7 @@ begin
end;
end;
-procedure insert(ins:string[256]; var dest:string[256]; position:integer);
+procedure insert(ins: string; var dest: string; position:integer);
var i,count,from,to_:integer;
begin
if position < 1 then position := 1;
@@ -482,9 +480,6 @@ end;
That means you cannot use pos to search inside a string
literal. Hopefully this is not something you want to do.
*)
-
-(* TODO: UCSD-Pascal and TP3.0 specs say, searched string
- is a string expression so cannot be var parameter *)
function pos(substr:string;var s:string):integer;
var substrlen:integer;
slen:integer;
@@ -1185,17 +1180,7 @@ ext:
code := 0;
end
else
- begin
- if i = 1 then (* empty string gives error position 1 *)
- code := 1
- else
- code := i - 1;
- end;
-end;
-
-procedure errorhalt(var fil:file);
-begin
- RuntimeError(ioerrordesc[fil.lastError]);
+ code := i - 1;
end;
procedure checkerror(var fil:file);
@@ -1203,7 +1188,7 @@ begin
if fil.lastError <> 0 then
begin
if not fil.errorAck then
- errorhalt(fil)
+ RuntimeError(ioerrordesc[fil.lastError])
else
begin
fil.lastError := 0;
@@ -1346,16 +1331,12 @@ procedure freadreal(var v:real;var f:file);
var buf:string[40];
errpos:integer;
begin
- errpos := -1;
fskipwhite(f);
fscanbuf(f,ScanReal, buf);
if f.lastError = 0 then
val(buf, v, errpos);
if errpos <> 0 then
- begin
fileerror(f, IOInvalidFormat);
- checkerror(f);
- end;
end;
procedure freadstring(var s:string; var f:file);
@@ -1368,7 +1349,7 @@ var aChar:char;
begin
repeat
aChar := freadchar(aFile);
- until eoln(aFile); (* eoln checks for cr, lf and eof *)
+ until (aChar = #13) or eof(aFile);
(*
If it is a disk file, try to read the
@@ -1556,17 +1537,13 @@ begin
end;
end;
-procedure openvolumeid(volid:integer;var error:integer);
+procedure openvolumeid(volid:integer);
begin
- error := 0;
with volumeTable[volid] do
begin
if dirCache = nil then
- newOrNil(dirCache);
- if dirCache <> nil then
- openFilesCount := openFilesCount + 1
- else
- error := IONoMem;
+ new(dirCache);
+ openFilesCount := openFilesCount + 1;
end;
end;
@@ -1685,21 +1662,12 @@ begin
{ writeln(' readbuf data: ', fil.buffer^[0][0]); }
end;
-procedure close(var aFile:file); forward;
-
-(* Set error state on file and close it.
- Buffer will not be flushed as that might
- have caused the error.
-*)
procedure fileerror(var fil:file; error:integer);
begin
+ (* should check if there was an error already
+ and throw a runtime error in that case *)
fil.lastError := error;
fil.errorAck := false;
- if fil.buffer <> nil then
- begin
- fil.needsflush := false;
- close(fil);
- end;
end;
function IOResult(var fil:file):integer;
@@ -1844,8 +1812,6 @@ end;
function filesize(var fil:file):integer;
begin
- checkerror(fil);
-
if fil.typ = IOChannel then
filesize := -1
else
@@ -2044,28 +2010,23 @@ begin
aFile.typ := IODiskFile;
aFile.mode := mode;
- newOrNil(aFile.buffer);
- if aFile.buffer = nil then
- fileerror(aFile, IONoMem)
- else
- begin
- aFile.bufpos := 0;
- aFile.bufsize := DefaultBufSize;
- aFile.needsflush := false;
- aFile.changed := false;
- aFile.lastError := 0;
- aFile.errorAck := false;
- aFile.volumeid := volid;
- aFile.fileno := slotno;
- aFile.filpos := 0;
- aFile.bufStart := 1;
- aFile.size := dirslot.sizeBytes;
- aFile.sizeExtents := dirslot.sizeBytes div extentSize + 1;
- aFile.bufBlocks := DefaultBufBlocks;
- aFile.extentBlocks := extentSize div 512;
+ new(aFile.buffer);
+ aFile.bufpos := 0;
+ aFile.bufsize := DefaultBufSize;
+ aFile.needsflush := false;
+ aFile.changed := false;
+ aFile.lastError := 0;
+ aFile.errorAck := false;
+ aFile.volumeid := volid;
+ aFile.fileno := slotno;
+ aFile.filpos := 0;
+ aFile.bufStart := 1;
+ aFile.size := dirslot.sizeBytes;
+ aFile.sizeExtents := dirslot.sizeBytes div extentSize + 1;
+ aFile.bufBlocks := DefaultBufBlocks;
+ aFile.extentBlocks := extentSize div 512;
- seek(aFile,0);
- end;
+ seek(aFile,0);
end;
procedure updatedirslot(var aFile:file);
@@ -2088,22 +2049,19 @@ procedure close(var aFile:file);
begin
if aFile.typ = IODiskFile then
begin
- if aFile.lastError = IOFileClosed then
- errorhalt(aFile);
{ writeln('close needsflush:', aFile.needsflush, ' changed:', aFile.changed, ' error:', aFile.lastError); }
if aFile.needsflush then
flushfile(aFile);
-
- { writeln('close f.buffer:', aFile.buffer); }
- dispose(aFile.buffer);
- aFile.buffer := nil;
-
if aFile.lastError = 0 then
begin
+ fileerror(aFile, IOFileClosed);
+ { writeln('close f.buffer:', aFile.buffer); }
+ dispose(aFile.buffer);
+ aFile.buffer := nil;
+
if aFile.changed then
updatedirslot(aFile);
- if aFile.lastError = 0 then
- fileerror(aFile, IOFileClosed);
+
end;
closevolumeid(aFile.volumeid);
@@ -2282,9 +2240,8 @@ begin
if volid > 0 then
begin
- openvolumeid(volid, error);
- if error = 0 then
- slotno := findfile(volid, fname, dirs, error)
+ openvolumeid(volid);
+ slotno := findfile(volid, fname, dirs, error)
end
else
error := IOVolNotFound;
@@ -2603,16 +2560,6 @@ begin
end;
end;
-procedure nointr(var f:file;aBool:boolean;var old:boolean);
-begin
- if f.typ <> IOChannel then
- fileerror(f, IOInvalidOp)
- else
- begin
- old := f.nointr;
- f.nointr := aBool;
- end;
-end;
(*
implementation of Xorshift algorithm by George Marsaglia,
see: Marsaglia, George (July 2003).
@@ -2649,7 +2596,6 @@ begin
if ord(aChar) <= ord('z') then
upcase := chr(ord(aChar) - 32)
else
- upcase := aChar
else
upcase := aChar;
end;
@@ -2715,14 +2661,14 @@ begin
end;
end;
-procedure PExec1(prgfile:pathnamestr; arg1:string; var error:integer);
+procedure PExec2(prgfile:pathnamestr; arg1:string; var error:integer);
var args:PArgVec;
begin
args[0] := arg1;
PExec(prgfile, args, 1, error);
end;
-procedure PExec2(prgfile:pathnamestr; arg1, arg2:string; var error:integer);
+procedure PExec3(prgfile:pathnamestr; arg1, arg2:string; var error:integer);
var args:PArgVec;
begin
args[0] := arg1;
diff --git a/pcomp/Makefile b/pcomp/Makefile
index 4afc3ef..3f6473d 100644
--- a/pcomp/Makefile
+++ b/pcomp/Makefile
@@ -1,45 +1,47 @@
PCOMP=./pcomp
SASM=./sasm
LSYMGEN=./lsymgen
+LIBGEN=./libgen
.SUFFIXES:
-.SUFFIXES: .pas .o .s .prog
-
-.pas.s:
- $(PCOMP) $<
-.s.prog:
- $(SASM) $<
+.SUFFIXES: .pas .o
.pas:
fpc -Mobjfpc -gl $<
-all: libs pcomp sasm sdis lsymgen shortgen nativecomp nativeprogs
+all: pcomp sasm sdis libgen lsymgen
-libs: pcomp sasm lsymgen shortgen
+libs: pcomp sasm lsymgen libgen
$(SASM) ../lib/coreloader.s
$(LSYMGEN) ../lib/coreloader.sym
$(PCOMP) -n ../lib/stdlib.pas
- $(SASM) ../lib/stdlibwrap.s ../lib/stdlib.lib
- $(LSYMGEN) ../lib/stdlibwrap.sym ../lib/stdlib.lsym
+ $(LIBGEN) ../lib/stdlib.s
+ $(LIBGEN) ../lib/runtime.s
+ $(LIBGEN) ../lib/float32.s
-test: libs sasm.s pcomp.s lsymgen.s shortgen.s
+nativecomp: pcomp sasm libs
+ $(PCOMP) sasm.pas
+ $(PCOMP) pcomp.pas
+ $(PCOMP) lsymgen.pas
+ $(PCOMP) libgen.pas
-testprgs: libs sasm.prog pcomp.prog lsymgen.prog shortgen.prog
-
-nativecomp: libs pcomp.prog sasm.prog lsymgen.prog shortgen.prog
-
-nativeprogs: pcomp ../progs/shell.prog ../progs/editor.prog ../progs/reclaim.prog \
- ../progs/dumpdir.prog ../progs/partmgr.prog ../progs/xfer.prog \
- ../progs/recover.prog ../progs/changemem.prog
+nativeprogs: nativecomp
+ $(PCOMP) ../progs/shell.pas
+ $(PCOMP) ../progs/editor.pas
+ $(PCOMP) ../progs/reclaim.pas
+ $(PCOMP) ../progs/dumpdir.pas
+ $(PCOMP) ../progs/partmgr.pas
+ $(PCOMP) ../progs/xfer.pas
$(SASM) ../lib/rommon.s
$(SASM) -A ../lib/rommon.s ../lib/rom.mem
-
-examples: nativecomp ../tests/readtest.prog ../tests/readchartest.prog ../tests/timetest.prog \
- ../tests/test133.prog ../tests/cchangetest.prog ../tests/tree.prog
+examples: nativecomp
+ $(PCOMP) ../tests/readtest.pas
+ $(PCOMP) ../tests/readchartest.pas
+ $(PCOMP) ../tests/timetest.pas
+ $(PCOMP) ../tests/test133.pas
-$(PCOMP) ../examples/chase.pas
- -$(SASM) ../examples/chase.s
- -$(MAKE) -C ../rogue -f Makefile.tridoracpu
-
+ $(PCOMP) ../tests/cchangetest.pas
+ $(PCOMP) ../tests/tree.pas
+
clean:
- rm -f pcomp sasm sdis libgen lsymgen shortgen*.o *.s *.prog \
- ../lib/stdlib.s ../lib/stdlib.lib ../lib/stdlib.lsym
+ rm -f pcomp sasm sdis libgen lsymgen *.o *.s
diff --git a/pcomp/emit.pas b/pcomp/emit.pas
index d440951..2ede4f0 100644
--- a/pcomp/emit.pas
+++ b/pcomp/emit.pas
@@ -111,7 +111,7 @@ begin
emitIns2('BRANCH','@+2'); (* NOP, to make alignment explicit *)
emitIns('.CPOOL'); (* header/prologue + 2 constants is 32 bytes *)
- if useStdlib and not useStandalone then
+ if useStdlib then
begin
writeln(outfile, '%include "stdlib.lsym"');
writeln(outfile, '%incbin "stdlib.lib"');
@@ -312,21 +312,14 @@ begin
emitArrayConsts;
if useStandalone then
- begin
- emitInclude('corelib.s');
- emitInclude('runtime.s');
- emitInclude('float32.s');
- emitInclude('stdlib.s');
- end
+ emitInclude('corelib.s')
else
emitInclude('coreloader.lsym');
rewindStringList(usedUnits);
while nextStringListItem(usedUnits, unitName) do
emitInclude(unitName + UnitSuffix2);
- (* _END label needs to be word-aligned because
- it is used as the start of the heap *)
- emitIns('.ALIGN');
+
emitLabelRaw('_END');
end;
@@ -1066,7 +1059,6 @@ end;
*)
procedure emitProcedureCall(aProc: ProcRef);
var procLabel: IdentString;
- i:integer;
begin
(* pass pointer to stackframe of caller for nested procedures *)
if aProc^.isNested then
@@ -1077,17 +1069,9 @@ begin
if aProc^.level > curProcedure^.level then
emitIns2('LOADREG','FP')
else
- begin
- (* Calling nested aProc with a lower nesting level.
- Need to chase a chain of old BP pointers. *)
- emitIns2('LOADREG', 'BP');
- (* BP points to the stackframe of the outer procedure,
- @BP contains the stackframe of the procedure one step further
- outwards, and so on.
- *)
- for i := aProc^.level + 1 to curProcedure^.level do
- emitIns('LOADI');
- end;
+ (* TODO: calling nested aProc with a lower nesting level.
+ need to chase a chain of old BP pointers. *)
+ errorExit2('internal error: outward call of nested aProc not implemented', '');
end;
emitFpAdjust(-curProcedure^.tempsSize);
@@ -1266,7 +1250,7 @@ begin
(* nothing to do *)
end
else
- if (amount > 0) and (amount <= MaxTinyOffset) then
+ if amount <= MaxTinyOffset then
emitIns2Int('INC', amount)
else
begin
@@ -1282,7 +1266,7 @@ begin
(* nothing to do *)
end
else
- if (amount > 0) and (amount <= MaxTinyOffset) then
+ if amount <= MaxTinyOffset then
emitIns2Int('DEC', amount)
else
begin
diff --git a/pcomp/make.bat b/pcomp/make.bat
index 564885d..5cf30e9 100644
--- a/pcomp/make.bat
+++ b/pcomp/make.bat
@@ -17,7 +17,7 @@ rem exit /b
py pcomp.py sasm.pas
py pcomp.py pcomp.pas
py pcomp.py lsymgen.pas
-py pcomp.py shortgen.pas
+py pcomp.py libgen.pas
rem exit /b
@@ -27,8 +27,6 @@ py pcomp.py ..\progs\reclaim.pas
py pcomp.py ..\progs\dumpdir.pas
py pcomp.py ..\progs\partmgr.pas
py pcomp.py ..\progs\xfer.pas
-py pcomp.py ..\progs\recover.pas
-py pcomp.py ..\progs\changemem.pas
sasm ..\lib\rommon.s
sasm -A ..\lib\rommon.s ..\lib\rom.mem
@@ -41,11 +39,3 @@ py pcomp.py ..\tests\test133.pas
py pcomp.py ..\examples\chase.pas
py pcomp.py ..\tests\cchangetest.pas
py pcomp.py ..\tests\tree.pas
-
-if not exist ..\rogue\rogue.pas exit /b
-
-cd ..\rogue
-..\pcomp\pcomp rogue.pas
-..\pcomp\sasm rogue.s
-
-cd ..\pcomp
diff --git a/pcomp/pcomp.pas b/pcomp/pcomp.pas
index 73947a1..89d5ff9 100644
--- a/pcomp/pcomp.pas
+++ b/pcomp/pcomp.pas
@@ -1,6 +1,4 @@
(* Copyright 2021-2024 Sebastian Lederer. See the file LICENSE.md for details *)
-{$H600}
-{$S64}
program PascalCompiler;
{$R+}
{$!}{$ifdef FPC}uses math,crt;{$endif}
@@ -43,7 +41,7 @@ type TokenType = (
ArrayType, RecordType, PointerType, StringCharType, EnumType,
SetType, UnresolvedType );
- SpecialProc = ( NoSP, NewSP, New0SP, DisposeSP, ReadSP, WriteSP, ReadlnSP, WritelnSP,
+ SpecialProc = ( NoSP, NewSP, DisposeSP, ReadSP, WriteSP, ReadlnSP, WritelnSP,
SetlengthSP, ValSP, StrSP, ExitSP );
SpecialFunc = ( NoSF, TruncSF, FracSF, IntSF, SqrSF, SuccSF, PredSF,
OddSF, ChrSF, OrdSF, AbsSF);
@@ -263,7 +261,7 @@ const insSize = 2;
MaxIncludes = 4;
StdLibName = 'stdlib';
UnitSuffix1 = '.inc';
- UnitSuffix2 = '.s';
+ UnitSuffix2 = '.lib';
FilenameSuffix = '.pas';
OutfileSuffix = '.s';
InputFileName = 'INPUT';
@@ -291,7 +289,7 @@ var
'UNIT', 'IMPLEMENTATION', 'INTERFACE', 'USES',
'_' );
specialprocnames: array [SpecialProc] of string[12] = (
- '_', 'NEW', 'NEWORNIL', 'DISPOSE', 'READ', 'WRITE', 'READLN', 'WRITELN', 'SETLENGTH',
+ '_', 'NEW', 'DISPOSE', 'READ', 'WRITE', 'READLN', 'WRITELN', 'SETLENGTH',
'VAL','STR', 'EXIT');
specialfuncnames: array [SpecialFunc] of string[8] = (
'_', 'TRUNC', 'FRAC', 'INT', 'SQR', 'SUCC', 'PRED', 'ODD',
@@ -2186,7 +2184,7 @@ begin
if ch = '!' then
(* special comment till end of line *)
begin
- while not (nextChar in [#13, #10]) do (* nothing *);
+ while not (nextChar = #13) do (* nothing *);
readNextToken;
end
else
@@ -2456,7 +2454,10 @@ begin
begin
digits := curToken.tokenText;
if matchTokenOrNot(MinusToken) then
+ begin
+ readNextToken;
digits := digits + curToken.tokenText;
+ end;
parseInteger := integerFromString(digits);
end;
readNextToken;
@@ -2809,8 +2810,6 @@ begin
if checkToken(CommaToken) then
begin
- (* TODO: handle comma syntax for indexing a char
- from an array of strings *)
if elType.baseType <> ArrayType then
errorExit2('invalid array subscript for', name)
end;
@@ -3230,22 +3229,10 @@ begin
readNextToken;
end;
-(* Handle an array range part. Very similar to parseInteger
- but additionally handles Boolean, Enum and Char types which
- can be used for array indices *)
procedure getRangePart(var value:integer; var typeReturn: TypeSpec);
var cnst: ConstRef;
- negate:boolean;
- digits: string[12];
begin
setBaseType(typeReturn, NoType);
- negate := false;
-
- if checkToken(MinusToken) then
- begin
- negate := true;
- readNextToken;
- end;
if checkToken(IdentToken) then
begin
@@ -3279,11 +3266,7 @@ begin
else
begin
setBaseType(typeReturn, IntegerType);
- digits := curToken.tokenText;
- if negate then
- insert('-', digits, 1);
- value := integerFromString(digits);
- readNextToken;
+ value := parseInteger;
end;
end;
@@ -3448,9 +3431,9 @@ begin
if savedType.baseType = NoType then
savedType := elementType;
emitLoadConstantInt(cnst^.intValue);
- readNextToken;
end;
emitAddToSet;
+ readNextToken;
end
else if checkToken(NumberToken) then
begin
@@ -4014,8 +3997,6 @@ begin
begin
readNextToken;
length := parseInteger;
- if length < 1 then
- errorExit2('invalid string length', '');
matchToken(RBracketToken);
end;
typSpec.size := getStringMemSize(length);
@@ -4500,7 +4481,7 @@ begin
isFunction := aProc^.returnType.baseType <> NoType;
end;
-procedure parseNew(checkNil:boolean);
+procedure parseNew;
var memLoc: MemLocation;
typeReturn: TypeSpec;
begin
@@ -4526,17 +4507,17 @@ begin
emitLoadConstantInt(memLoc.typ.pointedType^.size);
emitMemAlloc;
- (*We need to call CLEARMEM when the allocated type
- contains strings.
- INITSTRING checks if the header is non-zero to see if
- the string is already initialized, and the allocated
- chunk might contain random data so it would look
- like an initialized string. *)
if typeContainsString(memLoc.typ.pointedType^) then
emitClearAlloc(memLoc.typ.pointedType);
end;
- if checkNil then
- emitCheckAlloc;
+ emitCheckAlloc;
+
+ (*We need to call CLEARMEM when the allocated type
+ contains strings.
+ INITSTRING checks if the header is non-zero to see if
+ the string is already initialized, and the allocated
+ chunk might contain random data so it would look
+ like an initialized string. *)
writeVariable(memLoc);
@@ -5017,9 +4998,7 @@ begin
NoSP:
errorExit2('internal error in parseSpecialProcCall', lastToken.tokenText);
NewSP:
- parseNew(true);
- New0SP:
- parseNew(false);
+ parseNew;
DisposeSP:
parseDispose;
ReadSP:
@@ -5832,19 +5811,6 @@ begin
matchToken(ColonToken);
end;
-procedure parseGotoStatement;
-var aLabl: LablRef;
-begin
- readNextToken;
- matchToken(IdentToken);
- aLabl := findLabel(curProcedure, lastToken.tokenText);
- if aLabl = nil then
- errorExit2('GOTO to undefined label', lastToken.tokenText);
- if curProcedure^.estackCleanup > 0 then
- errorExit2('GOTO not allowed inside FOR or CASE', '');
- emitLabelJump(aLabl);
-end;
-
procedure parseStatement;
var sym: SymblRef;
cnst: ConstRef;
@@ -5870,7 +5836,13 @@ begin
end;
if checkToken(GotoToken) then
- parseGotoStatement
+ begin
+ readNextToken;
+ matchToken(IdentToken);
+ aLabl := findLabel(curProcedure, lastToken.tokenText);
+ if aLabl = nil then errorExit2('GOTO to undefined label', lastToken.tokenText);
+ emitLabelJump(aLabl);
+ end
else
if checkToken(IfToken) then
parseIfStatement
diff --git a/pcomp/sasm.pas b/pcomp/sasm.pas
index d032748..ab5230b 100644
--- a/pcomp/sasm.pas
+++ b/pcomp/sasm.pas
@@ -1,7 +1,7 @@
(* Copyright 2021-2024 Sebastian Lederer. See the file LICENSE.md for details *)
{$MODE objfpc}
{$H600}
-{$S32}
+{$S4}
program sasm;
{$!}{$ifdef FPC}uses math,crt;{$endif}
{$R+}
@@ -1515,7 +1515,9 @@ begin
end;
if dref^.symboldata.value <> value then
- dref^.symboldata.value := value;
+ (* writeln('////// label changed value ', keyword, ' ',
+ dref^.symboldata.value, ' -> ', value); *)
+ dref^.symboldata.value := value;
end;
end;
@@ -1870,9 +1872,9 @@ begin
if (pc and 3) = 0 then (* no padding *)
begin
pad := false;
- (* total size 10 bytes *)
+ (* total size 8 bytes *)
offset := 4; (* offset for LOADREL *)
- shrinkage := 8; (* difference to short form size *)
+ shrinkage := 6; (* difference to short form size *)
end
else
begin
@@ -1890,17 +1892,9 @@ begin
encodeInstruction('JUMP', 0, encoded);
emitInstructionWord(encoded);
- (* Padding is always done, so the length of the sequence does
- not change depending on the position. The pad is either
- placed before the address to align it on a word address,
- or after, if it is already aligned. *)
if pad then
emitInstructionWord(0);
-
emitWord(value);
-
- if not pad then
- emitInstructionWord(0);
end
else
begin
@@ -1943,9 +1937,9 @@ begin
if (pc and 3) = 2 then (* no padding *)
begin
pad := false;
- (* total size 12 bytes *)
+ (* total size 10 bytes *)
offset := 4; (* offset for LOADREL *)
- shrinkage := 10; (* difference to short form size *)
+ shrinkage := 8; (* difference to short form size *)
end
else
begin
@@ -1973,17 +1967,9 @@ begin
encodeInstruction('JUMP', 0, encoded);
emitInstructionWord(encoded);
- (* Padding is always done, so the length of the sequence does
- not change depending on the position. The pad is either
- placed before the address to align it on a word address,
- or after, if it is already aligned. *)
if pad then
emitInstructionWord(0);
-
emitWord(value);
-
- if not pad then
- emitInstructionWord(0);
end
else
begin
@@ -2056,9 +2042,6 @@ begin
operandValue := 0;
emitBlock(count, operandValue);
end
- else
- if lastToken.tokenText = '.ALIGN' then
- alignOutput(wordSize)
else
errorExit2('Unrecognized directive', lastToken.tokenText);
end;
diff --git a/pcomp/shortgen.pas b/pcomp/shortgen.pas
index d0acf41..b8ecc94 100644
--- a/pcomp/shortgen.pas
+++ b/pcomp/shortgen.pas
@@ -5,7 +5,7 @@ const shortcutChar = '`';
firstShCChar = 'A';
lastShCChar = 'i';
- OutfileSuffix = '.cs';
+ OutfileSuffix = '.lib';
{$I 'platfile-types+.pas'}
diff --git a/progs/changemem.pas b/progs/changemem.pas
deleted file mode 100644
index 7c0bca8..0000000
--- a/progs/changemem.pas
+++ /dev/null
@@ -1,173 +0,0 @@
-program changemem;
-const ProgramMagic = $00100AFE;
-type ProgramHeader = record
- magic:integer;
- heapSize:integer;
- stackSize:integer;
- mainPtr:integer;
- end;
-
-var filename:string;
- h:ProgramHeader;
-
-procedure showHex(value:integer);
-var i:integer;
- digit:integer;
- digits:array[1..8] of char;
- ch:char;
-begin
- for i := 1 to 8 do
- begin
- digit := value and 15;
- value := value shr 4;
-
- if digit < 10 then
- ch := chr(digit + ord('0'))
- else
- ch := chr(digit - 10 + ord('A'));
- digits[i] := ch;
- end;
- for i := 8 downto 1 do
- write(digits[i]);
-end;
-
-procedure showValue(labl:string; value:integer);
-begin
- write(labl:20, ' ');
- write(value:8, ' (');
- showHex(value);
- writeln(')');
-end;
-
-procedure showHeader(var h:ProgramHeader);
-begin
- showValue('heap size', h.heapSize);
- showValue('stack size', h.stackSize);
- showValue('main entry point', h.mainPtr);
-end;
-
-procedure readHeader(var filename:string;var h:ProgramHeader);
-var f:file;
-begin
- writeln('reading file ', filename);
- open(f, filename, ModeReadOnly);
- if IOResult(f) <> 0 then
- begin
- writeln('Error opening file: ', ErrorStr(IOResult(f)));
- halt;
- end
- else
- begin
- read(f, h);
- if IOResult(f) <> 0 then
- begin
- writeln('Error reading header: ', ErrorStr(IOResult(f)));
- halt;
- end;
- close(f);
- end;
-end;
-
-procedure writeHeader(var filename:string;var h:ProgramHeader);
-var f:file;
-begin
- writeln('writing file ', filename);
- open(f, filename, ModeModify);
- if IOResult(f) <> 0 then
- begin
- writeln('Error opening file: ', ErrorStr(IOResult(f)));
- halt;
- end
- else
- begin
- write(f, h);
- if IOResult(f) <> 0 then
- begin
- writeln('Error writing header: ', ErrorStr(IOResult(f)));
- halt;
- end;
- close(f);
- end;
-end;
-
-procedure modifyHeader(var filename:string;var h:ProgramHeader);
-var done:boolean;
- ch:char;
- changed:boolean;
-
- function getNewValue(descr:string):integer;
- var buf:string;
- v,e:integer;
- begin
- getNewValue := 0;
- write('New ',descr, ' size (decimal)> ');
- readln(buf);
- val(buf, v, e);
- if(e > 0 ) or (v <= 0) then
- writeln('invalid size')
- else
- getNewValue := v;
- end;
-
- procedure changeStackSize;
- var v:integer;
- begin
- v := getNewValue('stack');
- if v > 0 then
- begin
- h.stackSize := v;
- changed := true;
- end;
- end;
-
- procedure changeHeapSize;
- var v:integer;
- begin
- v := getNewValue('heap');
- if v > 0 then
- begin
- h.heapSize := v;
- changed := true;
- end;
- end;
-
-begin
- changed := false; done := false;
-
- while not done do
- begin
- writeln(filename, ' header:');
- showHeader(h);
- writeln('Change H)eap size Change S)tack size eX)it');
- write('> ');
- read(ch);
- writeln;
- case upcase(ch) of
- 'S': changeStackSize;
- 'H': changeHeapSize;
- 'X': done := true;
- else
- writeln('invalid command');
- end;
- end;
-
- if changed then
- writeHeader(filename, h);
-end;
-
-begin
- if ParamCount > 0 then
- filename := ParamStr(1)
- else
- begin
- write('File name> ');
- readln(filename);
- end;
-
- readHeader(filename, h);
-
- if h.magic <> ProgramMagic then
- writeln('invalid magic value ', h.magic)
- else
- modifyHeader(filename, h);
-end.
diff --git a/progs/dumpdir.pas b/progs/dumpdir.pas
index 7411cae..584e812 100644
--- a/progs/dumpdir.pas
+++ b/progs/dumpdir.pas
@@ -14,8 +14,8 @@ var dirs:DirectorySlot;
error:integer;
begin
lastSlot := volumeTable[volid].part.dirSize - 1;
- openvolumeid(volid, error); (* we just ignore error here because
- we should always have enough heap space *)
+ openvolumeid(volid);
+
for i := 0 to lastSlot do
begin
getdirslot(volid, i, dirs, error);
diff --git a/progs/editor.pas b/progs/editor.pas
index d6ec563..4997bcc 100644
--- a/progs/editor.pas
+++ b/progs/editor.pas
@@ -8,7 +8,7 @@ const COMPILERPROG = '#SYSTEM:pcomp.prog';
const MAX_LENGTH = 512;
MAX_LINES = 10000;
MAX_SCREENH = 256;
- MAX_KEYWORD = 33;
+ MAX_KEYWORD = 31;
MAX_CLIPB_SIZE = 300;
@@ -94,14 +94,14 @@ var lines: array [1..MAX_LINES] of ^linestr;
catColors: array [Unknown..StrLit] of integer =
( TEXT_FG, 0, KEYWORD_FG, IDENT_FG, NUM_FG, PUNCT_FG, COMMENT_FG, STRLIT_FG );
- keywords: array [0..MAX_KEYWORD] of string[12] = (
- 'AND', 'ARRAY', 'BEGIN', 'BOOLEAN', 'CASE', 'CHAR', 'CONST',
- 'DIV', 'DO', 'ELSE', 'END', 'FOR', 'FUNCTION', 'IF', 'IN', 'INTEGER',
- 'MOD', 'NOT', 'OF', 'OR', 'PROCEDURE', 'PROGRAM',
- 'REAL', 'RECORD', 'REPEAT', 'STRING', 'THEN', 'TO', 'TYPE',
- 'UNIT', 'UNTIL', 'USES', 'VAR', 'WHILE'
+ keywords: array [0..MAX_KEYWORD] of string[20] = (
+ 'VAR', 'IF', 'THEN', 'ELSE', 'BEGIN', 'END', 'PROCEDURE', 'FUNCTION',
+ 'WHILE', 'FOR', 'DO', 'IN', 'OF', 'CASE', 'TO', 'REPEAT', 'UNTIL',
+ 'CHAR', 'INTEGER', 'REAL', 'BOOLEAN', 'ARRAY', 'RECORD', 'STRING',
+ 'MOD', 'DIV', 'AND', 'OR', 'NOT',
+ 'TYPE', 'CONST',
+ 'PROGRAM'
);
- keywordIdx: array ['A'..'Z'] of integer;
paramPos:integer;
errorLine:integer;
errorMsg:string;
@@ -137,8 +137,7 @@ end;
procedure getScreenSize;
var c:char;
begin
- (* empty keyboard buffer to make sure GetTermSize
- can read the response from the terminal *)
+ (* empty keyboard buffer *)
while conavail do read(con, c);
GetTermSize(screenW, screenH);
@@ -678,6 +677,30 @@ begin
hscroll;
end;
+function isKeyword(var s:string):boolean;
+var i:integer;
+ c:char;
+ upBuf:string[MAX_LENGTH];
+begin
+ isKeyword := false;
+
+ if highlight then
+ begin
+ upBuf := '';
+ for c in s do appendchar(upBuf,upcase(c));
+
+
+ for i := 0 to MAX_KEYWORD do
+ begin
+ if keywords[i] = upBuf then
+ begin
+ isKeyword := true;
+ break;
+ end;
+ end;
+ end;
+end;
+
function isalpha(c:char):boolean;
begin
isalpha := ((ord(c) >= ord('A')) and (ord(c) <= ord('Z'))) or
@@ -692,39 +715,6 @@ begin
((ord(c) >= ord('[')) and (ord(c) <= ord('^')));
end;
-function isKeyword(var s:string):boolean;
-var i:integer;
- start:integer;
- c,f:char;
- upBuf:string[MAX_LENGTH];
-begin
- isKeyword := false;
-
- if highlight then
- begin
- upBuf := '';
- for c in s do appendchar(upBuf,upcase(c));
-
- (* use the first letter of the search string
- for our starting index *)
- c := upBuf[1];
- if isalpha(c) then
- begin
- start := keywordIdx[c];
- for i := start to MAX_KEYWORD do
- begin
- f := keywords[i][1];
- if c <> f then break;
- if keywords[i] = upBuf then
- begin
- isKeyword := true;
- break;
- end;
- end;
- end;
- end;
-end;
-
function getCat(c:char):HiliteCat;
begin
if isalpha(c) then
@@ -1662,10 +1652,11 @@ end;
procedure gotoLine(l:integer);
begin
+ if l < 1 then
+ l := 1
+ else
if l > lineCount then
l := lineCount;
- if l < 1 then
- l := 1;
topY := l - (screenH div 2);
if topY < 1 then
@@ -1713,7 +1704,7 @@ var error:integer;
begin
success := true;
if isModified then
- writeFile(success);
+ save;
if success then
begin
if isAsmFile(filename) then
@@ -2426,23 +2417,6 @@ begin
end;
end;
-procedure initKeywordIdx;
-var i:integer;
- ch, lastCh:char;
-begin
- lastCh := #0;
-
- for i := 0 to MAX_KEYWORD do
- begin
- ch := keywords[i][1];
- if ch <> lastCh then
- begin
- keywordIdx[ch] := i;
- lastCh := ch;
- end;
- end;
-end;
-
begin
errorLine := 0;
paramPos := 1;
@@ -2450,8 +2424,6 @@ begin
autoindent := true;
keepClips := false;
- initKeywordIdx;
-
while paramPos <= ParamCount do
begin
if paramStr(paramPos) = '-l' then
diff --git a/progs/reclaim.pas b/progs/reclaim.pas
index fed0e90..6c3584d 100644
--- a/progs/reclaim.pas
+++ b/progs/reclaim.pas
@@ -62,13 +62,8 @@ begin
begin
if lastUsed < endSlot then
begin
- (* if the volume is empty mark the first slot *)
- if lastUsed = 0 then
- slotNo := reservedCount
- else
- slotNo := lastUsed + 1;
-
writeln('Updating directory...');
+ slotNo := lastUsed + 1;
getdirslot(volid, slotNo, dirslot, error);
if error <> IONoError then
begin
@@ -123,9 +118,8 @@ begin
freeAreaCount := 0;
lastUsed := 0;
- openvolumeid(volid, error);
- (* ignoring theoretically possible out-of-heap-error *)
- i := 0;
+ openvolumeid(volid);
+ i := volumeTable[volid].startSlot;
endSlot := volumeTable[volid].part.dirSize - 1;
if verbose then
@@ -309,7 +303,7 @@ begin
writeln('Volume ', volname, ' not found.')
else
begin
- openvolumeid(volid, error);
+ openvolumeid(volid);
endSlot := volumeTable[volid].part.dirSize - 1;
extentSize := volumeTable[volid].part.extentSize;
diff --git a/progs/recover.pas b/progs/recover.pas
deleted file mode 100644
index b2303b2..0000000
--- a/progs/recover.pas
+++ /dev/null
@@ -1,167 +0,0 @@
-(* Copyright 2025 Sebastian Lederer. See the file LICENSE.md for details *)
-program recover;
-const PageMargin = 4;
-var filename:string;
- volid:integer;
-
-(* we use some stuff internal to stdlib.pas *)
-procedure getdirslot(volumeid:integer;slotNo:integer;var result:DirectorySlot;var error:integer);
- external;
-procedure openfile(volid:integer; slotno:integer; var dirslot:DirectorySlot; var aFile:File; mode:filemode);
- external;
-
-function openvolume:integer;
-var volid:integer;
-begin
- openvolume := -1;
-
- volid := findvolume(DefaultVolume);
- if volid < 1 then
- writeln('Volume ', DefaultVolume, ' not found.')
- else
- openvolume := volid;
-end;
-
-procedure waitForKey;
-var c:char;
-begin
- writeln;
- writeln('-- press any key to continue --');
- c := conin;
-end;
-
-procedure copyfile(volid:integer;slotno:integer;oldname,newname:string);
-var srcfile,destfile:file;
- dirslot:DirectorySlot;
- error:integer;
- ch:char;
- count:integer;
-begin
- (* to open the deleted source file, we emulate parts
- of the open procedure from stdlib *)
- getdirslot(volid, slotno, dirslot, error);
- if not (SlotDeleted in dirslot.flags) or (dirslot.name <> oldname) then
- writeln('Invalid slot ', slotno)
- else
- begin
- openfile(volid, slotno, dirslot, srcfile, ModeReadOnly);
- if error <> 0 then
- writeln('Error opening file from slot ', slotno,
- ': ', ErrorStr(error))
- else
- begin
- open(destfile, newname, ModeCreate);
- if IOResult(destfile) = IOFileExists then
- begin
- write('File ', newname, ' already exists, overwrite? [y/n] ');
- readln(ch);
- if ch in ['Y', 'y'] then
- open(destfile, newname, ModeOverwrite);
- end;
- if IOResult(destfile) <> 0 then
- writeln('Error opening ', newname, ': ',
- ErrorStr(IOResult(destfile)))
- else
- begin
- (* taken from shell.pas copyFile *)
- write('Recovering from slot ', slotno, ' to ', newname, '...');
- count := 0;
- while not eof(srcfile) do
- begin
- read(srcfile,ch);
- write(destfile,ch);
- count := count + 1;
- if (count and 8191) = 0 then write('.');
- end;
- writeln;
- close(destfile);
- end;
- close(srcfile);
- end;
- end;
-end;
-
-procedure recoverfile(volid:integer;wantedname:string);
-var dirs:DirectorySlot;
- i:integer;
- lastSlot:integer;
- error:integer;
- screenW,screenH:integer;
- count:integer;
- datestr:string;
- ftime:DateTime;
- wantedslot:integer;
- newname:string;
- foundsomething:boolean;
-begin
- writeln('Files available for recovery:');
- foundsomething := false;
- newname := '';
-
- GetTermSize(screenW, screenH);
- count := PageMargin;
-
- lastSlot := volumeTable[volid].part.dirSize - 1;
- openvolumeid(volid, error);
- (* ignoring theoretically possible out-of-heap-space error *)
- for i := 0 to lastSlot do
- begin
- getdirslot(volid, i, dirs, error);
- with dirs do
- begin
- if (SlotFirst in flags) or (SlotDeleted in flags) then
- if name = wantedname then
- begin
- ftime := GetDateTime(dirs.modTime);
- datestr := DateStr(ftime) + ' ' + TimeStr(ftime, true);
- write('slot ', i:4, name:34, sizeBytes:8, datestr:21, ' ');
- if SlotFirst in flags then write('Cur');
- if SlotExtent in flags then write('Extent');
- if SlotReserved in flags then write('Resvd');
- if SlotDeleted in flags then write('Del');
- if SlotFree in flags then write('Free');
- if SlotEndScan in flags then write('End');
- writeln;
- foundsomething := true;
- count := count + 1;
- if count >= screenH then
- begin
- count := PageMargin;
- waitForKey;
- end;
- if SlotEndScan in flags then break;
- end;
- end;
- end;
-
- if foundsomething then
- begin
- write('Slot no to recover> ');
- readln(wantedslot);
- if (wantedslot < 1) or (wantedslot >= volumeTable[volid].part.dirSize) then
- writeln('Invalid slot number.')
- else
- begin
- write('New filename> ');
- readln(newname);
- end;
-
- if length(newname) > 0 then
- copyfile(volid, wantedslot, wantedname, newname);
- end;
-
- closevolumeid(volid);
-end;
-
-begin
- if ParamCount > 0 then
- filename := ParamStr(1)
- else
- begin
- write('Filename to recover> ');
- readln(filename);
- end;
- volid := openvolume;
- if volid > 0 then
- recoverfile(volid, filename);
-end.
diff --git a/progs/shell.pas b/progs/shell.pas
index 84920d6..610dcfe 100644
--- a/progs/shell.pas
+++ b/progs/shell.pas
@@ -149,7 +149,7 @@ begin
count := PageMargin;
writeln('reading directory of ', DefaultVolume);
- openvolumeid(volid, error);
+ openvolumeid(volid);
readdirfirst(volid, index, dirs, error);
while index > 0 do
begin
@@ -324,7 +324,7 @@ begin
PExec(EDITORPROG, args, 3, error);
end
else
- PExec1(EDITORPROG, ShellWorkFile, error);
+ PExec2(EDITORPROG, ShellWorkFile, error);
writeln('PExec error ', error);
end;
@@ -334,7 +334,7 @@ var filename:filenamestr;
begin
requireWorkfile;
filename := replaceExtension(ShellWorkFile, '.s');
- PExec1(ASMPROG, filename, error);
+ PExec2(ASMPROG, filename, error);
writeln('PExec error ', error);
end;
@@ -344,7 +344,7 @@ var filename:filenamestr;
begin
requireWorkfile;
filename := replaceExtension(ShellWorkFile, '.pas');
- PExec2(COMPILERPROG, '-S', filename, error);
+ PExec3(COMPILERPROG, '-S', filename, error);
writeln('PExec error ', error);
end;
@@ -354,7 +354,7 @@ var filename:filenamestr;
begin
requireWorkfile;
filename := replaceExtension(ShellWorkFile, '.pas');
- PExec1(COMPILERPROG, filename, error);
+ PExec2(COMPILERPROG, filename, error);
writeln('PExec error ', error);
end;
@@ -373,7 +373,7 @@ end;
procedure krunch;
var error:integer;
begin
- PExec1(RECLAIMPROG, DefaultVolume, error);
+ PExec2(RECLAIMPROG, DefaultVolume, error);
writeln('PExec error ', error);
end;
diff --git a/progs/xfer.pas b/progs/xfer.pas
index 0d871d2..7a4a389 100644
--- a/progs/xfer.pas
+++ b/progs/xfer.pas
@@ -226,7 +226,6 @@ begin
if not invalid then
begin
open(xferFile, filename, ModeOverwrite);
- blockNo := 0;
done := false;
repeat
serReadBlock(ok);
@@ -399,7 +398,7 @@ begin
writeln('Volume ', DefaultVolume, ' not found.')
else
begin
- openvolumeid(volid, error);
+ openvolumeid(volid);
readdirfirst(volid, index, dirs, error);
while (index > 0) and (error = 0) do
begin
diff --git a/rogue b/rogue
deleted file mode 160000
index 73936b4..0000000
--- a/rogue
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 73936b4167bad01642675252e53a096d80fa6b35
diff --git a/tests/arraytest.pas b/tests/arraytest.pas
deleted file mode 100644
index 6f28276..0000000
--- a/tests/arraytest.pas
+++ /dev/null
@@ -1,8 +0,0 @@
-program arraytest;
-var arr:array[-5..5] of integer;
- var s:string[5];
-begin
- arr[-5] := 10;
- arr[5] := 11;
- writeln(arr[-5], ' ', arr[5]);
-end.
diff --git a/tests/gototest.pas b/tests/gototest.pas
deleted file mode 100644
index f573af3..0000000
--- a/tests/gototest.pas
+++ /dev/null
@@ -1,22 +0,0 @@
-program gototest;
-var i:integer;
-label l1,l2;
-begin
- goto l1;
- writeln('skipped');
- l1: writeln('goto destination 1');
- {
- for i := 1 to 10 do
- begin
- goto l2;
- end;
- }
- {
- case i of
- 1: writeln('1');
- 2: goto l2;
- 3..10: writeln('3 - 10');
- end;
- l2: writeln('goto destination 2');
- }
-end.
diff --git a/tests/nestedtest.pas b/tests/nestedtest.pas
deleted file mode 100644
index 8df6ebd..0000000
--- a/tests/nestedtest.pas
+++ /dev/null
@@ -1,49 +0,0 @@
-program NestedTest;
-var g:integer;
-
-procedure first;
-var f:integer;
-
- procedure second;
- var s:integer;
-
- procedure third1;
- var t1:integer;
- begin
- t1 := 310;
- s := 31;
- writeln('t1:', t1);
- end;
-
- procedure third2;
- var t2:integer;
- begin
- t2 := 320;
- s := 32;
- writeln('t2:', t2);
- if g <> 21 then
- begin
- g := 21;
- second;
- end;
- end;
-
- begin
- f := 2;
- writeln('g:',g);
- third1;
- writeln('g:', g);
- third2;
- writeln('s:',s);
- end;
-
-begin
- second;
- writeln('f:', f);
-end;
-
-begin
- g := 0;
- first;
- writeln('g:', g);
-end.
diff --git a/tests/settest2.pas b/tests/settest2.pas
deleted file mode 100644
index c96826c..0000000
--- a/tests/settest2.pas
+++ /dev/null
@@ -1,20 +0,0 @@
-program settest2;
-type weekday = (Mon,Tue,Wed,Thu,Fri,Sat,Sun);
- days = set of weekday;
-
-var s:days;
- d:weekday;
-
-begin
- s := [Sat,Sun]; (* set literal *)
-
- d := Sun;
- if d in [Sat,Sun] then (* array literal *)
- writeln('weekend');
-
- if d in s then
- writeln('also weekend');
-
- d := Mon;
- s := s + [d];
-end.
diff --git a/tridoracpu/tridoracpu.srcs/Arty-A7-35-Master.xdc b/tridoracpu/tridoracpu.srcs/Arty-A7-35-Master.xdc
index d2c3160..c618478 100644
--- a/tridoracpu/tridoracpu.srcs/Arty-A7-35-Master.xdc
+++ b/tridoracpu/tridoracpu.srcs/Arty-A7-35-Master.xdc
@@ -8,8 +8,8 @@ set_property -dict {PACKAGE_PIN E3 IOSTANDARD LVCMOS33} [get_ports clk]
create_clock -period 10.000 -name sys_clk_pin -waveform {0.000 5.000} -add [get_ports clk]
## Switches
-#set_property -dict {PACKAGE_PIN A8 IOSTANDARD LVCMOS33} [get_ports sw0]
-#set_property -dict {PACKAGE_PIN C11 IOSTANDARD LVCMOS33} [get_ports sw1]
+set_property -dict {PACKAGE_PIN A8 IOSTANDARD LVCMOS33} [get_ports sw0]
+set_property -dict {PACKAGE_PIN C11 IOSTANDARD LVCMOS33} [get_ports sw1]
#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]
@@ -34,7 +34,7 @@ set_property -dict {PACKAGE_PIN T9 IOSTANDARD LVCMOS33} [get_ports led2]
set_property -dict {PACKAGE_PIN T10 IOSTANDARD LVCMOS33} [get_ports led3]
## Buttons
-#set_property -dict {PACKAGE_PIN D9 IOSTANDARD LVCMOS33} [get_ports btn0]
+set_property -dict {PACKAGE_PIN D9 IOSTANDARD LVCMOS33} [get_ports btn0]
#set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { btn1 }]; #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]
@@ -70,10 +70,10 @@ set_property -dict {PACKAGE_PIN V14 IOSTANDARD LVCMOS33} [get_ports VGA_VS_O]
#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 { amp2_ain }]; #IO_L11N_T1_SRCC_35 Sch=jd[1]
-set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { amp2_gain }]; #IO_L12N_T1_MRCC_35 Sch=jd[2]
+#set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { jd[0] }]; #IO_L11N_T1_SRCC_35 Sch=jd[1]
+#set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { jd[1] }]; #IO_L12N_T1_MRCC_35 Sch=jd[2]
#set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { jd[2] }]; #IO_L13P_T2_MRCC_35 Sch=jd[3]
-set_property -dict { PACKAGE_PIN F3 IOSTANDARD LVCMOS33 } [get_ports { amp2_shutdown_n }]; #IO_L13N_T2_MRCC_35 Sch=jd[4]
+#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 { jd[4] }]; #IO_L14P_T2_SRCC_35 Sch=jd[7]
#set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { jd[5] }]; #IO_L14N_T2_SRCC_35 Sch=jd[8]
#set_property -dict { PACKAGE_PIN H2 IOSTANDARD LVCMOS33 } [get_ports { jd[6] }]; #IO_L15P_T2_DQS_35 Sch=jd[9]
@@ -216,5 +216,3 @@ set_property -dict {PACKAGE_PIN C2 IOSTANDARD LVCMOS33} [get_ports rst]
#set_property -dict { PACKAGE_PIN A15 IOSTANDARD LVCMOS33 } [get_ports { isns0v95_p }]; #IO_L8P_T1_AD10P_15 Sch=ad_p[10]
set_property BITSTREAM.GENERAL.COMPRESS True [current_design]
-
-set_max_delay -from [get_pins vgafb0/display_timings_inst/o_vblank_reg/C] -to [get_pins vgafb0/vblank_xfer_reg/D] 3.000
diff --git a/tridoracpu/tridoracpu.srcs/cpuclk.v b/tridoracpu/tridoracpu.srcs/cpuclk.v
index a214cc4..613d85e 100644
--- a/tridoracpu/tridoracpu.srcs/cpuclk.v
+++ b/tridoracpu/tridoracpu.srcs/cpuclk.v
@@ -17,9 +17,7 @@ module cpu_clkgen(
.CLKFBOUT_PHASE(0.0), // Phase offset in degrees of CLKFB (-360.000-360.000).
.CLKIN1_PERIOD(10.0), // Input clock period in ns to ps resolution (i.e. 33.333 is 30 MHz).
// CLKOUT0_DIVIDE - CLKOUT6_DIVIDE: Divide amount for each CLKOUT (1-128)
- // CPU Clock: 12.0 = 83.33MHz CPU Clock, 333.33MHz Memory Clock
- // 13.0 = 76.92MHz CPU Clock, 307.69MHz Memory Clock
- .CLKOUT0_DIVIDE_F(13.0), // Divide amount for CLKOUT0 (1.000-128.000).
+ .CLKOUT0_DIVIDE_F(12.0), // Divide amount for CLKOUT0 (1.000-128.000).
.CLKOUT1_DIVIDE(5),
.CLKOUT2_DIVIDE(40), // 40 = 25MHz pixel clock (should be 25.175MHz per spec) for 640x480
//.CLKOUT2_DIVIDE(25), // 25 = 40MHz pixel clock for 800x600
diff --git a/tridoracpu/tridoracpu.srcs/dram_bridge.v b/tridoracpu/tridoracpu.srcs/dram_bridge.v
index 9bd2a92..102a8cf 100644
--- a/tridoracpu/tridoracpu.srcs/dram_bridge.v
+++ b/tridoracpu/tridoracpu.srcs/dram_bridge.v
@@ -8,7 +8,6 @@ module dram_bridge #(ADDR_WIDTH = 32, WIDTH = 32)
input wire [WIDTH-1:0] mem_write_data,
input wire mem_read_enable,
input wire mem_write_enable,
- input wire mem_read_ins,
output wire mem_wait,
input wire rst_n,
@@ -106,57 +105,39 @@ module dram_bridge #(ADDR_WIDTH = 32, WIDTH = 32)
.sys_rst (rst_n)
);
- (*KEEP*) reg [DRAM_DATA_WIDTH-1:0] ins_cache;
- (*KEEP*) reg [DRAM_ADDR_WIDTH-1:4] icached_addr;
- (*KEEP*) wire icache_hit = mem_read_enable && mem_read_ins && (icached_addr == mem_addr[DRAM_ADDR_WIDTH-1:4]);
-
- (*KEEP*) reg [DRAM_DATA_WIDTH-1:0] d_cache;
- (*KEEP*) reg [DRAM_ADDR_WIDTH-1:4] dcached_addr;
- (*KEEP*) wire dcache_hit = mem_read_enable && !mem_read_ins && (dcached_addr == mem_addr[DRAM_ADDR_WIDTH-1:4]);
-
- wire cache_hit = icache_hit | dcache_hit;
+// reg [DRAM_DATA_WIDTH-1:0] read_cache;
+// reg [ADDR_WIDTH-1:0] cached_addr;
+// wire cache_hit = cached_addr == mem_addr;
+// wire [DRAM_DATA_WIDTH-1:0] read_data_wrapper = cache_hit ? read_cache : app_rd_data;
reg [WIDTH-1:0] read_buf;
reg read_inprogress = 0;
- wire dram_read_enable = mem_read_enable && !cache_hit;
assign app_rd_data_end = 1'b1;
+ //assign app_wdf_mask = 16'b1111111111111100;
// addresses on the memory interface are aligned to 16 bytes
// and 28 bits wide (=256MB)
assign app_addr = { mem_addr[DRAM_ADDR_WIDTH:4], 4'b0000 };
+ //assign app_addr = { 28'b0 };
// select a word from the 128 bits transferred by the dram controller
// according to the lower bits of the address (ignoring bits 1:0)
+ wire [WIDTH-1:0] read_word;
wire [1:0] word_sel = mem_addr[3:2];
- wire [WIDTH-1:0] read_word =
- word_sel == 2'b11 ? app_rd_data[31:0] :
- word_sel == 2'b10 ? app_rd_data[63:32] :
- word_sel == 2'b01 ? app_rd_data[95:64] :
+ assign read_word = word_sel == 3'b11 ? app_rd_data[31:0] :
+ word_sel == 3'b10 ? app_rd_data[63:32] :
+ word_sel == 3'b01 ? app_rd_data[95:64] :
app_rd_data[127:96];
- wire [WIDTH-1:0] read_icached_word =
- word_sel == 2'b11 ? ins_cache[31:0] :
- word_sel == 2'b10 ? ins_cache[63:32] :
- word_sel == 2'b01 ? ins_cache[95:64] :
- ins_cache[127:96];
-
- wire [WIDTH-1:0] read_dcached_word =
- word_sel == 2'b11 ? d_cache[31:0] :
- word_sel == 2'b10 ? d_cache[63:32] :
- word_sel == 2'b01 ? d_cache[95:64] :
- d_cache[127:96];
-
- (*KEEP*) assign mem_read_data = icache_hit ? read_icached_word :
- dcache_hit ? read_dcached_word :
- app_rd_data_valid ? read_word : read_buf;
+ assign mem_read_data = app_rd_data_valid ? read_word : read_buf;
// set the write mask according to the lower bits of the address
// (ignoring bit 0)
- assign app_wdf_mask = word_sel == 2'b11 ? 16'b1111111111110000 :
- word_sel == 2'b10 ? 16'b1111111100001111 :
- word_sel == 2'b01 ? 16'b1111000011111111 :
+ assign app_wdf_mask = word_sel == 3'b11 ? 16'b1111111111110000 :
+ word_sel == 3'b10 ? 16'b1111111100001111 :
+ word_sel == 3'b01 ? 16'b1111000011111111 :
16'b0000111111111111 ;
wire write_ready = mem_write_enable & app_wdf_rdy & app_rdy;
@@ -164,67 +145,21 @@ module dram_bridge #(ADDR_WIDTH = 32, WIDTH = 32)
assign app_wdf_end = mem_write_enable & write_ready;
assign app_wdf_data = { {4{mem_write_data}} };
- assign mem_wait = (dram_read_enable & ~read_inprogress) |
+ assign mem_wait = (mem_read_enable & ~read_inprogress) |
(mem_write_enable & (~app_wdf_rdy | ~app_rdy)) |
(read_inprogress & ~app_rd_data_valid);
- assign app_en = (dram_read_enable & ~read_inprogress) |
+ assign app_en = (mem_read_enable & ~read_inprogress) |
(mem_write_enable & write_ready);
- assign app_cmd = dram_read_enable ? CMD_READ : CMD_WRITE;
+ assign app_cmd = mem_read_enable ? CMD_READ : CMD_WRITE;
-
- /* set instruction cache */
always @(posedge dram_front_clk)
begin
- if(dram_read_enable && mem_read_ins && app_rd_data_valid)
- begin
- ins_cache <= app_rd_data;
- icached_addr <= mem_addr[DRAM_ADDR_WIDTH-1:4];
- end
- end
-
- /* set data cache */
- always @(posedge dram_front_clk)
- begin
- if(dram_read_enable && !mem_read_ins && app_rd_data_valid)
- begin
- d_cache <= app_rd_data;
- dcached_addr <= mem_addr[DRAM_ADDR_WIDTH-1:4];
- end
-
- /* write-through cache - invalidate on write */
- /* invalidate data cache on write */
-// if(mem_write_enable && dcached_addr == mem_addr[DRAM_ADDR_WIDTH-1:4])
-// dcached_addr <= {DRAM_ADDR_WIDTH-4{1'b1}};
-
- /* write-back cache - update cache on write */
- // write back to data cache on mem_write
- if(mem_write_enable && dcached_addr == mem_addr[DRAM_ADDR_WIDTH-1:4])
- begin
- case(word_sel)
- 2'b11: d_cache[31:0] <= mem_write_data;
- 2'b10: d_cache[63:32] <= mem_write_data;
- 2'b01: d_cache[95:64] <= mem_write_data;
- 2'b00: d_cache[127:96] <= mem_write_data;
- endcase
- end
- end
-
- /* transfer read data, either from cache or from DRAM */
- always @(posedge dram_front_clk)
- begin
- if(dram_read_enable & ~read_inprogress & app_rdy)
+ if(mem_read_enable & ~read_inprogress & app_rdy)
read_inprogress <= 1;
if(read_inprogress & app_rd_data_valid)
read_inprogress <= 0;
-
- if(dram_read_enable & app_rd_data_valid)
+ if(mem_read_enable & app_rd_data_valid)
read_buf <= mem_read_data;
- else
- if (mem_read_enable & icache_hit)
- read_buf <= read_icached_word;
- else
- if (mem_read_enable & dcache_hit)
- read_buf <= read_dcached_word;
end
endmodule
diff --git a/tridoracpu/tridoracpu.srcs/irqctrl.v b/tridoracpu/tridoracpu.srcs/irqctrl.v
index 5608440..1a079bf 100644
--- a/tridoracpu/tridoracpu.srcs/irqctrl.v
+++ b/tridoracpu/tridoracpu.srcs/irqctrl.v
@@ -1,6 +1,6 @@
`timescale 1ns / 1ps
-module irqctrl #(IRQ_LINES = 3, IRQ_DELAY_WIDTH = 8) (
+module irqctrl #(IRQ_LINES = 2, IRQ_DELAY_WIDTH = 4) (
input wire clk,
input wire [IRQ_LINES-1:0] irq_in,
input wire cs,
diff --git a/tridoracpu/tridoracpu.srcs/mem.v b/tridoracpu/tridoracpu.srcs/mem.v
index 2fe1b5f..4c6fc68 100644
--- a/tridoracpu/tridoracpu.srcs/mem.v
+++ b/tridoracpu/tridoracpu.srcs/mem.v
@@ -28,7 +28,7 @@ module rom32 #(parameter ADDR_WIDTH = 11, DATA_WIDTH = 32)
input wire read_enable
);
- wire [ADDR_WIDTH-2:0] internal_addr = addr[ADDR_WIDTH-1:2]; // -> ignore bits 1-0
+ wire [ADDR_WIDTH-2:0] internal_addr = addr[ADDR_WIDTH-1:2]; // -> ignore bit 0
reg [DATA_WIDTH-1:0] rom [0:(2**(ADDR_WIDTH-2))-1];
initial begin
@@ -51,7 +51,7 @@ module ram32 #(parameter ADDR_WIDTH = 16, DATA_WIDTH = 32)
);
reg [DATA_WIDTH-1:0] ram [0:(2**(ADDR_WIDTH-2))-1]; // 32bit words with byte addressing
- wire [ADDR_WIDTH-2:0] internal_addr = addr[ADDR_WIDTH-1:2]; // -> ignore bits 1-0
+ wire [ADDR_WIDTH-2:0] internal_addr = addr[ADDR_WIDTH-1:2]; // -> ignore bit 1-0
always @(posedge clk)
begin
@@ -91,10 +91,8 @@ module mem #(parameter ADDR_WIDTH = 32,
// RAM1 $1000 - $FFFF 60K
// RAM2 $10000 - $FFFFFFFF ~4GB
- localparam RAM1_ADDR_WIDTH = 16;
-
wire ram_cs = addr[ADDR_WIDTH-1:12] != { {(ADDR_WIDTH-12){1'b0}}};
- wire ram1_cs = ram_cs && (addr[ADDR_WIDTH-1:RAM1_ADDR_WIDTH] == { {(ADDR_WIDTH-RAM1_ADDR_WIDTH){1'b0}}});
+ wire ram1_cs = ram_cs && (addr[ADDR_WIDTH-1:16] == { {(ADDR_WIDTH-16){1'b0}}});
wire ram2_cs = ram_cs && !ram1_cs;
wire rom_cs = !ram_cs && addr[11] == 1'b0;
wire io_cs = !ram_cs && addr[11] == 1'b1;
@@ -118,10 +116,10 @@ module mem #(parameter ADDR_WIDTH = 32,
// test
reg [1:0] wait_state;
- ram32 #(.ADDR_WIDTH(RAM1_ADDR_WIDTH)) ram0 // 64KB RAM
+ ram32 #(.ADDR_WIDTH(16)) ram0 // 64KB RAM
(
.clk(clk),
- .addr(addr[RAM1_ADDR_WIDTH-1:0]),
+ .addr(addr[15:0]),
.data_out(ram_out),
.read_enable(ram_read),
.data_in(data_in),
diff --git a/tridoracpu/tridoracpu.srcs/mig_dram_0/mig_a.prj b/tridoracpu/tridoracpu.srcs/mig_dram_0/mig_a.prj
index 58ff963..b263a25 100644
--- a/tridoracpu/tridoracpu.srcs/mig_dram_0/mig_a.prj
+++ b/tridoracpu/tridoracpu.srcs/mig_dram_0/mig_a.prj
@@ -39,12 +39,12 @@
DDR3_SDRAM/Components/MT41K128M16XX-15E
- 3300
+ 3000
1.8V
4:1
- 75.757
+ 83.333
0
- 606
+ 666
1.000
1
1
diff --git a/tridoracpu/tridoracpu.srcs/mig_dram_0/mig_b.prj b/tridoracpu/tridoracpu.srcs/mig_dram_0/mig_b.prj
index 99d2e0c..b263a25 100644
--- a/tridoracpu/tridoracpu.srcs/mig_dram_0/mig_b.prj
+++ b/tridoracpu/tridoracpu.srcs/mig_dram_0/mig_b.prj
@@ -39,12 +39,12 @@
DDR3_SDRAM/Components/MT41K128M16XX-15E
- 3250
+ 3000
1.8V
4:1
- 76.923
+ 83.333
0
- 615
+ 666
1.000
1
1
diff --git a/tridoracpu/tridoracpu.srcs/mig_dram_0/mig_dram_0.xci b/tridoracpu/tridoracpu.srcs/mig_dram_0/mig_dram_0.xci
deleted file mode 100644
index 6e7ca79..0000000
--- a/tridoracpu/tridoracpu.srcs/mig_dram_0/mig_dram_0.xci
+++ /dev/null
@@ -1,1571 +0,0 @@
-{
- "schema": "xilinx.com:schema:json_instance:1.0",
- "ip_inst": {
- "xci_name": "mig_dram_0",
- "component_reference": "xilinx.com:ip:mig_7series:4.2",
- "ip_revision": "2",
- "gen_directory": ".",
- "parameters": {
- "component_parameters": {
- "XML_INPUT_FILE": [ { "value": "mig_b.prj", "value_src": "user", "resolve_type": "user", "usage": "all" } ],
- "RESET_BOARD_INTERFACE": [ { "value": "Custom", "value_src": "user", "resolve_type": "user", "usage": "all" } ],
- "MIG_DONT_TOUCH_PARAM": [ { "value": "Custom", "value_src": "user", "resolve_type": "user", "usage": "all" } ],
- "BOARD_MIG_PARAM": [ { "value": "Custom", "value_src": "user", "resolve_type": "user", "usage": "all" } ],
- "Component_Name": [ { "value": "mig_dram_0", "resolve_type": "user", "usage": "all" } ]
- },
- "model_parameters": {
- "NoOfControllers": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "COMBINED_INTERFACE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "REFCLK_TYPE": [ { "value": "NOBUF", "resolve_type": "generated", "usage": "all" } ],
- "MEM_TYPE": [ { "value": "DDR3", "resolve_type": "generated", "usage": "all" } ],
- "TEMP_MON_CONTROL": [ { "value": "INTERNAL", "resolve_type": "generated", "usage": "all" } ],
- "POLARITY": [ { "value": "ACTIVE_LOW", "resolve_type": "generated", "usage": "all" } ],
- "IS_CLK_SHARED": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "SYSCLK_TYPE": [ { "value": "NOBUF", "resolve_type": "generated", "usage": "all" } ],
- "USE_AXI": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "ECC": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "DDR3_DQ_WIDTH": [ { "value": "16", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR3_DQS_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR3_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR3_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR3_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR3_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR3_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR3_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR3_DM_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR3_ODT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR3_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR3_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR3_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR3_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "DDR3_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR3_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "DDR2_DQ_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR2_DQS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR2_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR2_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR2_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR2_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR2_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR2_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR2_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR2_ODT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR2_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR2_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR2_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR2_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "DDR2_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR2_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "LPDDR2_DQ_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "LPDDR2_DQS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "LPDDR2_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "LPDDR2_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "LPDDR2_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "LPDDR2_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "LPDDR2_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "LPDDR2_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "LPDDR2_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "LPDDR2_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "LPDDR2_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "LPDDR2_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "LPDDR2_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "LPDDR2_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "LPDDR2_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "DDRX_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDRX_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDRX_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR3_ADDR_WIDTH": [ { "value": "28", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR3_nCK_PER_CLK": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR3_DATA_WIDTH": [ { "value": "16", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR2_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR2_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "DDR2_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "LPDDR2_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "LPDDR2_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "LPDDR2_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "FREQ_HZ": [ { "value": "76923077", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "UI_EXTRA_CLOCKS": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "MMCM_VCO": [ { "value": "615", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "MMCM_CLKOUT0_FREQ": [ { "value": "10.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "MMCM_CLKOUT1_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "MMCM_CLKOUT2_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "MMCM_CLKOUT3_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "MMCM_CLKOUT4_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "MMCM_CLKOUT0_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "MMCM_CLKOUT2_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "MMCM_CLKOUT1_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "MMCM_CLKOUT3_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "MMCM_CLKOUT4_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C_S_AXI_CTRL_ID_WIDTH": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C_S_AXI_CTRL_DATA_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C_S_AXI_CTRL_ADDR_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C_S_AXI_CTRL_MEM_SIZE": [ { "value": "1048576", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C_S_AXI_ID_WIDTH": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C_S_AXI_DATA_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C_S_AXI_ADDR_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C_S_AXI_MEM_SIZE": [ { "value": "1048576", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "QDRIIP_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "QDRIIP_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "QDRIIP_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "QDRIIP_BW_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "QDRIIP_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "QDRIIP_BURST_LEN": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDII_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDII_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDII_RLD_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDII_QK_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDII_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDII_DK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDII_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDII_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDII_QVLD_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDII_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "RLDIII_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDIII_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDIII_RLD_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDIII_QK_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDIII_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDIII_DK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDIII_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDIII_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDIII_QVLD_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDIII_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "RLDX_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDX_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDX_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDX_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDX_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDX_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDII_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDII_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDII_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDIII_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDIII_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "RLDIII_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_MEM_TYPE": [ { "value": "DDR3", "resolve_type": "generated", "usage": "all" } ],
- "C0_IS_CLK_SHARED": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C0_SYSCLK_TYPE": [ { "value": "DIFF", "resolve_type": "generated", "usage": "all" } ],
- "C0_USE_AXI": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_ECC": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C0_DDR3_DQ_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR3_DQS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR3_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR3_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR3_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR3_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR3_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR3_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR3_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR3_ODT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR3_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR3_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR3_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR3_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C0_DDR3_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR3_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C0_DDR2_DQ_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR2_DQS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR2_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR2_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR2_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR2_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR2_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR2_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR2_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR2_ODT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR2_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR2_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR2_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR2_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C0_DDR2_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR2_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C0_LPDDR2_DQ_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_LPDDR2_DQS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_LPDDR2_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_LPDDR2_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_LPDDR2_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_LPDDR2_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_LPDDR2_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_LPDDR2_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_LPDDR2_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_LPDDR2_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_LPDDR2_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_LPDDR2_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_LPDDR2_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C0_LPDDR2_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_LPDDR2_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C0_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C0_DDRX_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDRX_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDRX_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR3_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR3_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR3_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR2_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR2_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_DDR2_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_LPDDR2_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_LPDDR2_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_LPDDR2_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_FREQ_HZ": [ { "value": "100.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C0_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C0_UI_EXTRA_CLOCKS": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C0_MMCM_VCO": [ { "value": "1200.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C0_MMCM_CLKOUT0_FREQ": [ { "value": "10.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C0_MMCM_CLKOUT1_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_MMCM_CLKOUT2_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_MMCM_CLKOUT3_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_MMCM_CLKOUT4_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_MMCM_CLKOUT0_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C0_MMCM_CLKOUT2_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C0_MMCM_CLKOUT1_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C0_MMCM_CLKOUT3_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C0_MMCM_CLKOUT4_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C0_C_S_AXI_CTRL_ID_WIDTH": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_C_S_AXI_CTRL_DATA_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_C_S_AXI_CTRL_ADDR_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_C_S_AXI_CTRL_MEM_SIZE": [ { "value": "1048576", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_C_S_AXI_ID_WIDTH": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_C_S_AXI_DATA_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_C_S_AXI_ADDR_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_C_S_AXI_MEM_SIZE": [ { "value": "1048576", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_QDRIIP_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_QDRIIP_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_QDRIIP_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_QDRIIP_BW_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_QDRIIP_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C0_QDRIIP_BURST_LEN": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDII_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDII_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDII_RLD_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDII_QK_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDII_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDII_DK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDII_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDII_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDII_QVLD_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDII_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C0_RLDIII_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDIII_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDIII_RLD_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDIII_QK_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDIII_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDIII_DK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDIII_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDIII_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDIII_QVLD_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDIII_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C0_RLDX_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDX_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDX_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDX_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDX_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDX_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDII_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDII_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDII_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDIII_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDIII_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_RLDIII_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C0_POLARITY": [ { "value": "ACTIVE_LOW", "resolve_type": "generated", "usage": "all" } ],
- "C1_MEM_TYPE": [ { "value": "DDR3", "resolve_type": "generated", "usage": "all" } ],
- "C1_IS_CLK_SHARED": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C1_SYSCLK_TYPE": [ { "value": "DIFF", "resolve_type": "generated", "usage": "all" } ],
- "C1_USE_AXI": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_ECC": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C1_DDR3_DQ_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR3_DQS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR3_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR3_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR3_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR3_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR3_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR3_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR3_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR3_ODT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR3_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR3_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR3_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR3_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C1_DDR3_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR3_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C1_DDR2_DQ_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR2_DQS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR2_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR2_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR2_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR2_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR2_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR2_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR2_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR2_ODT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR2_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR2_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR2_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR2_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C1_DDR2_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR2_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C1_LPDDR2_DQ_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_LPDDR2_DQS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_LPDDR2_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_LPDDR2_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_LPDDR2_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_LPDDR2_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_LPDDR2_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_LPDDR2_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_LPDDR2_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_LPDDR2_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_LPDDR2_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_LPDDR2_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_LPDDR2_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C1_LPDDR2_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_LPDDR2_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C1_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C1_DDRX_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDRX_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDRX_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR3_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR3_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR3_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR2_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR2_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_DDR2_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_LPDDR2_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_LPDDR2_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_LPDDR2_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_FREQ_HZ": [ { "value": "100.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C1_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C1_UI_EXTRA_CLOCKS": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C1_MMCM_VCO": [ { "value": "1200.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C1_MMCM_CLKOUT0_FREQ": [ { "value": "10.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C1_MMCM_CLKOUT1_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_MMCM_CLKOUT2_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_MMCM_CLKOUT3_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_MMCM_CLKOUT4_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_MMCM_CLKOUT0_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C1_MMCM_CLKOUT2_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C1_MMCM_CLKOUT1_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C1_MMCM_CLKOUT3_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C1_MMCM_CLKOUT4_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C1_C_S_AXI_CTRL_ID_WIDTH": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_C_S_AXI_CTRL_DATA_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_C_S_AXI_CTRL_ADDR_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_C_S_AXI_CTRL_MEM_SIZE": [ { "value": "1048576", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_C_S_AXI_ID_WIDTH": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_C_S_AXI_DATA_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_C_S_AXI_ADDR_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_C_S_AXI_MEM_SIZE": [ { "value": "1048576", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_QDRIIP_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_QDRIIP_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_QDRIIP_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_QDRIIP_BW_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_QDRIIP_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C1_QDRIIP_BURST_LEN": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDII_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDII_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDII_RLD_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDII_QK_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDII_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDII_DK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDII_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDII_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDII_QVLD_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDII_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C1_RLDIII_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDIII_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDIII_RLD_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDIII_QK_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDIII_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDIII_DK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDIII_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDIII_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDIII_QVLD_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDIII_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C1_RLDX_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDX_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDX_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDX_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDX_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDX_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDII_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDII_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDII_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDIII_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDIII_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_RLDIII_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C1_POLARITY": [ { "value": "ACTIVE_LOW", "resolve_type": "generated", "usage": "all" } ],
- "C2_MEM_TYPE": [ { "value": "DDR3", "resolve_type": "generated", "usage": "all" } ],
- "C2_IS_CLK_SHARED": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C2_SYSCLK_TYPE": [ { "value": "DIFF", "resolve_type": "generated", "usage": "all" } ],
- "C2_USE_AXI": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_ECC": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C2_DDR3_DQ_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR3_DQS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR3_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR3_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR3_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR3_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR3_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR3_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR3_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR3_ODT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR3_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR3_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR3_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR3_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C2_DDR3_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR3_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C2_DDR2_DQ_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR2_DQS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR2_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR2_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR2_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR2_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR2_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR2_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR2_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR2_ODT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR2_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR2_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR2_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR2_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C2_DDR2_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR2_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C2_LPDDR2_DQ_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_LPDDR2_DQS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_LPDDR2_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_LPDDR2_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_LPDDR2_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_LPDDR2_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_LPDDR2_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_LPDDR2_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_LPDDR2_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_LPDDR2_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_LPDDR2_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_LPDDR2_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_LPDDR2_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C2_LPDDR2_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_LPDDR2_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C2_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C2_DDRX_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDRX_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDRX_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR3_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR3_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR3_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR2_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR2_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_DDR2_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_LPDDR2_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_LPDDR2_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_LPDDR2_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_FREQ_HZ": [ { "value": "100.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C2_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C2_UI_EXTRA_CLOCKS": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C2_MMCM_VCO": [ { "value": "1200.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C2_MMCM_CLKOUT0_FREQ": [ { "value": "10.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C2_MMCM_CLKOUT1_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_MMCM_CLKOUT2_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_MMCM_CLKOUT3_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_MMCM_CLKOUT4_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_MMCM_CLKOUT0_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C2_MMCM_CLKOUT2_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C2_MMCM_CLKOUT1_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C2_MMCM_CLKOUT3_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C2_MMCM_CLKOUT4_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C2_C_S_AXI_CTRL_ID_WIDTH": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_C_S_AXI_CTRL_DATA_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_C_S_AXI_CTRL_ADDR_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_C_S_AXI_CTRL_MEM_SIZE": [ { "value": "1048576", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_C_S_AXI_ID_WIDTH": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_C_S_AXI_DATA_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_C_S_AXI_ADDR_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_C_S_AXI_MEM_SIZE": [ { "value": "1048576", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_QDRIIP_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_QDRIIP_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_QDRIIP_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_QDRIIP_BW_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_QDRIIP_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C2_QDRIIP_BURST_LEN": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDII_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDII_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDII_RLD_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDII_QK_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDII_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDII_DK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDII_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDII_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDII_QVLD_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDII_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C2_RLDIII_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDIII_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDIII_RLD_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDIII_QK_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDIII_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDIII_DK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDIII_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDIII_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDIII_QVLD_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDIII_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C2_RLDX_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDX_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDX_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDX_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDX_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDX_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDII_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDII_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDII_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDIII_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDIII_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_RLDIII_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C2_POLARITY": [ { "value": "ACTIVE_LOW", "resolve_type": "generated", "usage": "all" } ],
- "C3_MEM_TYPE": [ { "value": "DDR3", "resolve_type": "generated", "usage": "all" } ],
- "C3_IS_CLK_SHARED": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C3_SYSCLK_TYPE": [ { "value": "DIFF", "resolve_type": "generated", "usage": "all" } ],
- "C3_USE_AXI": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_ECC": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C3_DDR3_DQ_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR3_DQS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR3_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR3_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR3_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR3_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR3_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR3_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR3_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR3_ODT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR3_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR3_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR3_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR3_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C3_DDR3_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR3_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C3_DDR2_DQ_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR2_DQS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR2_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR2_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR2_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR2_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR2_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR2_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR2_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR2_ODT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR2_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR2_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR2_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR2_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C3_DDR2_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR2_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C3_LPDDR2_DQ_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_LPDDR2_DQS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_LPDDR2_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_LPDDR2_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_LPDDR2_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_LPDDR2_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_LPDDR2_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_LPDDR2_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_LPDDR2_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_LPDDR2_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_LPDDR2_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_LPDDR2_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_LPDDR2_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C3_LPDDR2_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_LPDDR2_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C3_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C3_DDRX_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDRX_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDRX_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR3_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR3_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR3_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR2_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR2_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_DDR2_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_LPDDR2_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_LPDDR2_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_LPDDR2_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_FREQ_HZ": [ { "value": "100.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C3_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C3_UI_EXTRA_CLOCKS": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C3_MMCM_VCO": [ { "value": "1200.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C3_MMCM_CLKOUT0_FREQ": [ { "value": "10.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C3_MMCM_CLKOUT1_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_MMCM_CLKOUT2_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_MMCM_CLKOUT3_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_MMCM_CLKOUT4_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_MMCM_CLKOUT0_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C3_MMCM_CLKOUT2_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C3_MMCM_CLKOUT1_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C3_MMCM_CLKOUT3_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C3_MMCM_CLKOUT4_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C3_C_S_AXI_CTRL_ID_WIDTH": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_C_S_AXI_CTRL_DATA_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_C_S_AXI_CTRL_ADDR_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_C_S_AXI_CTRL_MEM_SIZE": [ { "value": "1048576", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_C_S_AXI_ID_WIDTH": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_C_S_AXI_DATA_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_C_S_AXI_ADDR_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_C_S_AXI_MEM_SIZE": [ { "value": "1048576", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_QDRIIP_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_QDRIIP_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_QDRIIP_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_QDRIIP_BW_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_QDRIIP_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C3_QDRIIP_BURST_LEN": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDII_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDII_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDII_RLD_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDII_QK_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDII_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDII_DK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDII_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDII_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDII_QVLD_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDII_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C3_RLDIII_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDIII_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDIII_RLD_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDIII_QK_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDIII_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDIII_DK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDIII_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDIII_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDIII_QVLD_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDIII_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C3_RLDX_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDX_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDX_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDX_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDX_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDX_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDII_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDII_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDII_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDIII_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDIII_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_RLDIII_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C3_POLARITY": [ { "value": "ACTIVE_LOW", "resolve_type": "generated", "usage": "all" } ],
- "C4_MEM_TYPE": [ { "value": "DDR3", "resolve_type": "generated", "usage": "all" } ],
- "C4_IS_CLK_SHARED": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C4_SYSCLK_TYPE": [ { "value": "DIFF", "resolve_type": "generated", "usage": "all" } ],
- "C4_USE_AXI": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_ECC": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C4_DDR3_DQ_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR3_DQS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR3_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR3_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR3_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR3_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR3_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR3_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR3_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR3_ODT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR3_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR3_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR3_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR3_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C4_DDR3_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR3_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C4_DDR2_DQ_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR2_DQS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR2_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR2_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR2_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR2_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR2_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR2_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR2_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR2_ODT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR2_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR2_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR2_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR2_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C4_DDR2_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR2_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C4_LPDDR2_DQ_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_LPDDR2_DQS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_LPDDR2_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_LPDDR2_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_LPDDR2_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_LPDDR2_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_LPDDR2_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_LPDDR2_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_LPDDR2_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_LPDDR2_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_LPDDR2_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_LPDDR2_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_LPDDR2_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C4_LPDDR2_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_LPDDR2_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C4_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C4_DDRX_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDRX_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDRX_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR3_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR3_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR3_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR2_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR2_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_DDR2_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_LPDDR2_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_LPDDR2_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_LPDDR2_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_FREQ_HZ": [ { "value": "100.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C4_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C4_UI_EXTRA_CLOCKS": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C4_MMCM_VCO": [ { "value": "1200.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C4_MMCM_CLKOUT0_FREQ": [ { "value": "10.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C4_MMCM_CLKOUT1_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_MMCM_CLKOUT2_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_MMCM_CLKOUT3_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_MMCM_CLKOUT4_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_MMCM_CLKOUT0_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C4_MMCM_CLKOUT2_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C4_MMCM_CLKOUT1_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C4_MMCM_CLKOUT3_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C4_MMCM_CLKOUT4_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C4_C_S_AXI_CTRL_ID_WIDTH": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_C_S_AXI_CTRL_DATA_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_C_S_AXI_CTRL_ADDR_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_C_S_AXI_CTRL_MEM_SIZE": [ { "value": "1048576", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_C_S_AXI_ID_WIDTH": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_C_S_AXI_DATA_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_C_S_AXI_ADDR_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_C_S_AXI_MEM_SIZE": [ { "value": "1048576", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_QDRIIP_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_QDRIIP_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_QDRIIP_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_QDRIIP_BW_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_QDRIIP_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C4_QDRIIP_BURST_LEN": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDII_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDII_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDII_RLD_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDII_QK_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDII_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDII_DK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDII_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDII_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDII_QVLD_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDII_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C4_RLDIII_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDIII_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDIII_RLD_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDIII_QK_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDIII_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDIII_DK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDIII_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDIII_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDIII_QVLD_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDIII_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C4_RLDX_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDX_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDX_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDX_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDX_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDX_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDII_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDII_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDII_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDIII_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDIII_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_RLDIII_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C4_POLARITY": [ { "value": "ACTIVE_LOW", "resolve_type": "generated", "usage": "all" } ],
- "C5_MEM_TYPE": [ { "value": "DDR3", "resolve_type": "generated", "usage": "all" } ],
- "C5_IS_CLK_SHARED": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C5_SYSCLK_TYPE": [ { "value": "DIFF", "resolve_type": "generated", "usage": "all" } ],
- "C5_USE_AXI": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_ECC": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C5_DDR3_DQ_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR3_DQS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR3_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR3_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR3_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR3_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR3_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR3_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR3_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR3_ODT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR3_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR3_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR3_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR3_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C5_DDR3_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR3_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C5_DDR2_DQ_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR2_DQS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR2_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR2_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR2_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR2_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR2_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR2_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR2_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR2_ODT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR2_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR2_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR2_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR2_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C5_DDR2_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR2_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C5_LPDDR2_DQ_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_LPDDR2_DQS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_LPDDR2_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_LPDDR2_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_LPDDR2_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_LPDDR2_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_LPDDR2_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_LPDDR2_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_LPDDR2_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_LPDDR2_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_LPDDR2_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_LPDDR2_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_LPDDR2_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C5_LPDDR2_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_LPDDR2_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C5_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C5_DDRX_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDRX_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDRX_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR3_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR3_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR3_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR2_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR2_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_DDR2_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_LPDDR2_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_LPDDR2_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_LPDDR2_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_FREQ_HZ": [ { "value": "100.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C5_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C5_UI_EXTRA_CLOCKS": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C5_MMCM_VCO": [ { "value": "1200.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C5_MMCM_CLKOUT0_FREQ": [ { "value": "10.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C5_MMCM_CLKOUT1_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_MMCM_CLKOUT2_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_MMCM_CLKOUT3_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_MMCM_CLKOUT4_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_MMCM_CLKOUT0_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C5_MMCM_CLKOUT2_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C5_MMCM_CLKOUT1_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C5_MMCM_CLKOUT3_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C5_MMCM_CLKOUT4_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C5_C_S_AXI_CTRL_ID_WIDTH": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_C_S_AXI_CTRL_DATA_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_C_S_AXI_CTRL_ADDR_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_C_S_AXI_CTRL_MEM_SIZE": [ { "value": "1048576", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_C_S_AXI_ID_WIDTH": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_C_S_AXI_DATA_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_C_S_AXI_ADDR_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_C_S_AXI_MEM_SIZE": [ { "value": "1048576", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_QDRIIP_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_QDRIIP_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_QDRIIP_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_QDRIIP_BW_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_QDRIIP_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C5_QDRIIP_BURST_LEN": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDII_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDII_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDII_RLD_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDII_QK_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDII_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDII_DK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDII_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDII_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDII_QVLD_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDII_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C5_RLDIII_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDIII_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDIII_RLD_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDIII_QK_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDIII_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDIII_DK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDIII_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDIII_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDIII_QVLD_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDIII_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C5_RLDX_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDX_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDX_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDX_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDX_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDX_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDII_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDII_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDII_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDIII_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDIII_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_RLDIII_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C5_POLARITY": [ { "value": "ACTIVE_LOW", "resolve_type": "generated", "usage": "all" } ],
- "C6_MEM_TYPE": [ { "value": "DDR3", "resolve_type": "generated", "usage": "all" } ],
- "C6_IS_CLK_SHARED": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C6_SYSCLK_TYPE": [ { "value": "DIFF", "resolve_type": "generated", "usage": "all" } ],
- "C6_USE_AXI": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_ECC": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C6_DDR3_DQ_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR3_DQS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR3_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR3_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR3_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR3_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR3_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR3_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR3_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR3_ODT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR3_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR3_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR3_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR3_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C6_DDR3_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR3_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C6_DDR2_DQ_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR2_DQS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR2_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR2_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR2_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR2_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR2_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR2_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR2_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR2_ODT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR2_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR2_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR2_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR2_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C6_DDR2_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR2_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C6_LPDDR2_DQ_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_LPDDR2_DQS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_LPDDR2_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_LPDDR2_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_LPDDR2_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_LPDDR2_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_LPDDR2_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_LPDDR2_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_LPDDR2_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_LPDDR2_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_LPDDR2_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_LPDDR2_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_LPDDR2_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C6_LPDDR2_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_LPDDR2_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C6_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C6_DDRX_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDRX_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDRX_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR3_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR3_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR3_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR2_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR2_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_DDR2_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_LPDDR2_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_LPDDR2_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_LPDDR2_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_FREQ_HZ": [ { "value": "100.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C6_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C6_UI_EXTRA_CLOCKS": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C6_MMCM_VCO": [ { "value": "1200.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C6_MMCM_CLKOUT0_FREQ": [ { "value": "10.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C6_MMCM_CLKOUT1_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_MMCM_CLKOUT2_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_MMCM_CLKOUT3_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_MMCM_CLKOUT4_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_MMCM_CLKOUT0_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C6_MMCM_CLKOUT2_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C6_MMCM_CLKOUT1_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C6_MMCM_CLKOUT3_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C6_MMCM_CLKOUT4_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C6_C_S_AXI_CTRL_ID_WIDTH": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_C_S_AXI_CTRL_DATA_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_C_S_AXI_CTRL_ADDR_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_C_S_AXI_CTRL_MEM_SIZE": [ { "value": "1048576", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_C_S_AXI_ID_WIDTH": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_C_S_AXI_DATA_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_C_S_AXI_ADDR_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_C_S_AXI_MEM_SIZE": [ { "value": "1048576", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_QDRIIP_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_QDRIIP_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_QDRIIP_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_QDRIIP_BW_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_QDRIIP_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C6_QDRIIP_BURST_LEN": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDII_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDII_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDII_RLD_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDII_QK_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDII_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDII_DK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDII_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDII_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDII_QVLD_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDII_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C6_RLDIII_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDIII_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDIII_RLD_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDIII_QK_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDIII_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDIII_DK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDIII_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDIII_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDIII_QVLD_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDIII_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C6_RLDX_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDX_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDX_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDX_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDX_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDX_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDII_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDII_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDII_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDIII_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDIII_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_RLDIII_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C6_POLARITY": [ { "value": "ACTIVE_LOW", "resolve_type": "generated", "usage": "all" } ],
- "C7_MEM_TYPE": [ { "value": "DDR3", "resolve_type": "generated", "usage": "all" } ],
- "C7_IS_CLK_SHARED": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C7_SYSCLK_TYPE": [ { "value": "DIFF", "resolve_type": "generated", "usage": "all" } ],
- "C7_USE_AXI": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_ECC": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C7_DDR3_DQ_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR3_DQS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR3_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR3_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR3_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR3_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR3_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR3_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR3_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR3_ODT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR3_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR3_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR3_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR3_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C7_DDR3_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR3_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C7_DDR2_DQ_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR2_DQS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR2_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR2_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR2_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR2_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR2_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR2_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR2_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR2_ODT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR2_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR2_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR2_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR2_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C7_DDR2_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR2_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C7_LPDDR2_DQ_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_LPDDR2_DQS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_LPDDR2_ROW_WIDTH": [ { "value": "14", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_LPDDR2_BANK_WIDTH": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_LPDDR2_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_LPDDR2_CKE_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_LPDDR2_CS_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_LPDDR2_nCS_PER_RANK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_LPDDR2_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_LPDDR2_USE_CS_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_LPDDR2_USE_DM_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_LPDDR2_USE_ODT_PORT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_LPDDR2_REG_CTRL": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C7_LPDDR2_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_LPDDR2_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C7_DQS_CNT_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C7_DDRX_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDRX_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDRX_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR3_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR3_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR3_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR2_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR2_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_DDR2_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_LPDDR2_ADDR_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_LPDDR2_nCK_PER_CLK": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_LPDDR2_DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_FREQ_HZ": [ { "value": "100.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C7_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C7_UI_EXTRA_CLOCKS": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C7_MMCM_VCO": [ { "value": "1200.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C7_MMCM_CLKOUT0_FREQ": [ { "value": "10.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
- "C7_MMCM_CLKOUT1_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_MMCM_CLKOUT2_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_MMCM_CLKOUT3_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_MMCM_CLKOUT4_FREQ": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_MMCM_CLKOUT0_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C7_MMCM_CLKOUT2_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C7_MMCM_CLKOUT1_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C7_MMCM_CLKOUT3_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C7_MMCM_CLKOUT4_EN": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
- "C7_C_S_AXI_CTRL_ID_WIDTH": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_C_S_AXI_CTRL_DATA_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_C_S_AXI_CTRL_ADDR_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_C_S_AXI_CTRL_MEM_SIZE": [ { "value": "1048576", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_C_S_AXI_ID_WIDTH": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_C_S_AXI_DATA_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_C_S_AXI_ADDR_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_C_S_AXI_MEM_SIZE": [ { "value": "1048576", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_QDRIIP_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_QDRIIP_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_QDRIIP_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_QDRIIP_BW_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_QDRIIP_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C7_QDRIIP_BURST_LEN": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDII_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDII_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDII_RLD_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDII_QK_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDII_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDII_DK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDII_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDII_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDII_QVLD_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDII_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C7_RLDIII_NUM_DEVICES": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDIII_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDIII_RLD_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDIII_QK_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDIII_CK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDIII_DK_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDIII_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDIII_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDIII_QVLD_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDIII_DEBUG_PORT": [ { "value": "OFF", "resolve_type": "generated", "usage": "all" } ],
- "C7_RLDX_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDX_DATA_WIDTH": [ { "value": "18", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDX_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDX_BANK_WIDTH": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDX_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDX_DM_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDII_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDII_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDII_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDIII_CMD_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDIII_ADDR_WIDTH": [ { "value": "29", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_RLDIII_nCK_PER_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
- "C7_POLARITY": [ { "value": "ACTIVE_LOW", "resolve_type": "generated", "usage": "all" } ]
- },
- "project_parameters": {
- "ARCHITECTURE": [ { "value": "artix7" } ],
- "BASE_BOARD_PART": [ { "value": "" } ],
- "BOARD_CONNECTIONS": [ { "value": "" } ],
- "DEVICE": [ { "value": "xc7a35ti" } ],
- "PACKAGE": [ { "value": "csg324" } ],
- "PREFHDL": [ { "value": "VERILOG" } ],
- "SILICON_REVISION": [ { "value": "" } ],
- "SIMULATOR_LANGUAGE": [ { "value": "MIXED" } ],
- "SPEEDGRADE": [ { "value": "-1L" } ],
- "STATIC_POWER": [ { "value": "" } ],
- "TEMPERATURE_GRADE": [ { "value": "I" } ]
- },
- "runtime_parameters": {
- "IPCONTEXT": [ { "value": "IP_Flow" } ],
- "IPREVISION": [ { "value": "2" } ],
- "MANAGED": [ { "value": "TRUE" } ],
- "OUTPUTDIR": [ { "value": "." } ],
- "SELECTEDSIMMODEL": [ { "value": "" } ],
- "SHAREDDIR": [ { "value": "." } ],
- "SWVERSION": [ { "value": "2024.2.2" } ],
- "SYNTHESISFLOW": [ { "value": "OUT_OF_CONTEXT" } ]
- }
- },
- "boundary": {
- "ports": {
- "sys_rst": [ { "direction": "in" } ],
- "clk_ref_i": [ { "direction": "in", "display_name": "Clock P", "description": "Clock P" } ],
- "ddr3_dq": [ { "direction": "inout", "size_left": "15", "size_right": "0", "display_name": "Data", "description": "Data" } ],
- "ddr3_dqs_p": [ { "direction": "inout", "size_left": "1", "size_right": "0", "display_name": "Data Strobe", "description": "Data Strobe" } ],
- "ddr3_dqs_n": [ { "direction": "inout", "size_left": "1", "size_right": "0", "display_name": "Data Strobe", "description": "Data Strobe" } ],
- "ddr3_addr": [ { "direction": "out", "size_left": "13", "size_right": "0", "display_name": "Address", "description": "Address" } ],
- "ddr3_ba": [ { "direction": "out", "size_left": "2", "size_right": "0", "display_name": "Bank Address", "description": "Bank Address" } ],
- "ddr3_ras_n": [ { "direction": "out", "display_name": "row address strobe", "description": "row address strobe" } ],
- "ddr3_cas_n": [ { "direction": "out", "display_name": "column address strobe", "description": "column address strobe" } ],
- "ddr3_we_n": [ { "direction": "out", "display_name": "write enable", "description": "write enable" } ],
- "ddr3_reset_n": [ { "direction": "out", "display_name": "reset to memory device", "description": "reset to memory device" } ],
- "ddr3_ck_p": [ { "direction": "out", "size_left": "0", "size_right": "0", "display_name": "clock to memory device", "description": "clock to memory device" } ],
- "ddr3_ck_n": [ { "direction": "out", "size_left": "0", "size_right": "0", "display_name": "clock to memory device", "description": "clock to memory device" } ],
- "ddr3_cke": [ { "direction": "out", "size_left": "0", "size_right": "0", "display_name": "clock enable", "description": "clock enable" } ],
- "ddr3_cs_n": [ { "direction": "out", "size_left": "0", "size_right": "0", "display_name": "chip select", "description": "chip select" } ],
- "ddr3_dm": [ { "direction": "out", "size_left": "1", "size_right": "0", "display_name": "data mask", "description": "data mask" } ],
- "ddr3_odt": [ { "direction": "out", "size_left": "0", "size_right": "0", "display_name": "on die termination", "description": "on die termination" } ],
- "app_addr": [ { "direction": "in", "size_left": "7", "size_right": "0" } ],
- "app_cmd": [ { "direction": "in", "size_left": "2", "size_right": "0" } ],
- "app_en": [ { "direction": "in" } ],
- "app_wdf_data": [ { "direction": "in", "size_left": "31", "size_right": "0" } ],
- "app_wdf_end": [ { "direction": "in" } ],
- "app_wdf_mask": [ { "direction": "in", "size_left": "3", "size_right": "0" } ],
- "app_wdf_wren": [ { "direction": "in" } ],
- "app_rd_data": [ { "direction": "out", "size_left": "31", "size_right": "0" } ],
- "app_rd_data_end": [ { "direction": "out" } ],
- "app_rd_data_valid": [ { "direction": "out" } ],
- "app_rdy": [ { "direction": "out" } ],
- "app_wdf_rdy": [ { "direction": "out" } ],
- "app_sr_req": [ { "direction": "in" } ],
- "app_sr_active": [ { "direction": "out" } ],
- "app_ref_req": [ { "direction": "in" } ],
- "app_ref_ack": [ { "direction": "out" } ],
- "app_zq_req": [ { "direction": "in" } ],
- "app_zq_ack": [ { "direction": "out" } ],
- "ui_clk_sync_rst": [ { "direction": "out" } ],
- "ui_clk": [ { "direction": "out" } ],
- "sys_clk_i": [ { "direction": "in", "display_name": "Clock P", "description": "Clock P" } ],
- "init_calib_complete": [ { "direction": "out" } ],
- "aresetn": [ { "direction": "in" } ]
- },
- "interfaces": {
- "SYSTEM_RESET": {
- "vlnv": "xilinx.com:signal:reset:1.0",
- "abstraction_type": "xilinx.com:signal:reset_rtl:1.0",
- "mode": "slave",
- "parameters": {
- "POLARITY": [ { "value": "ACTIVE_LOW", "resolve_type": "dependent", "usage": "all" } ],
- "BOARD.ASSOCIATED_PARAM": [ { "value": "RESET_BOARD_INTERFACE", "value_src": "constant", "usage": "all" } ],
- "INSERT_VIP": [ { "value": "0", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ]
- },
- "port_maps": {
- "RST": [ { "physical_name": "sys_rst" } ]
- }
- },
- "CLK_REF_I": {
- "vlnv": "xilinx.com:signal:clock:1.0",
- "abstraction_type": "xilinx.com:signal:clock_rtl:1.0",
- "mode": "slave",
- "parameters": {
- "FREQ_HZ": [ { "value": "100000000", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ],
- "FREQ_TOLERANCE_HZ": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ],
- "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ],
- "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "ASSOCIATED_BUSIF": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "ASSOCIATED_PORT": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "ASSOCIATED_RESET": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ]
- },
- "port_maps": {
- "CLK": [ { "physical_name": "clk_ref_i" } ]
- }
- },
- "DDR3": {
- "vlnv": "xilinx.com:interface:ddrx:1.0",
- "abstraction_type": "xilinx.com:interface:ddrx_rtl:1.0",
- "mode": "master",
- "parameters": {
- "CAN_DEBUG": [ { "value": "false", "resolve_type": "generated", "format": "bool", "is_ips_inferred": true, "is_static_object": false } ],
- "TIMEPERIOD_PS": [ { "value": "1250", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "MEMORY_TYPE": [ { "value": "COMPONENTS", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "MEMORY_PART": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "DATA_WIDTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ],
- "CS_ENABLED": [ { "value": "true", "resolve_type": "generated", "format": "bool", "is_ips_inferred": true, "is_static_object": false } ],
- "DATA_MASK_ENABLED": [ { "value": "true", "resolve_type": "generated", "format": "bool", "is_ips_inferred": true, "is_static_object": false } ],
- "SLOT": [ { "value": "Single", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "CUSTOM_PARTS": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "MEM_ADDR_MAP": [ { "value": "ROW_COLUMN_BANK", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "BURST_LENGTH": [ { "value": "8", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ],
- "AXI_ARBITRATION_SCHEME": [ { "value": "TDM", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "CAS_LATENCY": [ { "value": "11", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ],
- "CAS_WRITE_LATENCY": [ { "value": "11", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ]
- },
- "port_maps": {
- "DQ": [ { "physical_name": "ddr3_dq" } ],
- "DQS_P": [ { "physical_name": "ddr3_dqs_p" } ],
- "DQS_N": [ { "physical_name": "ddr3_dqs_n" } ],
- "ADDR": [ { "physical_name": "ddr3_addr" } ],
- "BA": [ { "physical_name": "ddr3_ba" } ],
- "RAS_N": [ { "physical_name": "ddr3_ras_n" } ],
- "CAS_N": [ { "physical_name": "ddr3_cas_n" } ],
- "WE_N": [ { "physical_name": "ddr3_we_n" } ],
- "RESET_N": [ { "physical_name": "ddr3_reset_n" } ],
- "CK_P": [ { "physical_name": "ddr3_ck_p" } ],
- "CK_N": [ { "physical_name": "ddr3_ck_n" } ],
- "CKE": [ { "physical_name": "ddr3_cke" } ],
- "CS_N": [ { "physical_name": "ddr3_cs_n" } ],
- "DM": [ { "physical_name": "ddr3_dm" } ],
- "ODT": [ { "physical_name": "ddr3_odt" } ]
- }
- },
- "RESET": {
- "vlnv": "xilinx.com:signal:reset:1.0",
- "abstraction_type": "xilinx.com:signal:reset_rtl:1.0",
- "mode": "master",
- "parameters": {
- "POLARITY": [ { "value": "ACTIVE_HIGH", "value_src": "constant", "usage": "all" } ],
- "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ]
- },
- "port_maps": {
- "RST": [ { "physical_name": "ui_clk_sync_rst" } ]
- }
- },
- "DDR3_RESET": {
- "vlnv": "xilinx.com:signal:reset:1.0",
- "abstraction_type": "xilinx.com:signal:reset_rtl:1.0",
- "mode": "master",
- "parameters": {
- "POLARITY": [ { "value": "ACTIVE_HIGH", "value_src": "constant", "usage": "all" } ],
- "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ]
- }
- },
- "DDR2_RESET": {
- "vlnv": "xilinx.com:signal:reset:1.0",
- "abstraction_type": "xilinx.com:signal:reset_rtl:1.0",
- "mode": "master",
- "parameters": {
- "POLARITY": [ { "value": "ACTIVE_HIGH", "value_src": "constant", "usage": "all" } ],
- "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ]
- }
- },
- "LPDDR2_RESET": {
- "vlnv": "xilinx.com:signal:reset:1.0",
- "abstraction_type": "xilinx.com:signal:reset_rtl:1.0",
- "mode": "master",
- "parameters": {
- "POLARITY": [ { "value": "ACTIVE_HIGH", "value_src": "constant", "usage": "all" } ],
- "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ]
- }
- },
- "QDRIIP_RESET": {
- "vlnv": "xilinx.com:signal:reset:1.0",
- "abstraction_type": "xilinx.com:signal:reset_rtl:1.0",
- "mode": "master",
- "parameters": {
- "POLARITY": [ { "value": "ACTIVE_HIGH", "value_src": "constant", "usage": "all" } ],
- "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ]
- }
- },
- "RLDII_RESET": {
- "vlnv": "xilinx.com:signal:reset:1.0",
- "abstraction_type": "xilinx.com:signal:reset_rtl:1.0",
- "mode": "master",
- "parameters": {
- "POLARITY": [ { "value": "ACTIVE_HIGH", "value_src": "constant", "usage": "all" } ],
- "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ]
- }
- },
- "RLDIII_RESET": {
- "vlnv": "xilinx.com:signal:reset:1.0",
- "abstraction_type": "xilinx.com:signal:reset_rtl:1.0",
- "mode": "master",
- "parameters": {
- "POLARITY": [ { "value": "ACTIVE_HIGH", "value_src": "constant", "usage": "all" } ],
- "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ]
- }
- },
- "CLOCK": {
- "vlnv": "xilinx.com:signal:clock:1.0",
- "abstraction_type": "xilinx.com:signal:clock_rtl:1.0",
- "mode": "master",
- "parameters": {
- "FREQ_HZ": [ { "value": "76923077", "resolve_type": "dependent", "format": "float", "usage": "all" } ],
- "ASSOCIATED_BUSIF": [ { "value": "S_AXI:S_AXI_CTRL", "value_src": "constant", "usage": "all" } ],
- "ASSOCIATED_RESET": [ { "value": "aresetn:ui_clk_sync_rst", "value_src": "constant", "usage": "all" } ],
- "PHASE": [ { "value": "0", "resolve_type": "dependent", "format": "float", "usage": "all" } ],
- "FREQ_TOLERANCE_HZ": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ],
- "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "ASSOCIATED_PORT": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ]
- },
- "port_maps": {
- "CLK": [ { "physical_name": "ui_clk" } ]
- }
- },
- "MMCM_CLKOUT0": {
- "vlnv": "xilinx.com:signal:clock:1.0",
- "abstraction_type": "xilinx.com:signal:clock_rtl:1.0",
- "mode": "master",
- "parameters": {
- "FREQ_HZ": [ { "value": "10", "resolve_type": "dependent", "format": "float", "usage": "all" } ],
- "ASSOCIATED_ASYNC_RESET": [ { "value": "aresetn", "value_src": "constant", "usage": "all" } ],
- "PHASE": [ { "value": "0", "resolve_type": "dependent", "format": "float", "usage": "all" } ],
- "FREQ_TOLERANCE_HZ": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ],
- "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "ASSOCIATED_BUSIF": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "ASSOCIATED_PORT": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "ASSOCIATED_RESET": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ]
- }
- },
- "MMCM_CLKOUT1": {
- "vlnv": "xilinx.com:signal:clock:1.0",
- "abstraction_type": "xilinx.com:signal:clock_rtl:1.0",
- "mode": "master",
- "parameters": {
- "FREQ_HZ": [ { "value": "10", "resolve_type": "dependent", "format": "float", "usage": "all" } ],
- "ASSOCIATED_ASYNC_RESET": [ { "value": "aresetn", "value_src": "constant", "usage": "all" } ],
- "PHASE": [ { "value": "0", "resolve_type": "dependent", "format": "float", "usage": "all" } ],
- "FREQ_TOLERANCE_HZ": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ],
- "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "ASSOCIATED_BUSIF": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "ASSOCIATED_PORT": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "ASSOCIATED_RESET": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ]
- }
- },
- "MMCM_CLKOUT2": {
- "vlnv": "xilinx.com:signal:clock:1.0",
- "abstraction_type": "xilinx.com:signal:clock_rtl:1.0",
- "mode": "master",
- "parameters": {
- "FREQ_HZ": [ { "value": "10", "resolve_type": "dependent", "format": "float", "usage": "all" } ],
- "ASSOCIATED_ASYNC_RESET": [ { "value": "aresetn", "value_src": "constant", "usage": "all" } ],
- "PHASE": [ { "value": "0", "resolve_type": "dependent", "format": "float", "usage": "all" } ],
- "FREQ_TOLERANCE_HZ": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ],
- "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "ASSOCIATED_BUSIF": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "ASSOCIATED_PORT": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "ASSOCIATED_RESET": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ]
- }
- },
- "MMCM_CLKOUT3": {
- "vlnv": "xilinx.com:signal:clock:1.0",
- "abstraction_type": "xilinx.com:signal:clock_rtl:1.0",
- "mode": "master",
- "parameters": {
- "FREQ_HZ": [ { "value": "10", "resolve_type": "dependent", "format": "float", "usage": "all" } ],
- "ASSOCIATED_ASYNC_RESET": [ { "value": "aresetn", "value_src": "constant", "usage": "all" } ],
- "PHASE": [ { "value": "0", "resolve_type": "dependent", "format": "float", "usage": "all" } ],
- "FREQ_TOLERANCE_HZ": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ],
- "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "ASSOCIATED_BUSIF": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "ASSOCIATED_PORT": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "ASSOCIATED_RESET": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ]
- }
- },
- "MMCM_CLKOUT4": {
- "vlnv": "xilinx.com:signal:clock:1.0",
- "abstraction_type": "xilinx.com:signal:clock_rtl:1.0",
- "mode": "master",
- "parameters": {
- "FREQ_HZ": [ { "value": "10", "resolve_type": "dependent", "format": "float", "usage": "all" } ],
- "ASSOCIATED_ASYNC_RESET": [ { "value": "aresetn", "value_src": "constant", "usage": "all" } ],
- "PHASE": [ { "value": "0", "resolve_type": "dependent", "format": "float", "usage": "all" } ],
- "FREQ_TOLERANCE_HZ": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ],
- "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "ASSOCIATED_BUSIF": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "ASSOCIATED_PORT": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "ASSOCIATED_RESET": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ]
- }
- },
- "SYS_CLK_I": {
- "vlnv": "xilinx.com:signal:clock:1.0",
- "abstraction_type": "xilinx.com:signal:clock_rtl:1.0",
- "mode": "slave",
- "parameters": {
- "FREQ_HZ": [ { "value": "100000000", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ],
- "FREQ_TOLERANCE_HZ": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ],
- "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ],
- "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "ASSOCIATED_BUSIF": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "ASSOCIATED_PORT": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "ASSOCIATED_RESET": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ],
- "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ]
- },
- "port_maps": {
- "CLK": [ { "physical_name": "sys_clk_i" } ]
- }
- },
- "ARESETN": {
- "vlnv": "xilinx.com:signal:reset:1.0",
- "abstraction_type": "xilinx.com:signal:reset_rtl:1.0",
- "mode": "slave",
- "parameters": {
- "POLARITY": [ { "value": "ACTIVE_LOW", "value_src": "constant", "usage": "all" } ],
- "INSERT_VIP": [ { "value": "0", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ]
- },
- "port_maps": {
- "ARESETN": [ { "physical_name": "aresetn" } ]
- }
- },
- "C0_ARESETN": {
- "vlnv": "xilinx.com:signal:reset:1.0",
- "abstraction_type": "xilinx.com:signal:reset_rtl:1.0",
- "mode": "slave",
- "parameters": {
- "POLARITY": [ { "value": "ACTIVE_LOW", "value_src": "constant", "usage": "all" } ],
- "INSERT_VIP": [ { "value": "0", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ]
- }
- },
- "C1_ARESETN": {
- "vlnv": "xilinx.com:signal:reset:1.0",
- "abstraction_type": "xilinx.com:signal:reset_rtl:1.0",
- "mode": "slave",
- "parameters": {
- "POLARITY": [ { "value": "ACTIVE_LOW", "value_src": "constant", "usage": "all" } ],
- "INSERT_VIP": [ { "value": "0", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ]
- }
- },
- "C2_ARESETN": {
- "vlnv": "xilinx.com:signal:reset:1.0",
- "abstraction_type": "xilinx.com:signal:reset_rtl:1.0",
- "mode": "slave",
- "parameters": {
- "POLARITY": [ { "value": "ACTIVE_LOW", "value_src": "constant", "usage": "all" } ],
- "INSERT_VIP": [ { "value": "0", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ]
- }
- },
- "C3_ARESETN": {
- "vlnv": "xilinx.com:signal:reset:1.0",
- "abstraction_type": "xilinx.com:signal:reset_rtl:1.0",
- "mode": "slave",
- "parameters": {
- "POLARITY": [ { "value": "ACTIVE_LOW", "value_src": "constant", "usage": "all" } ],
- "INSERT_VIP": [ { "value": "0", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ]
- }
- },
- "C4_ARESETN": {
- "vlnv": "xilinx.com:signal:reset:1.0",
- "abstraction_type": "xilinx.com:signal:reset_rtl:1.0",
- "mode": "slave",
- "parameters": {
- "POLARITY": [ { "value": "ACTIVE_LOW", "value_src": "constant", "usage": "all" } ],
- "INSERT_VIP": [ { "value": "0", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ]
- }
- },
- "C5_ARESETN": {
- "vlnv": "xilinx.com:signal:reset:1.0",
- "abstraction_type": "xilinx.com:signal:reset_rtl:1.0",
- "mode": "slave",
- "parameters": {
- "POLARITY": [ { "value": "ACTIVE_LOW", "value_src": "constant", "usage": "all" } ],
- "INSERT_VIP": [ { "value": "0", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ]
- }
- },
- "C6_ARESETN": {
- "vlnv": "xilinx.com:signal:reset:1.0",
- "abstraction_type": "xilinx.com:signal:reset_rtl:1.0",
- "mode": "slave",
- "parameters": {
- "POLARITY": [ { "value": "ACTIVE_LOW", "value_src": "constant", "usage": "all" } ],
- "INSERT_VIP": [ { "value": "0", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ]
- }
- },
- "C7_ARESETN": {
- "vlnv": "xilinx.com:signal:reset:1.0",
- "abstraction_type": "xilinx.com:signal:reset_rtl:1.0",
- "mode": "slave",
- "parameters": {
- "POLARITY": [ { "value": "ACTIVE_LOW", "value_src": "constant", "usage": "all" } ],
- "INSERT_VIP": [ { "value": "0", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ]
- }
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/tridoracpu/tridoracpu.srcs/sdspi.v b/tridoracpu/tridoracpu.srcs/sdspi.v
index 9f5c84d..7141288 100644
--- a/tridoracpu/tridoracpu.srcs/sdspi.v
+++ b/tridoracpu/tridoracpu.srcs/sdspi.v
@@ -107,7 +107,7 @@ module sdspi(
tx_fifo_empty
);
- fifo #(.ADDR_WIDTH(10)) rx_fifo(clk, reset,
+ fifo #(.ADDR_WIDTH(8)) rx_fifo(clk, reset,
rx_fifo_wr_en, rx_fifo_rd_en,
rx_shifter, rx_fifo_out,
rx_fifo_full,
diff --git a/tridoracpu/tridoracpu.srcs/stackcpu.v b/tridoracpu/tridoracpu.srcs/stackcpu.v
index b8ef78c..c65ae4e 100644
--- a/tridoracpu/tridoracpu.srcs/stackcpu.v
+++ b/tridoracpu/tridoracpu.srcs/stackcpu.v
@@ -11,16 +11,22 @@ module stackcpu #(parameter ADDR_WIDTH = 32, WIDTH = 32,
output reg [ADDR_WIDTH-1:0] addr,
input wire [WIDTH-1:0] data_in,
output wire read_enable,
- output wire read_ins,
output wire [WIDTH-1:0] data_out,
output wire write_enable,
input wire mem_wait,
- output wire debug1,
- output wire debug2,
- output wire debug3
+ output wire led1,
+ output wire led2,
+ output wire led3,
+
+ output wire [WIDTH-1:0] debug_out1,
+ output wire [WIDTH-1:0] debug_out2,
+ output wire [WIDTH-1:0] debug_out3,
+ output wire [WIDTH-1:0] debug_out4,
+ output wire [WIDTH-1:0] debug_out5,
+ output wire [WIDTH-1:0] debug_out6
);
-
+
localparam EVAL_STACK_INDEX_WIDTH = 6;
wire reset = !rst;
@@ -90,6 +96,7 @@ module stackcpu #(parameter ADDR_WIDTH = 32, WIDTH = 32,
wire mem_write;
wire x_is_zero;
+ // wire [WIDTH-1:0] y_plus_operand = Y + operand;
wire x_equals_y = X == Y;
wire y_lessthan_x = $signed(Y) < $signed(X);
@@ -104,10 +111,16 @@ module stackcpu #(parameter ADDR_WIDTH = 32, WIDTH = 32,
assign write_enable = mem_write_enable;
// debug output ------------------------------------------------------------------------------------
- assign debug1 = reset;
- assign debug2 = ins_loadc;
- assign debug3 = ins_branch;
-
+ assign led1 = reset;
+ assign led2 = ins_loadc;
+ assign led3 = ins_branch;
+// assign debug_out1 = { mem_read_enable, mem_write_enable, x_is_zero,
+// ins_branch, ins_aluop, y_lessthan_x, x_equals_y, {7{1'b0}}, seq_state};
+// assign debug_out2 = data_in;
+// assign debug_out3 = nX;
+// assign debug_out4 = nPC;
+// assign debug_out5 = ins;
+// assign debug_out6 = IV;
//--------------------------------------------------------------------------------------------------
// instruction decoding
@@ -169,8 +182,6 @@ module stackcpu #(parameter ADDR_WIDTH = 32, WIDTH = 32,
assign mem_read_enable = (seq_state == FETCH) || (seq_state == EXEC && mem_read);
assign mem_write_enable = (seq_state == MEM && mem_write);
- assign read_ins = (seq_state == FETCH) || (seq_state == DECODE);
-
initial
begin
PC <= 0; nPC <= 0; seq_state <= MEM;
@@ -399,10 +410,7 @@ module stackcpu #(parameter ADDR_WIDTH = 32, WIDTH = 32,
// process irq
always @(posedge clk)
begin
- // in MEM state, clear irq_pending, when nPC has been set to IV
- // RET instruction is a special case because we need to use
- // the new PC that is in mem_data
- if(seq_state == MEM && irq_pending && !(ins_xfer && xfer_r2p))
+ if(seq_state == MEM && irq_pending && !(ins_xfer & xfer_r2p)) // in FETCH state, clear irq_pending.
irq_pending <= 0;
else
irq_pending <= irq_pending || irq; // else set irq_pending when irq is high
diff --git a/tridoracpu/tridoracpu.srcs/tdraudio.v b/tridoracpu/tridoracpu.srcs/tdraudio.v
deleted file mode 100644
index 4ad978d..0000000
--- a/tridoracpu/tridoracpu.srcs/tdraudio.v
+++ /dev/null
@@ -1,270 +0,0 @@
-`timescale 1ns / 1ps
-
-// waveform generator module (PCM)
-module wavegen #(DATA_WIDTH=32, CLOCK_DIV_WIDTH=22,
- AMP_WIDTH=16, AMP_BIAS=32768) (
- input wire clk,
- input wire reset,
- input wire [1:0] reg_sel,
- output wire [DATA_WIDTH-1:0] rd_data,
- input wire [AMP_WIDTH-1:0] wr_data,
- input wire rd_en,
- input wire wr_en,
-
- output wire [AMP_WIDTH-1:0] amp_val,
- output wire running,
- output wire irq
- );
-
- localparam TDRAU_REG_CTL = 0; /* control register */
- localparam TDRAU_REG_CLK = 1; /* clock divider register */
- localparam TDRAU_REG_AMP = 2; /* amplitude (volume) register */
-
- /* avoid warning about unconnected port */
- (* keep="soft" *) wire _unused = rd_en;
-
- reg channel_enable;
- reg [CLOCK_DIV_WIDTH-1:0] clock_div;
- reg [CLOCK_DIV_WIDTH-1:0] div_count;
- reg amp_phase;
- reg [AMP_WIDTH-1:0] amp_out;
-
-
- wire fifo_wr_en;
- wire fifo_rd_en, fifo_full, fifo_empty;
- wire [AMP_WIDTH-1:0] fifo_rd_data;
-
- fifo #(.ADDR_WIDTH(4), .DATA_WIDTH(16)) sample_buf(
- clk, reset,
- fifo_wr_en, fifo_rd_en,
- wr_data[AMP_WIDTH-1:0], fifo_rd_data,
- fifo_full,
- fifo_empty
- );
-
- assign fifo_rd_en = (div_count == 0) && channel_enable && ~fifo_empty;
- assign fifo_wr_en = wr_en && (reg_sel == TDRAU_REG_AMP);
-
- reg irq_buf, irq_enable;
- assign irq = channel_enable && irq_buf;
-
- reg [DATA_WIDTH-1:0] rd_data_buf;
- assign rd_data = rd_data_buf;
-
- assign amp_val = amp_out;
- assign running = channel_enable;
-
- wire ctl_reg_write = wr_en && (reg_sel == TDRAU_REG_CTL);
-
- /* update read data buffer */
- always @(posedge clk)
- begin
- rd_data_buf <= {{DATA_WIDTH-8{1'b0}},
- {3{1'b0}}, irq_enable, fifo_full, fifo_empty, amp_phase, channel_enable};
- end
-
- /* irq signal to interrupt controller */
- always @(posedge clk)
- begin
- if(reset)
- irq_buf <= 0;
- else
- if(fifo_empty && irq_enable)
- irq_buf <= 1;
- else
- irq_buf <= 0;
- end
-
- /* interrupt enable flag */
- always @(posedge clk)
- begin
- if(reset)
- irq_enable <= 0;
- else
- if(ctl_reg_write)
- irq_enable <= wr_data[4];
- else
- if(irq_buf)
- irq_enable <= 0; // disable interrupts after an interrupt
- end
-
- /* channel enable flag */
- always @(posedge clk)
- begin
- if(reset)
- channel_enable <= 0;
- else if (ctl_reg_write)
- channel_enable <= wr_data[0];
- end
-
- /* clock divider register */
- always @(posedge clk)
- begin
- if(reset)
- clock_div <= 0;
- else
- if (wr_en && (reg_sel == TDRAU_REG_CLK))
- clock_div <= wr_data;
- end
-
- /* divider counter */
- always @(posedge clk)
- begin
- if(channel_enable)
- begin
- if(div_count == 0) // reset counter if it reaches zero
- div_count <= clock_div;
- else
- div_count <= div_count - 1; // else just decrement it
- end
- else
- if (wr_en && (reg_sel == TDRAU_REG_CLK)) // when setting divider,
- div_count <= 1; // start cycle on next clock tick
- end
-
- /* amplitude out */
- always @(posedge clk)
- begin
- if (reset)
- begin
- amp_out <= AMP_BIAS;
- amp_phase <= 1;
- end
- else
- if (channel_enable)
- begin
- if (div_count == 0) // invert amplitude on clock tick
- begin
- amp_out <= fifo_rd_data;
- amp_phase <= ~amp_phase;
- end
- end
- else
- amp_out <= AMP_BIAS;
-
- // reset phase bit when enabling the channel
- if (ctl_reg_write && wr_data[0] && ~channel_enable)
- // when channel is being enabled, phase will be flipped on next tick
- // because div_count will become zero
- amp_phase <= 1;
- end
-endmodule
-
-module tdraudio #(DATA_WIDTH=32) (
- input wire clk,
- input wire reset,
- input wire [6:0] io_addr,
- output wire [DATA_WIDTH-1:0] rd_data,
- input wire [DATA_WIDTH-1:0] wr_data,
- input wire rd_en,
- input wire wr_en,
- output wire irq_out,
- output wire pdm_out,
- output wire gain_sel,
- output wire shutdown_n
- );
-
- localparam CLOCK_DIV_WIDTH = 22;
- localparam AMP_WIDTH = 16;
- localparam AMP_BIAS = 32768;
- localparam DAC_WIDTH = 18;
-
- /* avoid warning about unconnected port */
- (* keep="soft" *) wire [DATA_WIDTH-1:AMP_WIDTH] _unused = wr_data[DATA_WIDTH-1:AMP_WIDTH];
-
- wire [4:0] chan_sel = io_addr[6:2];
- wire [1:0] reg_sel = io_addr[1:0];
-
- wire [AMP_WIDTH-1:0] amp_wr_data = wr_data[AMP_WIDTH-1:0];
-
- wire [AMP_WIDTH-1:0] chan0_amp;
- wire [DATA_WIDTH-1:0] chan0_rd_data;
- wire chan0_running;
- wire chan0_irq;
- wire chan0_sel = chan_sel == 5'd0;
- wire chan0_rd_en = chan0_sel && rd_en;
- wire chan0_wr_en = chan0_sel && wr_en;
-
- wire [AMP_WIDTH-1:0] chan1_amp;
- wire [DATA_WIDTH-1:0] chan1_rd_data;
- wire chan1_running;
- wire chan1_irq;
- wire chan1_sel = chan_sel == 5'd1;
- wire chan1_rd_en = chan1_sel && rd_en;
- wire chan1_wr_en = chan1_sel && wr_en;
-
- wire [AMP_WIDTH-1:0] chan2_amp;
- wire [DATA_WIDTH-1:0] chan2_rd_data;
- wire chan2_running;
- wire chan2_irq;
- wire chan2_sel = chan_sel == 5'd2;
- wire chan2_rd_en = chan2_sel && rd_en;
- wire chan2_wr_en = chan2_sel && wr_en;
-
- wire [AMP_WIDTH-1:0] chan3_amp;
- wire [DATA_WIDTH-1:0] chan3_rd_data;
- wire chan3_running;
- wire chan3_irq;
- wire chan3_sel = chan_sel == 5'd3;
- wire chan3_rd_en = chan3_sel && rd_en;
- wire chan3_wr_en = chan3_sel && wr_en;
-
- wire running = chan0_running || chan1_running || chan2_running || chan3_running;
-
- assign rd_data = chan0_sel ? chan0_rd_data :
- chan1_sel ? chan1_rd_data :
- chan2_sel ? chan2_rd_data :
- chan3_sel ? chan3_rd_data :
- {DATA_WIDTH{1'b1}};
-
- wavegen chan0(clk, reset, reg_sel,
- chan0_rd_data, amp_wr_data,
- chan0_rd_en, chan0_wr_en,
- chan0_amp,
- chan0_running, chan0_irq);
-
- wavegen chan1(clk, reset, reg_sel,
- chan1_rd_data, amp_wr_data,
- chan1_rd_en, chan1_wr_en,
- chan1_amp,
- chan1_running, chan1_irq);
-
- wavegen chan2(clk, reset, reg_sel,
- chan2_rd_data, amp_wr_data,
- chan2_rd_en, chan2_wr_en,
- chan2_amp,
- chan2_running, chan2_irq);
-
- wavegen chan3(clk, reset, reg_sel,
- chan3_rd_data, amp_wr_data,
- chan3_rd_en, chan3_wr_en,
- chan3_amp,
- chan3_running, chan3_irq);
-
- reg [DAC_WIDTH:0] deltasigma_acc; // one extra bit
- wire [DAC_WIDTH:0] amp_sum = chan0_amp + chan1_amp + chan2_amp + chan3_amp; // also one overflow bit here
- assign gain_sel = 1; // gain select: 0 -> 12dB, 1 -> 6dB
-
- // assign shutdown_n = running;
- assign shutdown_n = 1; /* don't enable shutdown mode, it creates a mains hum */
-
- reg irq_out_buf;
- assign irq_out = irq_out_buf;
-
- always @(posedge clk) irq_out_buf <= chan0_irq || chan1_irq || chan2_irq || chan3_irq;
-
- /* delta-sigma DAC */
- always @(posedge clk)
- begin
- if(reset)
- deltasigma_acc <= 0;
- else
-// if (running)
- deltasigma_acc <= deltasigma_acc[DAC_WIDTH-1:0] + amp_sum;
-// else
-// deltasigma_acc <= deltasigma_acc[DAC_WIDTH-1:0] + (4*AMP_BIAS);
- end
-
- /* 1-bit audio output */
- assign pdm_out = deltasigma_acc[DAC_WIDTH];
-endmodule
diff --git a/tridoracpu/tridoracpu.srcs/top.v b/tridoracpu/tridoracpu.srcs/top.v
index bf3bea8..e79d611 100644
--- a/tridoracpu/tridoracpu.srcs/top.v
+++ b/tridoracpu/tridoracpu.srcs/top.v
@@ -3,18 +3,19 @@
// or as clk_1hz for debugging
`define clock cpuclk
-//`define clkfreq 83333333
-`define clkfreq 76923076
+`define clkfreq 83333333
//`define clock clk
//`define clkfreq 100000000
//`define clock clk_1hz
`define ENABLE_VGAFB
`define ENABLE_MICROSD
-`define ENABLE_TDRAUDIO
module top(
input wire clk,
input wire rst,
+ input wire btn0,
+ input wire sw0,
+ input wire sw1,
output wire led0,
output wire led1,
output wire led2,
@@ -58,13 +59,6 @@ module top(
output wire sd_sck,
input wire sd_cd
`endif
-
-`ifdef ENABLE_TDRAUDIO
- ,
- output wire amp2_ain,
- output wire amp2_gain,
- output wire amp2_shutdown_n
-`endif
);
reg clk_1hz;
@@ -73,11 +67,10 @@ module top(
localparam ADDR_WIDTH = 32, WIDTH = 32,
ROMADDR_WIDTH = 11, IOADDR_WIDTH = 11, IOADDR_SEL = 4;
- (* KEEP *) wire [ADDR_WIDTH-1:0] mem_addr;
+ wire [ADDR_WIDTH-1:0] mem_addr;
wire [WIDTH-1:0] mem_read_data;
wire [WIDTH-1:0] mem_write_data;
(* KEEP *) wire mem_wait;
- assign led0 = mem_wait;
(* KEEP *) wire mem_read_enable;
(* KEEP *) wire mem_write_enable;
@@ -87,6 +80,14 @@ module top(
wire irq;
+ // assign led0 = mem_wait;
+
+ wire [WIDTH-1:0] debug_data1, debug_data2,
+ debug_data3, debug_data4,
+ debug_data5, debug_data6;
+
+ assign led0 = debug_data6[0];
+
wire cpuclk, cpuclk_locked;
wire dram_refclk200;
wire pixclk;
@@ -96,11 +97,9 @@ module top(
wire [ADDR_WIDTH-1:0] dram_addr;
wire [WIDTH-1:0] dram_read_data, dram_write_data;
wire dram_read_enable, dram_write_enable, dram_wait;
- (* KEEP *) wire dram_read_ins;
dram_bridge dram_bridge0 (dram_addr,
- dram_read_data, dram_write_data, dram_read_enable, dram_write_enable,
- dram_read_ins, dram_wait,
+ dram_read_data, dram_write_data, dram_read_enable, dram_write_enable, dram_wait,
rst, cpuclk, dram_refclk200,
ddr3_dq, ddr3_dqs_n, ddr3_dqs_p, ddr3_addr,
ddr3_ba, ddr3_ras_n, ddr3_cas_n, ddr3_we_n,
@@ -137,7 +136,7 @@ module top(
assign fb_wr_data = mem_write_data;
vgafb vgafb0(`clock, pixclk, rst,
- mem_addr[5:2], fb_rd_data, fb_wr_data,
+ mem_addr[3:0], fb_rd_data, fb_wr_data,
fb_rd_en, fb_wr_en,
VGA_HS_O, VGA_VS_O, VGA_R, VGA_G, VGA_B);
`endif
@@ -225,44 +224,11 @@ module top(
assign uart_tx_data = mem_write_data[7:0];
assign uart_rd_data = { {WIDTH-10{1'b1}}, uart_rx_avail, uart_tx_busy, uart_rx_data };
- wire audio_irq;
-
- buart #(.CLKFREQ(`clkfreq)) uart0(`clock, rst,
- uart_baud,
- uart_txd_in, uart_rxd_out,
- uart_rx_clear, uart_tx_en,
- uart_rx_avail, uart_tx_busy,
- uart_tx_data, uart_rx_data);
-
- // audio controller
-`ifdef ENABLE_TDRAUDIO
- wire [WIDTH-1:0] tdraudio_wr_data;
- wire [WIDTH-1:0] tdraudio_rd_data;
- wire tdraudio_rd_en, tdraudio_wr_en;
- wire tdraudio_irq;
-
- wire tdraudio_cs_en = io_enable && (io_slot == 4);
- assign tdraudio_rd_en = tdraudio_cs_en && mem_read_enable;
- assign tdraudio_wr_en = tdraudio_cs_en && mem_write_enable;
- assign tdraudio_wr_data = mem_write_data;
-
- tdraudio tdraudio0(`clock, ~rst,
- mem_addr[8:2],
- tdraudio_rd_data,
- tdraudio_wr_data,
- tdraudio_rd_en,
- tdraudio_wr_en,
- tdraudio_irq,
- amp2_ain, amp2_gain, amp2_shutdown_n);
- assign audio_irq = tdraudio_irq;
-`endif
-
- // interrupt controller
reg timer_tick;
reg[23:0] tick_count;
- wire [2:0] irq_in = { audio_irq, timer_tick, uart_rx_avail };
- wire [2:0] irqc_rd_data0;
- wire [WIDTH-1:0] irqc_rd_data = { tick_count, 5'b0, irqc_rd_data0 };
+ wire [1:0] irq_in = { timer_tick, uart_rx_avail };
+ wire [1:0] irqc_rd_data0;
+ wire [WIDTH-1:0] irqc_rd_data = { tick_count, 6'b0, irqc_rd_data0 };
wire irqc_seten = mem_write_data[7];
wire irqc_cs = io_enable && (io_slot == 3);
@@ -274,23 +240,34 @@ module top(
(io_slot == 2) ? fb_rd_data :
`endif
(io_slot == 3) ? irqc_rd_data:
- `ifdef ENABLE_TDRAUDIO
- (io_slot == 4) ? tdraudio_rd_data:
- `endif
+
-1;
- irqctrl irqctrl0(`clock, irq_in, irqc_cs, mem_write_enable,
- irqc_seten, irqc_rd_data0,
- irq);
+
+ buart #(.CLKFREQ(`clkfreq)) uart0(`clock, rst,
+ uart_baud,
+ uart_txd_in, uart_rxd_out,
+ uart_rx_clear, uart_tx_en,
+ uart_rx_avail, uart_tx_busy,
+ uart_tx_data, uart_rx_data);
// CPU -----------------------------------------------------------------
stackcpu cpu0(.clk(`clock), .rst(rst), .irq(irq),
.addr(mem_addr),
.data_in(mem_read_data), .read_enable(mem_read_enable),
- .read_ins(dram_read_ins),
.data_out(mem_write_data), .write_enable(mem_write_enable),
.mem_wait(mem_wait),
- .debug1(led1), .debug2(led2), .debug3(led3));
+ .led1(led1), .led2(led2), .led3(led3),
+ .debug_out1(debug_data1),
+ .debug_out2(debug_data2),
+ .debug_out3(debug_data3),
+ .debug_out4(debug_data4),
+ .debug_out5(debug_data5),
+ .debug_out6(debug_data6));
+ // Interrupt Controller
+ irqctrl irqctrl0(`clock, irq_in, irqc_cs, mem_write_enable,
+ irqc_seten, irqc_rd_data0,
+ irq);
// count clock ticks
// generate interrupt every 20nth of a second
diff --git a/tridoracpu/tridoracpu.srcs/vgafb.v b/tridoracpu/tridoracpu.srcs/vgafb.v
index 49dad2d..4e8d668 100644
--- a/tridoracpu/tridoracpu.srcs/vgafb.v
+++ b/tridoracpu/tridoracpu.srcs/vgafb.v
@@ -1,19 +1,13 @@
`timescale 1ns / 1ps
`default_nettype none
-// enable shifter/masker registers
-`define ENABLE_FB_ACCEL
-
// Project F: Display Timings
// (C)2019 Will Green, Open Source Hardware released under the MIT License
// Learn more at https://projectf.io
//128K video memory is not enough for 640x480x4
-//`define RES_640_400
+`define RES_640_400
//`define RES_1024_768
-// RES_640_480 mode displays 400 lines with 640x480/60 video timings,
-// adding blank lines at the bottom
-`define RES_640_480
module display_timings #(
H_RES=640, // horizontal resolution (pixels)
@@ -68,11 +62,10 @@ module display_timings #(
// o_scanline: high for one tick at the start of each visible scanline
assign o_scanline = (o_sy >= VA_STA) && (o_sy <= VA_END) && (o_sx == H_STA);
- // set vblank at end of frame, clear at start
always @(posedge i_pix_clk)
begin
- if(o_sy == VA_END) o_vblank <= 1;
- else if (o_sy == -1) o_vblank <= 0;
+ if(o_frame) o_vblank <= 1;
+ else if (o_de) o_vblank <= 0;
end
always @ (posedge i_pix_clk)
@@ -129,19 +122,9 @@ module vgafb #(VMEM_ADDR_WIDTH = 15, VMEM_DATA_WIDTH = 32) (
localparam REG_PAL_SLOT = 3; localparam REG_PAL_DATA = 4;
localparam REG_CTL = 5;
-`ifdef ENABLE_FB_ACCEL
- localparam REG_SHIFTER = 6;
- localparam REG_SHIFTCOUNT = 7;
- localparam REG_SHIFTERM = 8;
- localparam REG_SHIFTERSP = 09;
- localparam REG_MASKGEN = 10;
-`endif
-
localparam COLOR_WIDTH = 12;
localparam PALETTE_WIDTH = 4;
- localparam signed PIC_LINES = 400; // visible picture lines
-
// Display Clocks
wire pix_clk = CLK; // pixel clock
wire clk_lock = 1; // clock locked?
@@ -156,32 +139,12 @@ module vgafb #(VMEM_ADDR_WIDTH = 15, VMEM_DATA_WIDTH = 32) (
wire pix_rd;
wire [VMEM_DATA_WIDTH-1:0] status;
-`ifdef ENABLE_FB_ACCEL
- reg [VMEM_DATA_WIDTH-1:0] acc_shifter_in;
- reg [(VMEM_DATA_WIDTH*2)-1:0] acc_shifter_out;
- reg [4:0] acc_shift_count;
- reg acc_start_shift;
- reg [VMEM_DATA_WIDTH-1:0] acc_mask_in;
- reg [VMEM_DATA_WIDTH-1:0] acc_mask_buf;
- reg [VMEM_DATA_WIDTH-1:0] acc_shiftmask_buf;
- wire [VMEM_DATA_WIDTH-1:0] acc_shifter_mask = acc_shiftmask_buf;
- wire [VMEM_DATA_WIDTH-1:0] acc_shifter_out_h = acc_shifter_out[(VMEM_DATA_WIDTH*2)-1:VMEM_DATA_WIDTH];
- wire [VMEM_DATA_WIDTH-1:0] acc_shifter_out_l = acc_shifter_out[VMEM_DATA_WIDTH-1:0];
-
- `endif
-
assign vmem_rd_en = rd_en;
assign vmem_wr_en = (reg_sel == REG_VMEM) && wr_en;
assign rd_data = (reg_sel == REG_VMEM) ? vmem_rd_data :
(reg_sel == REG_RD_ADDR) ? cpu_rd_addr :
(reg_sel == REG_WR_ADDR) ? cpu_wr_addr :
(reg_sel == REG_CTL) ? status :
-`ifdef ENABLE_FB_ACCEL
- (reg_sel == REG_SHIFTER) ? acc_shifter_out_h:
- (reg_sel == REG_SHIFTERM) ? acc_shiftmask_buf :
- (reg_sel == REG_SHIFTERSP) ? acc_shifter_out_l :
- (reg_sel == REG_MASKGEN) ? acc_mask_buf :
- `endif
32'hFFFFFFFF;
wire [VMEM_ADDR_WIDTH-1:0] cpu_addr = vmem_wr_en ? cpu_wr_addr : cpu_rd_addr;
@@ -212,7 +175,6 @@ module vgafb #(VMEM_ADDR_WIDTH = 15, VMEM_DATA_WIDTH = 32) (
wire scanline; // scanline start
wire vblank; // vertical blank
reg vblank_buf; // vertical blank in cpu clock domain
- reg vblank_xfer; // vertical blank clock domain crossing
display_timings #( // 640x480 800x600 1280x720 1920x1080
`ifdef RES_1024_768
@@ -238,18 +200,6 @@ module vgafb #(VMEM_ADDR_WIDTH = 15, VMEM_DATA_WIDTH = 32) (
.V_BP(35),
.H_POL(0),
.V_POL(1)
- `endif
- `ifdef RES_640_480
- .H_RES(640), // 640 800 1280 1920
- .V_RES(480), // 480 600 720 1080
- .H_FP(16), // 16 40 110 88
- .H_SYNC(96), // 96 128 40 44
- .H_BP(48), // 48 88 220 148
- .V_FP(10), // 10 1 5 4
- .V_SYNC(2), // 2 4 5 5
- .V_BP(33), // 33 23 20 36
- .H_POL(0), // 0 1 1 1
- .V_POL(0) // 0 1 1 1
`endif
)
display_timings_inst (
@@ -265,8 +215,6 @@ module vgafb #(VMEM_ADDR_WIDTH = 15, VMEM_DATA_WIDTH = 32) (
.o_sy(sy)
);
- wire pic_enable = (sy >= 0) && (sy < PIC_LINES); // when to display pixels from VRAM
-
wire [7:0] red;
wire [7:0] green;
wire [7:0] blue;
@@ -285,7 +233,7 @@ module vgafb #(VMEM_ADDR_WIDTH = 15, VMEM_DATA_WIDTH = 32) (
always @(posedge pix_clk) frame_d <= frame;
- always @(posedge cpu_clk) { vblank_buf, vblank_xfer } <= { vblank_xfer, vblank };
+ always @(posedge cpu_clk) vblank_buf <= vblank;
always @(posedge cpu_clk)
begin
@@ -302,74 +250,6 @@ module vgafb #(VMEM_ADDR_WIDTH = 15, VMEM_DATA_WIDTH = 32) (
if(rd_en && reg_sel == REG_VMEM) cpu_rd_addr <= cpu_rd_addr + 1; // auto-increment read addr on read
end
-`ifdef ENABLE_FB_ACCEL
- //
- // shifter/masker registers
- //
- always @(posedge cpu_clk)
- begin
- if(wr_en && reg_sel == REG_SHIFTER)
- acc_shifter_in <= wr_data;
- end
-
- always @(posedge cpu_clk)
- begin
- if(wr_en && reg_sel == REG_SHIFTCOUNT)
- begin
- acc_shift_count <= { wr_data[2:0], 2'b0};
- acc_start_shift <= 1;
- end
-
- if(acc_start_shift)
- acc_start_shift <= 0;
- end
-
- always @(posedge cpu_clk)
- begin
- if (acc_start_shift)
- acc_shifter_out <= {acc_shifter_in, {VMEM_DATA_WIDTH{1'b0}}} >> acc_shift_count;
- end
-
- // mask register
- always @(posedge cpu_clk)
- begin
- if (wr_en && reg_sel == REG_MASKGEN)
- acc_mask_in <= wr_data;
- end
-
- // mask output is buffered to avoid timing problems
- always @(posedge cpu_clk)
- begin
- acc_mask_buf <= {
- {4{|{acc_mask_in[31:28]}}},
- {4{|{acc_mask_in[27:24]}}},
- {4{|{acc_mask_in[23:20]}}},
- {4{|{acc_mask_in[19:16]}}},
- {4{|{acc_mask_in[15:12]}}},
- {4{|{acc_mask_in[11:8]}}},
- {4{|{acc_mask_in[7:4]}}},
- {4{|{acc_mask_in[3:0]}}}
- };
- end
-
- always @(posedge cpu_clk)
- begin
- acc_shiftmask_buf = {
- {4{|{acc_shifter_out_h[31:28]}}},
- {4{|{acc_shifter_out_h[27:24]}}},
- {4{|{acc_shifter_out_h[23:20]}}},
- {4{|{acc_shifter_out_h[19:16]}}},
- {4{|{acc_shifter_out_h[15:12]}}},
- {4{|{acc_shifter_out_h[11:8]}}},
- {4{|{acc_shifter_out_h[7:4]}}},
- {4{|{acc_shifter_out_h[3:0]}}}
- };
- end
-`endif
-
- //
- // shifting pixels at pixel clock
- //
always @(posedge pix_clk)
begin
if(scanline || shift_count == MAX_SHIFT_COUNT) // before start of a line
@@ -406,7 +286,7 @@ module vgafb #(VMEM_ADDR_WIDTH = 15, VMEM_DATA_WIDTH = 32) (
// 12 bit RGB palette
assign VGA_HS = h_sync;
assign VGA_VS = v_sync;
- assign VGA_R = (pic_enable && de) ? color_data[11:8] : 4'b0;
- assign VGA_G = (pic_enable && de) ? color_data[7:4] : 4'b0;
- assign VGA_B = (pic_enable && de) ? color_data[3:0] : 4'b0;
+ assign VGA_R = de ? color_data[11:8] : 4'b0;
+ assign VGA_G = de ? color_data[7:4] : 4'b0;
+ assign VGA_B = de ? color_data[3:0] : 4'b0;
endmodule
diff --git a/tridoracpu/tridoracpu.xpr b/tridoracpu/tridoracpu.xpr
index 5d8ff88..5e4a64f 100644
--- a/tridoracpu/tridoracpu.xpr
+++ b/tridoracpu/tridoracpu.xpr
@@ -1,10 +1,9 @@
-
-
-
-
+
+
+
-
+
@@ -13,48 +12,29 @@
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
+
-
-
@@ -67,13 +47,13 @@
-
-
-
+
+
+
-
-
-
+
+
+
@@ -85,11 +65,9 @@
-
-
-
-
+
+
@@ -111,7 +89,7 @@
-
+
@@ -142,7 +120,7 @@
-
+
@@ -173,14 +151,14 @@
-
+
-
+
@@ -205,19 +183,12 @@
-
-
-
-
-
-
-
-
+
@@ -230,7 +201,7 @@
-
+
@@ -253,19 +224,28 @@
-
-
-
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -292,12 +272,9 @@
-
-
-
-
+
@@ -318,24 +295,9 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -355,34 +317,56 @@
-
-
+
+
-
- Vivado Synthesis Defaults
-
+
-
+
-
+
-
+
-
+
-
+
-
- Default settings for Implementation.
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -393,30 +377,14 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
+
+
diff --git a/tridoraemu/ADDS-Envoy-620.pict b/tridoraemu/ADDS-Envoy-620.pict
deleted file mode 100644
index 7394d5d..0000000
Binary files a/tridoraemu/ADDS-Envoy-620.pict and /dev/null differ
diff --git a/tridoraemu/README.md b/tridoraemu/README.md
index 7f290f3..d263a95 100644
--- a/tridoraemu/README.md
+++ b/tridoraemu/README.md
@@ -5,7 +5,7 @@
- written in Golang
## Getting started
-Download this zipfile: [tridoraemu.zip](https://git.insignificance.de/api/packages/slederer/generic/tridoraemu/0.0.5/tridoraemu.zip)
+Download this zipfile: [tridoraemu.zip](https://git.insignificance.de/api/packages/slederer/generic/tridoraemu/0.0.1/tridoraemu.zip)
It contains the sources, the ROM image, an SD-card image and a precompiled windows binary.
@@ -40,7 +40,7 @@ On the ROM monitor prompt, press *B* to boot from the SD-card image. This should
In the shell, try the *L* command to list directories and the *V* command to change volumes. The *Examples* volume contains some example programs in source form.
-The programs *lines*, *conway* and *mandelbrot*, among others, show some (hopefully) interesting VGA graphics. The *pictviewer* program can show image files (*.pict files) which contain 640x400x4 bitmaps. A few sample image files are provided.
+The programs *lines*, *conway* and *mandelbrot*, among others, show some (hopefully) interesting VGA graphics. The *viewpict* program can show image files (*.pict files) which contain 640x400x4 bitmaps. A few sample image files are provided.
To compile a program, set the file name (e.g. *lines.pas*) with the *W* command in the shell. Then, use *B* and *R* to build and run the program.
@@ -50,9 +50,6 @@ The volume *Testvolume 1* (note the space) contains a precompiled game called *c
You can run the program with the *O* command in the shell (just press Return for the program arguments), or you can set the workfile name with *W* and then use the *R* command.
-The volume *Rogue* contains a compiled version of ECL-Rogue, a Pascal variant of the
-classic Rogue game.
-
The *K* command in the shell is used to reclaim the space occupied by deleted or overwritten files.
A running program can be terminated by pressing Control-C, but only if the program is expecting keyboard input at that time.
diff --git a/tridoraemu/cpu.go b/tridoraemu/cpu.go
index 9d6b08d..c0c7739 100644
--- a/tridoraemu/cpu.go
+++ b/tridoraemu/cpu.go
@@ -125,7 +125,7 @@ func (c *CPU) step() error {
Y := c.estack[c.ESP]
- insWord, err := c.mem.readIns(c.PC)
+ insWord, err := c.mem.read(c.PC)
if err != nil { return err }
if c.PC % 4 == 0 {
insWord = insWord >> 16
diff --git a/tridoraemu/framebuffer.go b/tridoraemu/framebuffer.go
index 189100a..4586287 100644
--- a/tridoraemu/framebuffer.go
+++ b/tridoraemu/framebuffer.go
@@ -32,7 +32,6 @@ type Framebuffer struct {
paletteSlot word
vmem [VmemWords]word
readCount int
- paletteChanged bool
}
func (f *Framebuffer) initialize() {
@@ -105,26 +104,6 @@ func (f *Framebuffer) readPalette() word {
return word(0)
}
-func (f *Framebuffer) startFrame() {
- // when the palette changes, we
- // need to redraw every pixel
- // to get the new colors
- if f.paletteChanged {
- oldRAddr := f.readAddr
- oldWAddr := f.writeAddr
- f.readAddr = 0
- f.writeAddr = 0
-
- for i := 0; i < VmemWords; i++ {
- f.writeVmem(f.readVmem())
- }
-
- f.readAddr = oldRAddr
- f.writeAddr = oldWAddr
- f.paletteChanged = false
- }
-}
-
func (f *Framebuffer) writePalette(value word) {
// 4 bits per color channel
r := uint8((value & 0b111100000000) >> 8)
@@ -137,7 +116,6 @@ func (f *Framebuffer) writePalette(value word) {
b = b << 4
f.palette[f.paletteSlot] = color.RGBA{r,g,b,0}
- f.paletteChanged = true
}
func (f *Framebuffer) readCtl() word {
diff --git a/tridoraemu/mem.go b/tridoraemu/mem.go
index 624c7bd..4765c8b 100644
--- a/tridoraemu/mem.go
+++ b/tridoraemu/mem.go
@@ -17,12 +17,6 @@ const IOSlotSize = 128
const IOSlotCount = 16
-const DRAMStart = 65536
-
-const CacheAddrShift = 8
-
-const CacheWriteThrough = true
-
type Mem struct {
ram [] word
iohandler [IOSlotCount] IOHandler
@@ -85,7 +79,7 @@ func (m *Mem) attachIO(h IOHandler, slot int) {
m.iohandler[slot] = h
}
-func (m *Mem) readRaw(byteaddr word) (word, error) {
+func (m *Mem) read(byteaddr word) (word, error) {
if byteaddr >= IOStartAddr && byteaddr < RAMStartAddr {
ioslot := (byteaddr - IOStartAddr) / IOSlotSize
if m.iohandler[ioslot] != nil {
@@ -102,14 +96,6 @@ func (m *Mem) readRaw(byteaddr word) (word, error) {
}
}
-func (m *Mem) read(byteaddr word) (word, error) {
- return m.readRaw(byteaddr);
-}
-
-func (m *Mem) readIns(byteaddr word) (word, error) {
- return m.readRaw(byteaddr);
-}
-
func (m *Mem) write(value word, byteaddr word) error {
if byteaddr < IOStartAddr {
return fmt.Errorf("Write to ROM area at %08X value %08X", byteaddr, value)
diff --git a/tridoraemu/tridoraemu.go b/tridoraemu/tridoraemu.go
index c148515..875c3c0 100644
--- a/tridoraemu/tridoraemu.go
+++ b/tridoraemu/tridoraemu.go
@@ -8,8 +8,7 @@ import (
"flag"
"time"
"github.com/hajimehoshi/ebiten/v2"
- "github.com/hajimehoshi/ebiten/v2/ebitenutil"
- "github.com/hajimehoshi/ebiten/v2/inpututil"
+ // "github.com/hajimehoshi/ebiten/v2/ebitenutil"
// "image/color"
)
@@ -36,7 +35,6 @@ func idle(canGoIdle bool) {
}
type Game struct{
- debug bool
x,y int
stepsPerFrame int
lastFrameDuration time.Duration
@@ -45,7 +43,6 @@ type Game struct{
func (g *Game) Update() error {
startTime := time.Now()
- framebuffer.startFrame()
for i := 0; i < g.stepsPerFrame; i++ {
err := cpu.step()
if err != nil {
@@ -60,23 +57,16 @@ func (g *Game) Update() error {
}
g.lastFrameDuration = time.Since(startTime)
- if inpututil.IsKeyJustReleased(ebiten.KeyF12) {
- g.debug = !g.debug
- }
-
return nil
}
func (g *Game) Draw(screen *ebiten.Image) {
screen.DrawImage(framebuffer.framebuffer, nil)
- if g.debug {
- buf := fmt.Sprintf("PC: %08X FP: %08X RP: %08X ESP: %2X %v",
- cpu.PC, cpu.FP, cpu.RP, cpu.ESP, g.lastFrameDuration)
- ebitenutil.DebugPrint(screen, buf)
- }
-
/*
+ buf := fmt.Sprintf("PC: %08X FP: %08X RP: %08X ESP: %2X\n%v", cpu.PC, cpu.FP, cpu.RP, cpu.ESP, g.lastFrameDuration)
+ ebitenutil.DebugPrint(screen, buf)
+
screen.Set(g.x, g.y, color.RGBA{255,0,0,0})
screen.Set(g.x, g.y+1, color.RGBA{0,255,0,0})
screen.Set(g.x, g.y+2, color.RGBA{0,255,255,0})
diff --git a/utils/png2pict.py b/utils/png2pict.py
deleted file mode 100644
index c261850..0000000
--- a/utils/png2pict.py
+++ /dev/null
@@ -1,118 +0,0 @@
-#!/usr/bin/python3
-import sys
-import png
-
-sprite_width = 32
-sprite_height = 32
-
-def process_pixdata(outfile, pixdata, frameindex = 0, pix_w=640, pix_h=400):
-
- pixmask = 15
- y = pix_h * frameindex
- max_y = y + pix_h - 1
-
- while y <= max_y:
- x = 0
- max_x = pix_w - 1
- pixline = pixdata[y]
- while x <= max_x:
- px1 = pixline[x+0] & pixmask
- px2 = pixline[x+1] & pixmask
- px3 = pixline[x+2] & pixmask
- px4 = pixline[x+3] & pixmask
- px5 = pixline[x+4] & pixmask
- px6 = pixline[x+5] & pixmask
- px7 = pixline[x+6] & pixmask
- px8 = pixline[x+7] & pixmask
- vmem_word = (px1 << 28) | (px2 << 24) | (px3 << 20) | (px4 << 16) | \
- (px5 << 12) | (px6 << 8) | (px7 << 4) | px8
-
- outfile.write(vmem_word.to_bytes(4, 'big'))
- x += 8
- y += 1
-
-def write_palette_word(outfile, r, g, b):
- r4 = r >> 4
- g4 = g >> 4
- b4 = b >> 4
- c12 = r4 << 8 | g4 << 4 | b4
-
- outfile.write(c12.to_bytes(4, 'big'))
-
-
-def process_palette(outfile, palette):
- if len(palette[0]) == 4:
- for r,g,b,a in palette:
- write_palette_word(outfile, r, g, b)
- else:
- for r,g,b in palette:
- write_palette_word(outfile, r, g, b)
-
-
-def write_header(outfile):
- magic = b'PIct'
- mode = 1
- outfile.write(magic);
- outfile.write(mode.to_bytes(4, 'big'))
-
-
-def write_sprite_header(outfile):
- magic = b'SPRT'
- mode = 1
- outfile.write(magic);
- outfile.write(mode.to_bytes(4, 'big'))
-
-
-def write_pict_file(width, height, px, metadata, outfile):
- print("processing as PICT file...")
- if width != 640:
- print("width must be 640, aborting")
- sys.exit(1)
- pixdata = list(px)
- palette = metadata['palette']
-
- if len(palette) != 16:
- print("palette must have 16 colors, aborting")
- sys.exit(0)
-
- with open(outfile,'wb') as f:
- write_header(f)
- process_palette(f, palette)
- process_pixdata(f, pixdata)
-
-
-def write_sprite_file(width, height, px, metadata, outfile):
- print("processing as SPRT file with {} sprites...".format(height//sprite_height))
- if width != sprite_width:
- print("width must be {}, aborting".format(sprite_width))
- sys.exit(1)
- pixdata = list(px)
- palette = metadata['palette']
-
- if len(palette) != 16:
- print("palette must have 16 colors instead of {}, aborting".format(len(palette)))
- sys.exit(0)
-
- with open(outfile,'wb') as f:
- write_sprite_header(f)
- process_pixdata(f, pixdata, pix_w=sprite_width, pix_h=height)
-
-
-if __name__ == '__main__':
- if len(sys.argv) != 3:
- print("Usage: {} ".format(sys.argv[0]))
- sys.exit(1)
-
- infile = sys.argv[1]
- outfile = sys.argv[2]
-
- r = png.Reader(infile)
- p = r.read()
- width, height, px, metadata = p
- if width == 640:
- write_pict_file(width, height, px, metadata, outfile)
- elif width == sprite_width:
- write_sprite_file(width, height, px, metadata, outfile)
- else:
- print("Can't handle this file, need a width of\n640 or {} pixels with 16 color palette.".format(sprite_width))
-
diff --git a/utils/serload.py b/utils/serload.py
deleted file mode 100644
index 0ee6962..0000000
--- a/utils/serload.py
+++ /dev/null
@@ -1,398 +0,0 @@
-#!/usr/bin/python3
-# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
-#
-# Copyright 2021 Sebastian Lederer
-#
-# 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.
-
-import sys
-import os
-import serial
-import time
-import random
-import platform
-import argparse
-
-blocksize = 32
-BEL = 7
-ACK = 6
-NAK = 21
-ENQ = 5
-SOH = 1
-STX = 2
-EOT = 4
-wordmask = 0xFFFFFFFF
-pattern = 0xAFFECAFE
-
-
-def get_default_device():
- if platform.system() == 'Windows':
- return 'COM4:'
- else:
- return '/dev/ttyUSB1'
-
-
-def checksum(databytes):
- i = 0
- cksum = 0
- while i < len(databytes):
- word = databytes[i] << 24 | \
- databytes[i+1] << 16 | \
- databytes[i+2] << 8 | \
- databytes[i+3]
- # print("word:{0:08x}".format(word))
- i += 4
-
- cksum = (((cksum + word) ^ pattern) << 1) & wordmask
-
- return cksum
-
-
-def sendchar(char, ser):
- ser.write(char.to_bytes(1, 'big'))
-
-
-def sendcommand(ser, cmd=b'L', verbose=False):
- verbose = True
- ser.write(cmd)
- resp = ser.read_until()
- if verbose:
- print(cmd,"sent, response:", str(resp))
- return resp
-
-
-# send command and wait for echo
-def commandwait(ser, cmd):
- resp = sendcommand(ser, cmd, verbose=False)
- if len(resp) == 0:
- print("timeout sending '{}' command".format(cmd))
- return None
-
- if resp.startswith(b"> "):
- resp = resp[2:]
-
- if resp != bytearray(cmd + b"\r\n"):
- print("invalid response to '{}' command".format(cmd))
- return None
-
- return resp
-
-
-def send_size_header(ser, filesize):
- ser.write(b'\x05') # ENQ
- resp = ser.read(1)
- if resp != b'\x15': # NAK
- # print("ENQ response:",str(resp))
- ser.write(b'\x01') # SOH
-
- databytes = filesize.to_bytes(4, 'big')
- chksum = ~filesize & 0xFFFFFFFF
-
- #print(str(databytes), len(databytes), type(filesize), filesize)
- #print(str(chksum.to_bytes(4,'big')), len(databytes))
-
- ser.write(databytes)
- ser.write(chksum.to_bytes(4,'big'))
-
- resp = ser.read(1)
- if len(resp) == 0:
- print("timeout waiting for ACK on size header")
- return False
- char = resp[0]
- # print("response to size header:", str(resp), repr(char))
- return char == ACK # ACK
- else:
- print("Not using size header.")
- return True
-
-
-def serload_bin(datafile, ser):
- resp = sendcommand(ser)
- if len(resp) == 0:
- print("timeout sending 'L' command")
- return
-
- sentblocks = 0
- resend = 0
-
- data = []
-
- if datafile.endswith('.mem'):
- with open(datafile) as f:
- for l in f.readlines():
- b3 = l[0:8]
- b2 = l[8:16]
- b1 = l[16:24]
- b0 = l[24:32]
- data.extend([ int(b,2) for b in [b3,b2,b1,b0]])
- else:
- with open(datafile, 'rb') as f:
- data = f.read()
-
- filesize = len(data)
-
- if filesize % blocksize > 0:
- l = len(data)
- pad = blocksize - (l % blocksize)
-
- print("padding {} bytes with {} to {}".format(l, pad, l+pad))
-
- data += bytearray(pad)
-
- print("{} total blocks".format((len(data) + blocksize - 1) // blocksize))
-
- if not send_size_header(ser, filesize):
- print("Error sending size header.")
- return
-
- while len(data) > 0:
- block = data[0:32]
- databytes = bytearray(block)
-
- sendchar(STX, ser)
- #print("block:",databytes)
- chksum = checksum(databytes)
- #print("checksum: {0:08x}".format(chksum))
- #if random.randrange(2) == 0:
- # databytes[random.randrange(len(databytes))] = 0
- ser.write(databytes)
- #print(chksum.to_bytes(4, 'big'))
- ser.write(chksum.to_bytes(4,'big'))
-
- resp = ser.read(1)
- if len(resp) == 0:
- print("timeout waiting for ACK")
- break
- char = resp[0]
-
- if char == ACK:
- #print("ACK received")
- sentblocks += 1
- data = data[32:] # ack received, send next block
- elif char == NAK: # nak received, send same block
- # print("NAK received")
- resend += 1
- pass
- else:
- print("garbage received: ",char)
- print(ser.read(80))
- break # anything else, give up
-
- print("{} blocks sent, {} retries".format(sentblocks, resend), end='\r')
-
- sendchar(EOT, ser)
- print()
-
-
-def word_from_bytes(b):
- w = b[0] << 24 | b[1] << 16 | b[2] << 8 | b[3]
- return w
-
-
-def read_word(ser):
- b = ser.read(4)
- if len(b) != 4:
- return None
- return word_from_bytes(b)
-
-
-def serdownload(fname, ser):
- resp = sendcommand(ser, b'D')
- if len(resp) == 0:
- print("timeout sending 'D' command")
- return
-
- sendchar(BEL, ser);
-
- resp = ser.read(1)
- if len(resp) == 0:
- print("Timeout receiving size header.")
- return
- if resp[0] != SOH:
- print("Error receiving size header.", resp[0])
- return
-
- size = read_word(ser)
- cksize = read_word(ser)
- if (~cksize & 0xFFFFFFFF) != size:
- print("Invalid size header received.")
- return
-
- sendchar(ACK, ser)
-
- print("File size: {} bytes".format(size))
-
- count = size
- with open(fname, "wb") as f:
- while count > 0:
- startbyte = ser.read(1)
- if len(startbyte) == 0:
- print("Timeout receiving STX.")
- return
- if startbyte[0] != STX:
- print("Error receiving STX.", resp[0])
- return
-
- block = ser.read(32)
- if len(block) != 32:
- print("Error receiving block")
- return
-
- cksum = read_word(ser)
- if cksum is None:
- print("Error receiving block checksum")
- return
-
- mysum = checksum(block)
- if cksum != mysum:
- print("Checksum error, retry block")
- sendchar(NAK, ser)
- continue
-
- print(".", end="", flush=True)
- count -= 32
- f.write(block)
- sendchar(ACK, ser)
-
- resp = ser.read(1)
- if len(resp) == 0:
- print("Timeout receiving EOT.")
- if resp[0] != EOT:
- print("Error receiving EOT.", resp[0])
-
- print("\nEnd of transmission, {} bytes received.".format(size))
- f.truncate(size)
- f.close()
-
-
-def mput(filenames, ser):
- for f in filenames:
- resp = set_filename(f, ser)
- if resp is None:
- return
- serload_bin(f, ser)
-
- resp = ser.read_until()
-
- time.sleep(2)
-
-
-def set_filename(f, ser):
- f_encoded = f.encode('utf8')
- print("Setting filename", f)
- resp = commandwait(ser, b'S')
- if resp is None:
- return None
- resp = sendcommand(ser, f_encoded + b'\r')
- if not f_encoded in resp:
- print("unrecognized response to filename, aborting")
- return None
- return resp
-
-
-def getnamedfile(filename, ser):
- resp = set_filename(filename, ser)
- if resp is None:
- return None
- serdownload(filename, ser)
-
-
-def putnamedfile(filename, ser):
- resp = set_filename(filename, ser)
- if resp is None:
- return None
- serload_bin(filename, ser)
- print("Remote status:")
- showdata(ser)
-
-
-def showdata(ser):
-
- promptseen = False
-
- while not promptseen:
- c = ser.read(1)
- if c == b'>':
- promptseen = True
- else:
- print(c.decode('utf8'), end='')
- rest = ser.read(1) # read trailing space of prompt
-
-
-def localdir():
- result = os.walk(".")
- for dirpath, dirnames, filenames in os.walk("."):
- for f in filenames:
- print(f)
- break
-
-
-def interactive(ser):
- done = False
- while not done:
- args = input("> ").strip().split()
- if len(args) > 0:
- cmd = args[0]
- args.pop(0)
- if cmd == 'dir':
- if commandwait(ser, b'Y') is None:
- return
- showdata(ser)
- elif cmd == 'get':
- if len(args) > 1:
- print("exactly one argument required (filename)")
- else:
- getnamedfile(args[0], ser)
- elif cmd == 'put':
- if len(args) > 1:
- print("exactly one argument required (filename)")
- else:
- putnamedfile(args[0], ser)
- elif cmd == 'ldir':
- if len(args) > 0:
- print("superfluous argument")
- else:
- localdir()
- elif cmd == 'exit' or cmd == 'x':
- done = True
- else:
- print("Unknown command. Valid commands are: dir get ldir put exit")
-
-
-if __name__ == "__main__":
- argparser = argparse.ArgumentParser(
- description='transfer files from/to the Tridora-CPU')
- argparser.add_argument('-d', '--device', help='serial device', default=get_default_device())
- argparser.add_argument('command', choices=['get', 'put', 'mput', 'interactive'])
- argparser.add_argument('filename', nargs='*')
- args = argparser.parse_args()
-
- cmd = args.command
- serial_port = args.device
- filenames = args.filename
-
- ser = serial.Serial(serial_port,115200, timeout=3)
-
- if cmd == 'get':
- serdownload(filenames[0], ser)
- elif cmd == 'put':
- serload_bin(filenames[0], ser)
- elif cmd == 'mput':
- mput(filenames, ser)
- elif cmd == 'interactive':
- interactive(ser)
- else:
- print("should not get here")
-
- #if cmd is not None:
- # ser.close()
diff --git a/utils/tdrimg.py b/utils/tdrimg.py
index 4eeaead..38308ff 100644
--- a/utils/tdrimg.py
+++ b/utils/tdrimg.py
@@ -1,6 +1,6 @@
#!/usr/bin/python3
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
-# Copyright 2021-2025 Sebastian Lederer. See the file LICENSE.md for details
+# Copyright 2021-2024 Sebastian Lederer. See the file LICENSE.md for details
import struct
import sys
@@ -239,7 +239,7 @@ def listvolumes(img):
return firstvolume
-def listdir(img, part, verbose=False, deleted=False):
+def listdir(img, part, verbose=False):
print("Directory of {}:".format(part.name))
slotno = 0
done = False
@@ -247,8 +247,6 @@ def listdir(img, part, verbose=False, deleted=False):
slot = getdirslot(img, part, slotno)
if (slot.flags & SlotFirst):
print(slot.name, slot.sizeBytes, slotno)
- elif deleted and (slot.flags & SlotDeleted):
- print(slot.name, slot.sizeBytes, slotno, slot.generation)
else:
if verbose:
print(flags2str(slot.flags))
@@ -274,21 +272,6 @@ def findfile(img, part, name):
return None
-def finddeleted(img, part, name, gen):
- slotno = 0
- done = False
- while not done:
- slot = getdirslot(img, part, slotno)
- if slot.flags & SlotDeleted:
- if slot.name == name and slot.generation == gen:
- return slotno
- slotno += 1
- if (slot.flags & SlotEndScan) or (slotno >= part.dirSize):
- done = True
-
- return None
-
-
def readfile(img, part, slotno):
pos = part.startBlock * 512 + slotno * part.extentSize
dirslot = getdirslot(img, part, slotno)
@@ -334,24 +317,6 @@ def readfromimg(img, pathname,outfilepath):
f.write(data)
-def recoverfromimg(img, pathname, gen, outfilepath):
- vol, filename = parsepath(img, pathname)
- if vol is None:
- return
-
- listdir(img, vol, deleted=True)
-
- slotno = finddeleted(img, vol, filename, gen)
- if slotno is None:
- print("File", filename,"not found with generation no", gen)
- return
-
- data = readfile(img, vol, slotno)
-
- with open(outfilepath, "wb") as f:
- f.write(data)
-
-
def writetoimg(img, pathname, infilepath):
vol, filename = parsepath(img, pathname)
if vol is None:
@@ -372,32 +337,8 @@ def writetoimg(img, pathname, infilepath):
putfile(infilepath, filename, img, vol, vol.startBlock, slotno)
-def initfs(f, partno):
- part = getpartslot(f, partno)
- partstart = part.startBlock
- dir_slots = part.dirSize
- extent_size = part.extentSize
- slots_per_extent = extent_size // 64
- reserved_slots = dir_slots // slots_per_extent
-
- print()
- print("Partition {} at {}".format(part.name, part.startBlock))
-
- print("creating",reserved_slots, "reserved directory slots")
- for a in range(0,reserved_slots):
- d = createdirslot("DIR", SlotReserved, 0, 0, 0, 0, 0)
- putdirslot(f, partstart, a, d)
-
- print("creating", dir_slots - reserved_slots, "free slots")
-
- for a in range(reserved_slots, dir_slots):
- d = createdirslot("", SlotFree, 0, 0, 0, 0, 0)
- putdirslot(f, partstart, a, d)
-
- return (part, partstart, reserved_slots)
-
-
-def create_image_with_stuff(imgfile):
+def create_image_with_stuff():
+ imgfile = "sdcard.img"
bootimage = "../lib/coreloader.prog"
dir_slots = 256
extent_size = 8192
@@ -406,27 +347,22 @@ def create_image_with_stuff(imgfile):
f = open(imgfile,"w+b")
- b = createpart("PHYS", PartPhysical, 0, 16384, 4096, 0, 0)
+ b = createpart("PHYS", PartPhysical, 0, 12288, 4096, 0, 0)
#print(b)
f.write(b)
with open(bootimage, "rb") as bf:
bootdata = bf.read()
bootBlocks = len(bootdata) // 512 + 1
-
b = createpart("BOOT", PartBoot, 16, 112, 0, 0, bootBlocks)
f.write(b)
-
b = createpart("Testvolume 1", PartEnabled, 128, 3968, 8192, 248)
f.write(b)
b = createpart("SYSTEM", PartEnabled, 4096, 4096, 8192, 256)
f.write(b)
- b = createpart("Examples", PartEnabled, 8192, 4096, 8192, 256)
- f.write(b)
-
- b = createpart("Rogue", PartEnabled + PartLast, 12288, 4096, 8192, 256)
+ b = createpart("Examples", PartEnabled + PartLast, 8192, 4096, 8192, 256)
f.write(b)
part = getpartslot(f, 2)
@@ -535,11 +471,6 @@ def create_image_with_stuff(imgfile):
slotnr = putfile("../progs/editor.pas", None , f, part, partstart, slotnr)
slotnr = putfile("../progs/editor.prog", None , f, part, partstart, slotnr)
slotnr = putfile("../progs/xfer.prog", None , f, part, partstart, slotnr)
- slotnr = putfile("../progs/recover.prog", None , f, part, partstart, slotnr)
- slotnr = putfile("../progs/changemem.prog", None , f, part, partstart, slotnr)
-
- slotnr = putfile("../lib/pcmaudio.s", None , f, part, partstart, slotnr)
- slotnr = putfile("../lib/pcmaudio.inc", None , f, part, partstart, slotnr)
listdir(f, part)
@@ -575,10 +506,10 @@ def create_image_with_stuff(imgfile):
# slotnr = putfile("../tests/timetest.prog", None , f, part, partstart, slotnr)
slotnr = putfile("../tests/readtest.pas", None , f, part, partstart, slotnr)
- #slotnr = putfile("../tests/readtest.prog", None , f, part, partstart, slotnr)
+ slotnr = putfile("../tests/readtest.prog", None , f, part, partstart, slotnr)
slotnr = putfile("../tests/readchartest.pas", None , f, part, partstart, slotnr)
- #slotnr = putfile("../tests/readchartest.prog", None , f, part, partstart, slotnr)
+ slotnr = putfile("../tests/readchartest.prog", None , f, part, partstart, slotnr)
# slotnr = putfile("cchangetest.pas", None , f, part, partstart, slotnr)
# slotnr = putfile("cchangetest.prog", None , f, part, partstart, slotnr)
@@ -588,13 +519,16 @@ def create_image_with_stuff(imgfile):
slotnr = putfile("../tests/test133.pas", None , f, part, partstart, slotnr)
# slotnr = putfile("../tests/test133.prog", None , f, part, partstart, slotnr)
- # slotnr = putfile("../tests/test159.pas", None , f, part, partstart, slotnr)
+ slotnr = putfile("../tests/test159.pas", None , f, part, partstart, slotnr)
# slotnr = putfile("../tests/test159.prog", None , f, part, partstart, slotnr)
slotnr = putfile("../tests/umlaut.pas", None , f, part, partstart, slotnr)
slotnr = putfile("../examples/rtpair.pas", None , f, part, partstart, slotnr)
+ slotnr = putfile("../examples/5cubes.pas", None , f, part, partstart, slotnr)
+ # slotnr = putfile("../examples/5cubes.prog", None , f, part, partstart, slotnr)
+
slotnr = putfile("../examples/3dcube.pas", None , f, part, partstart, slotnr)
slotnr = putfile("../examples/conway.pas", None , f, part, partstart, slotnr)
@@ -603,30 +537,11 @@ def create_image_with_stuff(imgfile):
slotnr = putfile("../examples/lines.pas", None , f, part, partstart, slotnr)
- slotnr = putfile("../examples/pcmtest2.pas", None , f, part, partstart, slotnr)
-
- slotnr = putfile("../examples/pictviewer.pas", None , f, part, partstart, slotnr)
- slotnr = putfile("../examples/Toco_Toucan.pict", None , f, part, partstart, slotnr)
- slotnr = putfile("../examples/shinkansen.pict", None , f, part, partstart, slotnr)
- slotnr = putfile("../examples/snow_leopard.pict", None , f, part, partstart, slotnr)
- slotnr = putfile("../examples/ADDS-Envoy-620.pict", None , f, part, partstart, slotnr)
-
- slotnr = putfile("../examples/benchmarks.pas", None , f, part, partstart, slotnr)
-
- slotnr = putfile("../examples/animate.pas", None , f, part, partstart, slotnr)
- slotnr = putfile("../examples/graphbench.pas", None , f, part, partstart, slotnr)
- slotnr = putfile("../examples/sprites.inc", None , f, part, partstart, slotnr)
- slotnr = putfile("../examples/sprites.s", None , f, part, partstart, slotnr)
- slotnr = putfile("../examples/background.pict", None , f, part, partstart, slotnr)
- slotnr = putfile("../examples/walking.sprt", None , f, part, partstart, slotnr)
- slotnr = putfile("../examples/rocket.sprt", None , f, part, partstart, slotnr)
-
- listdir(f, part)
-
- part, partstart, slotnr = initfs(f, 5)
- slotnr = putfile("../rogue/rogue.init", None, f, part, partstart, slotnr)
- slotnr = putfile("../rogue/rogue.message", None, f, part, partstart, slotnr)
- slotnr = putfile("../rogue/rogue.prog", None, f, part, partstart, slotnr)
+ slotnr = putfile("../examples/viewpict.pas", None , f, part, partstart, slotnr)
+ # slotnr = putfile("viewpict.prog", None , f, part, partstart, slotnr)
+ slotnr = putfile("../examples/ara.pict", "ara.pict" , f, part, partstart, slotnr)
+ slotnr = putfile("../examples/shinkansen.pict", "shinkansen.pict" , f, part, partstart, slotnr)
+ slotnr = putfile("../examples/snow_leopard.pict", "snow_leopard.pict" , f, part, partstart, slotnr)
listdir(f, part)
@@ -640,14 +555,11 @@ if __name__ == "__main__":
if sys.argv[1] == "get":
f = open(sys.argv[2], "rb")
readfromimg(f, sys.argv[3], sys.argv[4])
- elif sys.argv[1] == "recover":
- f = open(sys.argv[2], "rb")
- recoverfromimg(f, sys.argv[3], int(sys.argv[4]), sys.argv[5])
elif sys.argv[1] == "put":
imgfile = open(sys.argv[2], "r+b")
infilepath = sys.argv[3]
destfilename = sys.argv[4]
writetoimg(imgfile, destfilename, infilepath)
elif sys.argv[1] == "createimg":
- create_image_with_stuff(sys.argv[2])
+ create_image_with_stuff()
sys.exit(0)
diff --git a/utils/wav2tdrau.py b/utils/wav2tdrau.py
deleted file mode 100644
index 16230d6..0000000
--- a/utils/wav2tdrau.py
+++ /dev/null
@@ -1,29 +0,0 @@
-import sys
-import random, struct
-import wave
-
-freq = 16000
-BIAS = 32768
-def convert(srcpath, destpath):
- outdata = bytearray()
- with wave.open(srcpath, mode="rb") as f:
- params = f.getparams()
- print(params.nchannels, params.sampwidth, params.framerate)
-
- frames = f.readframes(2*1024*1024)
- for i in range(0, len(frames), 2):
- v = int.from_bytes(frames[i:i+2], "little", signed=True)
- v += BIAS
- hi = (v & 0xFF00) >> 8
- lo = (v & 0x00FF)
- outdata.append(hi)
- outdata.append(lo)
-
- with open(destpath, mode="wb") as f:
- f.write(outdata)
-
-
-if __name__ == "__main__":
- sourcefilename = sys.argv[1]
- destfilename = sys.argv[2]
- convert(sourcefilename, destfilename)