Merge pull request #110 from daveshah1/up5k_ip

UltraPlus Hard IP and icetime Support
This commit is contained in:
Clifford Wolf 2017-11-28 15:54:58 +01:00 committed by GitHub
commit 14b44ca866
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 5004 additions and 14 deletions

View File

@ -1,19 +1,36 @@
<!DOCTYPE html>
<html><head><meta charset="UTF-8">
<style>
.multitab {
margin-left: auto;
margin-right: auto;
border: 0px;
}
.multitab td {
padding-left: 10px;
padding-right: 10px;
vertical-align: top;
}
.ctab {
margin-left: auto;
margin-right: auto;
border: 1px solid gray;
}
.ctab td, .ctab th {
.cstab {
border: 1px solid gray;
}
.ctab td, .ctab th, .cstab th, .cstab td {
padding: 3px;
border: 1px solid gray;
}
.ctab td {
.ctab td, .cstab td {
font-family:monospace;
}
</style>
<title>Project IceStorm &ndash; UltraPlus Features Documentation</title>
</head><body>
@ -264,4 +281,145 @@ can be used as an open-drain IO using the standard IO cell.</p>
<tr><td>100k&Omega;<br/>(default)</td><td>!cf_bit_35<br/>!B6[15]</td><td>!cf_bit_39<br/>!B12[15]</td></tr>
</table>
<h2>Hard IP</h2>
<p>The UltraPlus devices contain three types of Hard IP: I<sup>2</sup>C (<span style="font-family:monospace">SB_I2C</span>), SPI (<span style="font-family:monospace">SB_SPI</span>), and LED PWM generation
(<span style="font-family:monospace">SB_LEDDA_IP</span>). The connections and configurations for each of these blocks are documented below. Names in italics are parameters rather than actual bits,
where multiple bits are used to enable an IP they are labeled as <span style="font-family:monospace"><em>_ENABLE_0</em></span>, <span style="font-family:monospace"><em>_ENABLE_1</em></span>, etc. </p>
<table class="multitab"><tr><td>
<table class="cstab">
<tr><th>Signal</th><th>I2C<br/>(0, 31, 0)</th><th>I2C<br/>(25, 31, 0)</th></tr>
<tr><td>SBACKO</td><td>(0, 30, slf_op_6)</td><td>(25, 30, slf_op_6)</td></tr>
<tr><td>SBADRI0</td><td>(0, 30, lutff_1/in_0)</td><td>(25, 30, lutff_1/in_0)</td></tr>
<tr><td>SBADRI1</td><td>(0, 30, lutff_2/in_0)</td><td>(25, 30, lutff_2/in_0)</td></tr>
<tr><td>SBADRI2</td><td>(0, 30, lutff_3/in_0)</td><td>(25, 30, lutff_3/in_0)</td></tr>
<tr><td>SBADRI3</td><td>(0, 30, lutff_4/in_0)</td><td>(25, 30, lutff_4/in_0)</td></tr>
<tr><td>SBADRI4</td><td>(0, 30, lutff_5/in_0)</td><td>(25, 30, lutff_5/in_0)</td></tr>
<tr><td>SBADRI5</td><td>(0, 30, lutff_6/in_0)</td><td>(25, 30, lutff_6/in_0)</td></tr>
<tr><td>SBADRI6</td><td>(0, 30, lutff_7/in_0)</td><td>(25, 30, lutff_7/in_0)</td></tr>
<tr><td>SBADRI7</td><td>(0, 29, lutff_2/in_0)</td><td>(25, 29, lutff_2/in_0)</td></tr>
<tr><td>SBCLKI</td><td>(0, 30, clk)</td><td>(25, 30, clk)</td></tr>
<tr><td>SBDATI0</td><td>(0, 29, lutff_5/in_0)</td><td>(25, 29, lutff_5/in_0)</td></tr>
<tr><td>SBDATI1</td><td>(0, 29, lutff_6/in_0)</td><td>(25, 29, lutff_6/in_0)</td></tr>
<tr><td>SBDATI2</td><td>(0, 29, lutff_7/in_0)</td><td>(25, 29, lutff_7/in_0)</td></tr>
<tr><td>SBDATI3</td><td>(0, 30, lutff_0/in_3)</td><td>(25, 30, lutff_0/in_3)</td></tr>
<tr><td>SBDATI4</td><td>(0, 30, lutff_5/in_1)</td><td>(25, 30, lutff_5/in_1)</td></tr>
<tr><td>SBDATI5</td><td>(0, 30, lutff_6/in_1)</td><td>(25, 30, lutff_6/in_1)</td></tr>
<tr><td>SBDATI6</td><td>(0, 30, lutff_7/in_1)</td><td>(25, 30, lutff_7/in_1)</td></tr>
<tr><td>SBDATI7</td><td>(0, 30, lutff_0/in_0)</td><td>(25, 30, lutff_0/in_0)</td></tr>
<tr><td>SBDATO0</td><td>(0, 29, slf_op_6)</td><td>(25, 29, slf_op_6)</td></tr>
<tr><td>SBDATO1</td><td>(0, 29, slf_op_7)</td><td>(25, 29, slf_op_7)</td></tr>
<tr><td>SBDATO2</td><td>(0, 30, slf_op_0)</td><td>(25, 30, slf_op_0)</td></tr>
<tr><td>SBDATO3</td><td>(0, 30, slf_op_1)</td><td>(25, 30, slf_op_1)</td></tr>
<tr><td>SBDATO4</td><td>(0, 30, slf_op_2)</td><td>(25, 30, slf_op_2)</td></tr>
<tr><td>SBDATO5</td><td>(0, 30, slf_op_3)</td><td>(25, 30, slf_op_3)</td></tr>
<tr><td>SBDATO6</td><td>(0, 30, slf_op_4)</td><td>(25, 30, slf_op_4)</td></tr>
<tr><td>SBDATO7</td><td>(0, 30, slf_op_5)</td><td>(25, 30, slf_op_5)</td></tr>
<tr><td>SBRWI</td><td>(0, 29, lutff_4/in_0)</td><td>(25, 29, lutff_4/in_0)</td></tr>
<tr><td>SBSTBI</td><td>(0, 29, lutff_3/in_0)</td><td>(25, 29, lutff_3/in_0)</td></tr>
<tr><td>I2CIRQ</td><td>(0, 30, slf_op_7)</td><td>(25, 30, slf_op_7)</td></tr>
<tr><td>I2CWKUP</td><td>(0, 29, slf_op_5)</td><td>(25, 29, slf_op_5)</td></tr>
<tr><td>SCLI</td><td>(0, 29, lutff_2/in_1)</td><td>(25, 29, lutff_2/in_1)</td></tr>
<tr><td>SCLO</td><td>(0, 29, slf_op_3)</td><td>(25, 29, slf_op_3)</td></tr>
<tr><td>SCLOE</td><td>(0, 29, slf_op_4)</td><td>(25, 29, slf_op_4)</td></tr>
<tr><td>SDAI</td><td>(0, 29, lutff_1/in_1)</td><td>(25, 29, lutff_1/in_1)</td></tr>
<tr><td>SDAO</td><td>(0, 29, slf_op_1)</td><td>(25, 29, slf_op_1)</td></tr>
<tr><td>SDAOE</td><td>(0, 29, slf_op_2)</td><td>(25, 29, slf_op_2)</td></tr>
<tr><td><em>I2C_ENABLE_0</em></td><td><em>(13, 31, cbit2usealt_in_0)</em></td><td><em>(19, 31, cbit2usealt_in_0)</em></td></tr>
<tr><td><em>I2C_ENABLE_1</em></td><td><em>(12, 31, cbit2usealt_in_1)</em></td><td><em>(19, 31, cbit2usealt_in_1)</em></td></tr>
<tr><td><em>SDA_INPUT_DELAYED</em></td><td><em>(12, 31, SDA_input_delay)</em></td><td><em>(19, 31, SDA_input_delay)</em></td></tr>
<tr><td><em>SDA_OUTPUT_DELAYED</em></td><td><em>(12, 31, SDA_output_delay)</em></td><td><em>(19, 31, SDA_output_delay)</em></td></tr>
</table>
</td><td>
<table class="cstab">
<tr><th>Signal</th><th>SPI<br/>(0, 0, 0)</th><th>SPI<br/>(25, 0, 1)</th></tr>
<tr><td>SBACKO</td><td>(0, 20, slf_op_1)</td><td>(25, 20, slf_op_1)</td></tr>
<tr><td>SBADRI0</td><td>(0, 19, lutff_1/in_1)</td><td>(25, 19, lutff_1/in_1)</td></tr>
<tr><td>SBADRI1</td><td>(0, 19, lutff_2/in_1)</td><td>(25, 19, lutff_2/in_1)</td></tr>
<tr><td>SBADRI2</td><td>(0, 20, lutff_0/in_3)</td><td>(25, 20, lutff_0/in_3)</td></tr>
<tr><td>SBADRI3</td><td>(0, 20, lutff_1/in_3)</td><td>(25, 20, lutff_1/in_3)</td></tr>
<tr><td>SBADRI4</td><td>(0, 20, lutff_2/in_3)</td><td>(25, 20, lutff_2/in_3)</td></tr>
<tr><td>SBADRI5</td><td>(0, 20, lutff_3/in_3)</td><td>(25, 20, lutff_3/in_3)</td></tr>
<tr><td>SBADRI6</td><td>(0, 20, lutff_4/in_3)</td><td>(25, 20, lutff_4/in_3)</td></tr>
<tr><td>SBADRI7</td><td>(0, 20, lutff_5/in_3)</td><td>(25, 20, lutff_5/in_3)</td></tr>
<tr><td>SBCLKI</td><td>(0, 20, clk)</td><td>(25, 20, clk)</td></tr>
<tr><td>SBDATI0</td><td>(0, 19, lutff_1/in_3)</td><td>(25, 19, lutff_1/in_3)</td></tr>
<tr><td>SBDATI1</td><td>(0, 19, lutff_2/in_3)</td><td>(25, 19, lutff_2/in_3)</td></tr>
<tr><td>SBDATI2</td><td>(0, 19, lutff_3/in_3)</td><td>(25, 19, lutff_3/in_3)</td></tr>
<tr><td>SBDATI3</td><td>(0, 19, lutff_4/in_3)</td><td>(25, 19, lutff_4/in_3)</td></tr>
<tr><td>SBDATI4</td><td>(0, 19, lutff_5/in_3)</td><td>(25, 19, lutff_5/in_3)</td></tr>
<tr><td>SBDATI5</td><td>(0, 19, lutff_6/in_3)</td><td>(25, 19, lutff_6/in_3)</td></tr>
<tr><td>SBDATI6</td><td>(0, 19, lutff_7/in_3)</td><td>(25, 19, lutff_7/in_3)</td></tr>
<tr><td>SBDATI7</td><td>(0, 19, lutff_0/in_1)</td><td>(25, 19, lutff_0/in_1)</td></tr>
<tr><td>SBDATO0</td><td>(0, 19, slf_op_1)</td><td>(25, 19, slf_op_1)</td></tr>
<tr><td>SBDATO1</td><td>(0, 19, slf_op_2)</td><td>(25, 19, slf_op_2)</td></tr>
<tr><td>SBDATO2</td><td>(0, 19, slf_op_3)</td><td>(25, 19, slf_op_3)</td></tr>
<tr><td>SBDATO3</td><td>(0, 19, slf_op_4)</td><td>(25, 19, slf_op_4)</td></tr>
<tr><td>SBDATO4</td><td>(0, 19, slf_op_5)</td><td>(25, 19, slf_op_5)</td></tr>
<tr><td>SBDATO5</td><td>(0, 19, slf_op_6)</td><td>(25, 19, slf_op_6)</td></tr>
<tr><td>SBDATO6</td><td>(0, 19, slf_op_7)</td><td>(25, 19, slf_op_7)</td></tr>
<tr><td>SBDATO7</td><td>(0, 20, slf_op_0)</td><td>(25, 20, slf_op_0)</td></tr>
<tr><td>SBRWI</td><td>(0, 19, lutff_0/in_3)</td><td>(25, 19, lutff_0/in_3)</td></tr>
<tr><td>SBSTBI</td><td>(0, 20, lutff_6/in_3)</td><td>(25, 20, lutff_6/in_3)</td></tr>
<tr><td>MCSNO0</td><td>(0, 21, slf_op_2)</td><td>(25, 21, slf_op_2)</td></tr>
<tr><td>MCSNO1</td><td>(0, 21, slf_op_4)</td><td>(25, 21, slf_op_4)</td></tr>
<tr><td>MCSNO2</td><td>(0, 21, slf_op_7)</td><td>(25, 21, slf_op_7)</td></tr>
<tr><td>MCSNO3</td><td>(0, 22, slf_op_1)</td><td>(25, 22, slf_op_1)</td></tr>
<tr><td>MCSNOE0</td><td>(0, 21, slf_op_3)</td><td>(25, 21, slf_op_3)</td></tr>
<tr><td>MCSNOE1</td><td>(0, 21, slf_op_5)</td><td>(25, 21, slf_op_5)</td></tr>
<tr><td>MCSNOE2</td><td>(0, 22, slf_op_0)</td><td>(25, 22, slf_op_0)</td></tr>
<tr><td>MCSNOE3</td><td>(0, 22, slf_op_2)</td><td>(25, 22, slf_op_2)</td></tr>
<tr><td>MI</td><td>(0, 22, lutff_0/in_1)</td><td>(25, 22, lutff_0/in_1)</td></tr>
<tr><td>MO</td><td>(0, 20, slf_op_6)</td><td>(25, 20, slf_op_6)</td></tr>
<tr><td>MOE</td><td>(0, 20, slf_op_7)</td><td>(25, 20, slf_op_7)</td></tr>
<tr><td>SCKI</td><td>(0, 22, lutff_1/in_1)</td><td>(25, 22, lutff_1/in_1)</td></tr>
<tr><td>SCKO</td><td>(0, 21, slf_op_0)</td><td>(25, 21, slf_op_0)</td></tr>
<tr><td>SCKOE</td><td>(0, 21, slf_op_1)</td><td>(25, 21, slf_op_1)</td></tr>
<tr><td>SCSNI</td><td>(0, 22, lutff_2/in_1)</td><td>(25, 22, lutff_2/in_1)</td></tr>
<tr><td>SI</td><td>(0, 22, lutff_7/in_3)</td><td>(25, 22, lutff_7/in_3)</td></tr>
<tr><td>SO</td><td>(0, 20, slf_op_4)</td><td>(25, 20, slf_op_4)</td></tr>
<tr><td>SOE</td><td>(0, 20, slf_op_5)</td><td>(25, 20, slf_op_5)</td></tr>
<tr><td>SPIIRQ</td><td>(0, 20, slf_op_2)</td><td>(25, 20, slf_op_2)</td></tr>
<tr><td>SPIWKUP</td><td>(0, 20, slf_op_3)</td><td>(25, 20, slf_op_3)</td></tr>
</table>
</td><td>
<table class="cstab">
<tr><th>Signal</th><th>LEDDA_IP<br/>(0, 31, 2)</th></tr>
<tr><td>LEDDADDR0</td><td>(0, 28, lutff_4/in_0)</td></tr>
<tr><td>LEDDADDR1</td><td>(0, 28, lutff_5/in_0)</td></tr>
<tr><td>LEDDADDR2</td><td>(0, 28, lutff_6/in_0)</td></tr>
<tr><td>LEDDADDR3</td><td>(0, 28, lutff_7/in_0)</td></tr>
<tr><td>LEDDCLK</td><td>(0, 29, clk)</td></tr>
<tr><td>LEDDCS</td><td>(0, 28, lutff_2/in_0)</td></tr>
<tr><td>LEDDDAT0</td><td>(0, 28, lutff_2/in_1)</td></tr>
<tr><td>LEDDDAT1</td><td>(0, 28, lutff_3/in_1)</td></tr>
<tr><td>LEDDDAT2</td><td>(0, 28, lutff_4/in_1)</td></tr>
<tr><td>LEDDDAT3</td><td>(0, 28, lutff_5/in_1)</td></tr>
<tr><td>LEDDDAT4</td><td>(0, 28, lutff_6/in_1)</td></tr>
<tr><td>LEDDDAT5</td><td>(0, 28, lutff_7/in_1)</td></tr>
<tr><td>LEDDDAT6</td><td>(0, 28, lutff_0/in_0)</td></tr>
<tr><td>LEDDDAT7</td><td>(0, 28, lutff_1/in_0)</td></tr>
<tr><td>LEDDDEN</td><td>(0, 28, lutff_1/in_1)</td></tr>
<tr><td>LEDDEXE</td><td>(0, 28, lutff_0/in_1)</td></tr>
<tr><td>LEDDON</td><td>(0, 29, slf_op_0)</td></tr>
<tr><td>PWMOUT0</td><td>(0, 28, slf_op_4)</td></tr>
<tr><td>PWMOUT1</td><td>(0, 28, slf_op_5)</td></tr>
<tr><td>PWMOUT2</td><td>(0, 28, slf_op_6)</td></tr>
</table>
</td></tr></table>
</p>
<p>The I<sup>2</sup>C "glitch filter" (referred to as <span style="font-family:monospace">SB_FILTER_50NS</span>) is a seperate module from the I<sup>2</sup>C interface IP, with connections as shown below:
<table class="ctab">
<tr><th>Signal</th><th>SB_FILTER_50NS<br/>(25, 31, 2)</th><th>SB_FILTER_50NS<br/>(25, 31, 3)</th></tr>
<tr><td>FILTERIN</td><td>(25, 27, lutff_1/in_0)</td><td>(25, 27, lutff_0/in_0)</td></tr>
<tr><td>FILTEROUT</td><td>(25, 27, slf_op_2)</td><td>(25, 27, slf_op_1)</td></tr>
<tr><td>ENABLE_0</td><td>(25, 30, CBIT_2)</td><td>(25, 30, CBIT_5)</td></tr>
<tr><td>ENABLE_1</td><td>(25, 30, CBIT_3)</td><td>(25, 30, CBIT_6)</td></tr>
<tr><td>ENABLE_2</td><td>(25, 30, CBIT_4)</td><td>(25, 30, CBIT_7)</td></tr>
</table>
</body></html>

View File

@ -4728,7 +4728,214 @@ extra_cells_db = {
"RGB2_CURRENT_5": (0, 30, "CBIT_7"),
"CURRENT_MODE": (0, 28, "CBIT_4"),
}
},
("I2C", (0, 31, 0)): {
"I2CIRQ": (0, 30, "slf_op_7"),
"I2CWKUP": (0, 29, "slf_op_5"),
"I2C_ENABLE_0": (13, 31, "cbit2usealt_in_0"),
"I2C_ENABLE_1": (12, 31, "cbit2usealt_in_1"),
"SBACKO": (0, 30, "slf_op_6"),
"SBADRI0": (0, 30, "lutff_1/in_0"),
"SBADRI1": (0, 30, "lutff_2/in_0"),
"SBADRI2": (0, 30, "lutff_3/in_0"),
"SBADRI3": (0, 30, "lutff_4/in_0"),
"SBADRI4": (0, 30, "lutff_5/in_0"),
"SBADRI5": (0, 30, "lutff_6/in_0"),
"SBADRI6": (0, 30, "lutff_7/in_0"),
"SBADRI7": (0, 29, "lutff_2/in_0"),
"SBCLKI": (0, 30, "clk"),
"SBDATI0": (0, 29, "lutff_5/in_0"),
"SBDATI1": (0, 29, "lutff_6/in_0"),
"SBDATI2": (0, 29, "lutff_7/in_0"),
"SBDATI3": (0, 30, "lutff_0/in_3"),
"SBDATI4": (0, 30, "lutff_5/in_1"),
"SBDATI5": (0, 30, "lutff_6/in_1"),
"SBDATI6": (0, 30, "lutff_7/in_1"),
"SBDATI7": (0, 30, "lutff_0/in_0"),
"SBDATO0": (0, 29, "slf_op_6"),
"SBDATO1": (0, 29, "slf_op_7"),
"SBDATO2": (0, 30, "slf_op_0"),
"SBDATO3": (0, 30, "slf_op_1"),
"SBDATO4": (0, 30, "slf_op_2"),
"SBDATO5": (0, 30, "slf_op_3"),
"SBDATO6": (0, 30, "slf_op_4"),
"SBDATO7": (0, 30, "slf_op_5"),
"SBRWI": (0, 29, "lutff_4/in_0"),
"SBSTBI": (0, 29, "lutff_3/in_0"),
"SCLI": (0, 29, "lutff_2/in_1"),
"SCLO": (0, 29, "slf_op_3"),
"SCLOE": (0, 29, "slf_op_4"),
"SDAI": (0, 29, "lutff_1/in_1"),
"SDAO": (0, 29, "slf_op_1"),
"SDAOE": (0, 29, "slf_op_2"),
"SDA_INPUT_DELAYED": (12, 31, "SDA_input_delay"),
"SDA_OUTPUT_DELAYED": (12, 31, "SDA_output_delay"),
},
("I2C", (25, 31, 0)): {
"I2CIRQ": (25, 30, "slf_op_7"),
"I2CWKUP": (25, 29, "slf_op_5"),
"I2C_ENABLE_0": (19, 31, "cbit2usealt_in_0"),
"I2C_ENABLE_1": (19, 31, "cbit2usealt_in_1"),
"SBACKO": (25, 30, "slf_op_6"),
"SBADRI0": (25, 30, "lutff_1/in_0"),
"SBADRI1": (25, 30, "lutff_2/in_0"),
"SBADRI2": (25, 30, "lutff_3/in_0"),
"SBADRI3": (25, 30, "lutff_4/in_0"),
"SBADRI4": (25, 30, "lutff_5/in_0"),
"SBADRI5": (25, 30, "lutff_6/in_0"),
"SBADRI6": (25, 30, "lutff_7/in_0"),
"SBADRI7": (25, 29, "lutff_2/in_0"),
"SBCLKI": (25, 30, "clk"),
"SBDATI0": (25, 29, "lutff_5/in_0"),
"SBDATI1": (25, 29, "lutff_6/in_0"),
"SBDATI2": (25, 29, "lutff_7/in_0"),
"SBDATI3": (25, 30, "lutff_0/in_3"),
"SBDATI4": (25, 30, "lutff_5/in_1"),
"SBDATI5": (25, 30, "lutff_6/in_1"),
"SBDATI6": (25, 30, "lutff_7/in_1"),
"SBDATI7": (25, 30, "lutff_0/in_0"),
"SBDATO0": (25, 29, "slf_op_6"),
"SBDATO1": (25, 29, "slf_op_7"),
"SBDATO2": (25, 30, "slf_op_0"),
"SBDATO3": (25, 30, "slf_op_1"),
"SBDATO4": (25, 30, "slf_op_2"),
"SBDATO5": (25, 30, "slf_op_3"),
"SBDATO6": (25, 30, "slf_op_4"),
"SBDATO7": (25, 30, "slf_op_5"),
"SBRWI": (25, 29, "lutff_4/in_0"),
"SBSTBI": (25, 29, "lutff_3/in_0"),
"SCLI": (25, 29, "lutff_2/in_1"),
"SCLO": (25, 29, "slf_op_3"),
"SCLOE": (25, 29, "slf_op_4"),
"SDAI": (25, 29, "lutff_1/in_1"),
"SDAO": (25, 29, "slf_op_1"),
"SDAOE": (25, 29, "slf_op_2"),
"SDA_INPUT_DELAYED": (19, 31, "SDA_input_delay"),
"SDA_OUTPUT_DELAYED": (19, 31, "SDA_output_delay"),
},
("SPI", (0, 0, 0)): {
"MCSNO0": (0, 21, "slf_op_2"),
"MCSNO1": (0, 21, "slf_op_4"),
"MCSNO2": (0, 21, "slf_op_7"),
"MCSNO3": (0, 22, "slf_op_1"),
"MCSNOE0": (0, 21, "slf_op_3"),
"MCSNOE1": (0, 21, "slf_op_5"),
"MCSNOE2": (0, 22, "slf_op_0"),
"MCSNOE3": (0, 22, "slf_op_2"),
"MI": (0, 22, "lutff_0/in_1"),
"MO": (0, 20, "slf_op_6"),
"MOE": (0, 20, "slf_op_7"),
"SBACKO": (0, 20, "slf_op_1"),
"SBADRI0": (0, 19, "lutff_1/in_1"),
"SBADRI1": (0, 19, "lutff_2/in_1"),
"SBADRI2": (0, 20, "lutff_0/in_3"),
"SBADRI3": (0, 20, "lutff_1/in_3"),
"SBADRI4": (0, 20, "lutff_2/in_3"),
"SBADRI5": (0, 20, "lutff_3/in_3"),
"SBADRI6": (0, 20, "lutff_4/in_3"),
"SBADRI7": (0, 20, "lutff_5/in_3"),
"SBCLKI": (0, 20, "clk"),
"SBDATI0": (0, 19, "lutff_1/in_3"),
"SBDATI1": (0, 19, "lutff_2/in_3"),
"SBDATI2": (0, 19, "lutff_3/in_3"),
"SBDATI3": (0, 19, "lutff_4/in_3"),
"SBDATI4": (0, 19, "lutff_5/in_3"),
"SBDATI5": (0, 19, "lutff_6/in_3"),
"SBDATI6": (0, 19, "lutff_7/in_3"),
"SBDATI7": (0, 19, "lutff_0/in_1"),
"SBDATO0": (0, 19, "slf_op_1"),
"SBDATO1": (0, 19, "slf_op_2"),
"SBDATO2": (0, 19, "slf_op_3"),
"SBDATO3": (0, 19, "slf_op_4"),
"SBDATO4": (0, 19, "slf_op_5"),
"SBDATO5": (0, 19, "slf_op_6"),
"SBDATO6": (0, 19, "slf_op_7"),
"SBDATO7": (0, 20, "slf_op_0"),
"SBRWI": (0, 19, "lutff_0/in_3"),
"SBSTBI": (0, 20, "lutff_6/in_3"),
"SCKI": (0, 22, "lutff_1/in_1"),
"SCKO": (0, 21, "slf_op_0"),
"SCKOE": (0, 21, "slf_op_1"),
"SCSNI": (0, 22, "lutff_2/in_1"),
"SI": (0, 22, "lutff_7/in_3"),
"SO": (0, 20, "slf_op_4"),
"SOE": (0, 20, "slf_op_5"),
"SPIIRQ": (0, 20, "slf_op_2"),
"SPIWKUP": (0, 20, "slf_op_3"),
},
("SPI", (25, 0, 1)): {
"MCSNO0": (25, 21, "slf_op_2"),
"MCSNO1": (25, 21, "slf_op_4"),
"MCSNO2": (25, 21, "slf_op_7"),
"MCSNO3": (25, 22, "slf_op_1"),
"MCSNOE0": (25, 21, "slf_op_3"),
"MCSNOE1": (25, 21, "slf_op_5"),
"MCSNOE2": (25, 22, "slf_op_0"),
"MCSNOE3": (25, 22, "slf_op_2"),
"MI": (25, 22, "lutff_0/in_1"),
"MO": (25, 20, "slf_op_6"),
"MOE": (25, 20, "slf_op_7"),
"SBACKO": (25, 20, "slf_op_1"),
"SBADRI0": (25, 19, "lutff_1/in_1"),
"SBADRI1": (25, 19, "lutff_2/in_1"),
"SBADRI2": (25, 20, "lutff_0/in_3"),
"SBADRI3": (25, 20, "lutff_1/in_3"),
"SBADRI4": (25, 20, "lutff_2/in_3"),
"SBADRI5": (25, 20, "lutff_3/in_3"),
"SBADRI6": (25, 20, "lutff_4/in_3"),
"SBADRI7": (25, 20, "lutff_5/in_3"),
"SBCLKI": (25, 20, "clk"),
"SBDATI0": (25, 19, "lutff_1/in_3"),
"SBDATI1": (25, 19, "lutff_2/in_3"),
"SBDATI2": (25, 19, "lutff_3/in_3"),
"SBDATI3": (25, 19, "lutff_4/in_3"),
"SBDATI4": (25, 19, "lutff_5/in_3"),
"SBDATI5": (25, 19, "lutff_6/in_3"),
"SBDATI6": (25, 19, "lutff_7/in_3"),
"SBDATI7": (25, 19, "lutff_0/in_1"),
"SBDATO0": (25, 19, "slf_op_1"),
"SBDATO1": (25, 19, "slf_op_2"),
"SBDATO2": (25, 19, "slf_op_3"),
"SBDATO3": (25, 19, "slf_op_4"),
"SBDATO4": (25, 19, "slf_op_5"),
"SBDATO5": (25, 19, "slf_op_6"),
"SBDATO6": (25, 19, "slf_op_7"),
"SBDATO7": (25, 20, "slf_op_0"),
"SBRWI": (25, 19, "lutff_0/in_3"),
"SBSTBI": (25, 20, "lutff_6/in_3"),
"SCKI": (25, 22, "lutff_1/in_1"),
"SCKO": (25, 21, "slf_op_0"),
"SCKOE": (25, 21, "slf_op_1"),
"SCSNI": (25, 22, "lutff_2/in_1"),
"SI": (25, 22, "lutff_7/in_3"),
"SO": (25, 20, "slf_op_4"),
"SOE": (25, 20, "slf_op_5"),
"SPIIRQ": (25, 20, "slf_op_2"),
"SPIWKUP": (25, 20, "slf_op_3"),
},
("LEDDA_IP", (0, 31, 2)): {
"LEDDADDR0": (0, 28, "lutff_4/in_0"),
"LEDDADDR1": (0, 28, "lutff_5/in_0"),
"LEDDADDR2": (0, 28, "lutff_6/in_0"),
"LEDDADDR3": (0, 28, "lutff_7/in_0"),
"LEDDCLK": (0, 29, "clk"),
"LEDDCS": (0, 28, "lutff_2/in_0"),
"LEDDDAT0": (0, 28, "lutff_2/in_1"),
"LEDDDAT1": (0, 28, "lutff_3/in_1"),
"LEDDDAT2": (0, 28, "lutff_4/in_1"),
"LEDDDAT3": (0, 28, "lutff_5/in_1"),
"LEDDDAT4": (0, 28, "lutff_6/in_1"),
"LEDDDAT5": (0, 28, "lutff_7/in_1"),
"LEDDDAT6": (0, 28, "lutff_0/in_0"),
"LEDDDAT7": (0, 28, "lutff_1/in_0"),
"LEDDDEN": (0, 28, "lutff_1/in_1"),
"LEDDEXE": (0, 28, "lutff_0/in_1"),
"LEDDON": (0, 29, "slf_op_0"),
"PWMOUT0": (0, 28, "slf_op_4"),
"PWMOUT1": (0, 28, "slf_op_5"),
"PWMOUT2": (0, 28, "slf_op_6"),
},
}
}
@ -4816,6 +5023,10 @@ iotile_t_5k_db.append([["B13[10]"], "IoCtrl", "cf_bit_36"])
iotile_t_5k_db.append([["B12[10]"], "IoCtrl", "cf_bit_37"])
iotile_t_5k_db.append([["B13[15]"], "IoCtrl", "cf_bit_38"])
iotile_t_5k_db.append([["B12[15]"], "IoCtrl", "cf_bit_39"])
iotile_t_5k_db.append([["B10[3]"], "IpConfig", "cbit2usealt_in_0"])
iotile_t_5k_db.append([["B12[2]"], "IpConfig", "cbit2usealt_in_1"])
iotile_t_5k_db.append([["B12[3]"], "IpConfig", "SDA_input_delay"])
iotile_t_5k_db.append([["B15[3]"], "IpConfig", "SDA_output_delay"])
iotile_b_5k_db = list(iotile_b_db)
iotile_b_5k_db.append([["B14[15]"], "IoCtrl", "padeb_test_1"])
@ -4828,6 +5039,10 @@ iotile_b_5k_db.append([["B13[10]"], "IoCtrl", "cf_bit_36"])
iotile_b_5k_db.append([["B12[10]"], "IoCtrl", "cf_bit_37"])
iotile_b_5k_db.append([["B13[15]"], "IoCtrl", "cf_bit_38"])
iotile_b_5k_db.append([["B12[15]"], "IoCtrl", "cf_bit_39"])
iotile_b_5k_db.append([["B10[3]"], "IpConfig", "cbit2usealt_in_0"])
iotile_b_5k_db.append([["B12[2]"], "IpConfig", "cbit2usealt_in_1"])
iotile_b_5k_db.append([["B12[3]"], "IpConfig", "SDA_input_delay"])
iotile_b_5k_db.append([["B15[3]"], "IpConfig", "SDA_output_delay"])
for db in [iotile_l_db, iotile_r_db, iotile_t_db, iotile_b_db, iotile_t_5k_db, iotile_b_5k_db, logictile_db, logictile_5k_db, logictile_8k_db, logictile_384_db, rambtile_db, ramttile_db, rambtile_5k_db, ramttile_5k_db, rambtile_8k_db, ramttile_8k_db, dsp0_5k_db, dsp1_5k_db, dsp2_5k_db, dsp3_5k_db, ipcon_5k_db]:
for entry in db:

View File

@ -284,8 +284,10 @@ if ic.is_ultra():
for dsp_idx in range(4):
print_tile_nonrouting_bits("dsp%d" % dsp_idx, list(ic.dsp_tiles[dsp_idx].keys())[0])
print_tile_nonrouting_bits("ipcon", list(ic.ipcon_tiles.keys())[0])
print(".extra_cell 0 0 WARMBOOT")
if ic.is_ultra():
print(".extra_cell %d 0 WARMBOOT" % ic.max_x)
else:
print(".extra_cell 0 0 WARMBOOT")
for key in sorted(icebox.warmbootinfo_db[ic.device]):
print("%s %s" % (key, " ".join([str(k) for k in icebox.warmbootinfo_db[ic.device][key]])))
print()

View File

@ -78,6 +78,13 @@ endif
diff -U0 cached_ipcon_5k.txt bitdata_ipcon_5k.txt || cp -v bitdata_ipcon_5k.txt cached_ipcon_5k.txt
timings:
ifeq ($(DEVICECLASS),5k)
cp tmedges.txt tmedges.tmp
set -e; for f in work_$(DEVICECLASS)_*/*.vsb; do echo $$f; sed '/defparam/d' < $$f > $$f.fixed; yosys -q -f verilog -s tmedges.ys $$f.fixed; done
sort -u tmedges.tmp > tmedges.txt && rm -f tmedges.tmp
python3 timings.py -t timings_up5k.txt work_*/*.sdf > timings_up5k.new
mv timings_up5k.new timings_up5k.txt
else
ifeq ($(DEVICECLASS),8k)
cp tmedges.txt tmedges.tmp
set -e; for f in work_$(DEVICECLASS)_*/*.vsb; do echo $$f; yosys -q -f verilog -s tmedges.ys $$f; done
@ -103,14 +110,14 @@ else
mv timings_lp1k.new timings_lp1k.txt
endif
endif
endif
timings_html:
python3 timings.py -h tmedges.txt -t timings_hx1k.txt -l "HX1K with default temp/volt settings" > timings_hx1k.html
python3 timings.py -h tmedges.txt -t timings_hx8k.txt -l "HX8K with default temp/volt settings" > timings_hx8k.html
python3 timings.py -h tmedges.txt -t timings_lp1k.txt -l "LP1K with default temp/volt settings" > timings_lp1k.html
python3 timings.py -h tmedges.txt -t timings_lp8k.txt -l "LP8K with default temp/volt settings" > timings_lp8k.html
python3 timings.py -h tmedges.txt -t timings_lp384.txt -l "LP384 with default temp/volt settings" > timings_lp384.html
python3 timings.py -h tmedges.txt -t timings_up5k.txt -l "UP5K with default temp/volt settings" > timings_up5k.html
data_cached.txt: cached_io.txt cached_logic.txt cached_ramb$(RAM_SUFFIX).txt cached_ramt$(RAM_SUFFIX).txt cached_dsp0_5k.txt cached_dsp1_5k.txt cached_dsp2_5k.txt cached_dsp3_5k.txt cached_ipcon_5k.txt
gawk '{ print "io", $$0; }' cached_io.txt > data_cached.new
gawk '{ print "logic", $$0; }' cached_logic.txt >> data_cached.new

2
icefuzz/tests/ip/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
work_ip/
*.html

View File

@ -0,0 +1,46 @@
#!/usr/bin/env python3
import ast, sys
data = ""
with open(sys.argv[1], 'r') as f:
data = f.read()
ip_dat = ast.literal_eval("{\n" + data + "}")
def is_cbit(ident):
if "_ENABLE" in ident or "DELAYED" in ident:
return True
else:
return False
def is_bus(ident):
return ident.startswith("SB")
ips = sorted(ip_dat)
print ("<table class=\"cstab\">\n<tr><th>Signal</th>", end='')
for ip in ips:
t, loc = ip
x, y, z = loc
print("<th>%s<br/>(%d, %d, %d)</th>" % (t, x, y, z), end='')
print ("</tr>")
# TODO: could group busses?
for print_t in ["SB", "G", "CBIT"]:
for n in sorted(ip_dat[ips[0]]):
if is_bus(n) != (print_t == "SB"):
continue
if is_cbit(n) != (print_t == "CBIT"):
continue
print("<tr>", end='')
em_o = ""
em_c = ""
if is_cbit(n):
em_o = "<em>"
em_c = "</em>"
print("<td>%s%s%s</td>" % (em_o, n, em_c), end='')
for ip in ips:
entry = ip_dat[ip][n]
x, y, name = entry
print("<td>%s(%d, %d, %s)%s</td>" % (em_o, x, y, name, em_c), end='')
print("</tr>")
print ("</table>")

285
icefuzz/tests/ip/trace_ip.py Executable file
View File

@ -0,0 +1,285 @@
#!/usr/bin/env python3
import os, sys, re
device = "up5k"
pins = "2 3 4 6 9 10 11 12 13 18 19 20 21 25 26 27 28 31 32 34 35 36 37 38 42 43 44 45 46 47 48".split()
# This is the master IP reverse engineering script for three similar IPs: I2C, SPI and LEDDA_IP
ip_types = ["I2C", "SPI", "LEDDA_IP"]
ip_locs = { }
ip_locs["I2C"] = [(0, 31, 0), (25, 31, 0)]
ip_locs["SPI"] = [(0, 0, 0), (25, 0, 1)]
ip_locs["LEDDA_IP"] = [(0, 31, 2)]
#spram_locs = [(0, 0, 1)]
ip_data = { }
#signals[x][0] -> inputs, signals[x][1] ->outputs
ip_signals = {}
ip_signals["I2C"] = [["SBCLKI", "SBRWI", "SBSTBI", "SCLI", "SDAI"],
["SBACKO", "I2CIRQ", "I2CWKUP", "SCLO", "SCLOE", "SDAO", "SDAOE"]]
ip_signals["SPI"] = [["SBCLKI", "SBRWI", "SBSTBI", "MI", "SI", "SCKI", "SCSNI"],
["SBACKO", "SPIIRQ", "SPIWKUP", "SO", "SOE", "MO", "MOE", "SCKO", "SCKOE"]]
# LEDDRST is missing because it doesn't really exist...
ip_signals["LEDDA_IP"] = [["LEDDCS", "LEDDCLK", "LEDDDEN", "LEDDEXE"], ["PWMOUT0", "PWMOUT1", "PWMOUT2", "LEDDON"]]
fixed_cbits = {}
fixed_cbits[("I2C", (0, 31, 0))] = ["BUS_ADDR74_0", "I2C_SLAVE_INIT_ADDR_0"]
fixed_cbits[("I2C", (25, 31, 0))] = ["BUS_ADDR74_0", "BUS_ADDR74_1", "I2C_SLAVE_INIT_ADDR_1"]
fixed_cbits[("SPI", (0, 0, 0))] = []
fixed_cbits[("SPI", (25, 0, 1))] = ["BUS_ADDR74_1"] # WARNING: this is documented as BUS_ADDR74_0, but this is wrong and will cause icecube to fail. May be the same across devices
fuzz_cbits = {}
fuzz_cbits["I2C"] = ["SDA_INPUT_DELAYED", "SDA_OUTPUT_DELAYED"]
# Don't add slave address to the list, despite confusing primitive declaration,
# it's only set in registers not the bitstream
#for i in range(2, 10):
#fuzz_cbits["I2C"].append("I2C_SLAVE_INIT_ADDR_%d" % i)
for i in range(8):
ip_signals["I2C"][0].append("SBADRI%d" % i)
ip_signals["SPI"][0].append("SBADRI%d" % i)
for i in range(4):
ip_signals["LEDDA_IP"][0].append("LEDDADDR%d" % i)
for i in range(8):
ip_signals["I2C"][0].append("SBDATI%d" % i)
ip_signals["SPI"][0].append("SBDATI%d" % i)
ip_signals["LEDDA_IP"][0].append("LEDDDAT%d" % i)
for i in range(8):
ip_signals["I2C"][1].append("SBDATO%d" % i)
ip_signals["SPI"][1].append("SBDATO%d" % i)
for i in range(4):
ip_signals["SPI"][1].append("MCSNO%d" % i)
ip_signals["SPI"][1].append("MCSNOE%d" % i)
fuzz_net_options = {}
fuzz_net_options["I2C"] = ["SBADRI", "SBDATI", "SBDATO"]
fuzz_net_options["SPI"] = ["SBADRI", "SBDATI", "SBDATO", "MCSN"]
fuzz_net_options["LEDDA_IP"] = ["LEDDADDR", "LEDDDAT"]
available_cbits = {}
available_cbits["I2C"] = [("BUS_ADDR74", 4), ("I2C_SLAVE_INIT_ADDR", 10)]
available_cbits["SPI"] = [("BUS_ADDR74", 4)]
# Return a param value in "Lattice style"
def get_param_value(param_size, param_name, set_cbits):
val = "\"0b"
for i in range(param_size):
if param_name + "_" + str((param_size - 1) - i) in set_cbits:
val += "1"
else:
val += "0"
val += "\""
return val
# Build the output files for a given IP and config, returning
# the pin2net map
def make_ip(ip_type, ip_loc, fuzz_opt, set_cbits):
used_inputs = [ ]
used_outputs = [ ]
for insig in ip_signals[ip_type][0]:
ignore = False
for o in fuzz_net_options[ip_type]:
if o != fuzz_opt and insig.startswith(o):
ignore = True
if not ignore:
used_inputs.append(insig)
for outsig in ip_signals[ip_type][1]:
ignore = False
for o in fuzz_net_options[ip_type]:
if o != fuzz_opt and outsig.startswith(o):
ignore = True
if not ignore:
used_outputs.append(outsig)
all_sigs = used_inputs + used_outputs
all_cbits = set()
all_cbits.update(set_cbits)
if (ip_type, ip_loc) in fixed_cbits:
all_cbits.update(fixed_cbits[(ip_type, ip_loc)])
with open("./work_ip/ip.v", "w") as f:
print("module top(", file=f)
for s in used_inputs:
print("input %s," % s, file=f)
for s in used_outputs[:-1]:
print("output %s," % s, file=f)
print("output %s);" % used_outputs[-1], file=f)
print("SB_%s" % ip_type, file=f)
if ip_type in available_cbits:
print("\t#(", file=f)
for p in available_cbits[ip_type]:
name, width = p
comma = "," if p != available_cbits[ip_type][-1] else ""
print("\t\t.%s(%s)%s" % (name, get_param_value(width, name, all_cbits), comma), file=f)
print("\t)", file=f)
print("\tip_inst (",file=f)
for sig in all_sigs[:-1]:
print("\t\t.%s(%s)," % (sig, sig), file=f)
print("\t\t.%s(%s)" % (all_sigs[-1], all_sigs[-1]), file=f)
print("\t)", file=f)
if "SDA_INPUT_DELAYED" in all_cbits:
print("\t/* synthesis SDA_INPUT_DELAYED=1 */", file=f)
else:
print("\t/* synthesis SDA_INPUT_DELAYED=0 */", file=f)
if "SDA_OUTPUT_DELAYED" in all_cbits:
print("\t/* synthesis SDA_OUTPUT_DELAYED=1 */", file=f)
else:
print("\t/* synthesis SDA_OUTPUT_DELAYED=0 */", file=f)
print(";", file=f)
print("endmodule", file=f)
pin2net = {}
with open("./work_ip/ip.pcf","w") as f:
temp_pins = list(pins)
for sig in all_sigs:
if len(temp_pins) == 0:
sys.stderr.write("ERROR: no remaining pins to alloc")
sys.exit(1)
pin = temp_pins.pop()
pin2net[pin] = sig
print("set_io %s %s" % (sig, pin), file=f)
print("set_location ip_inst %d %d %d" % ip_loc, file=f)
return pin2net
#Parse the output of an icebox vlog file to determine connectivity
def parse_vlog(f, pin2net, net_map):
current_net = None
for line in f:
m = re.match(r"wire ([a-zA-Z0-9_]+);", line)
if m:
net = m.group(1)
mp = re.match(r"pin_([a-zA-Z0-9]+)", net)
if mp:
pin = mp.group(1)
if pin in pin2net:
current_net = pin2net[pin]
else:
current_net = None
else:
current_net = None
elif current_net is not None:
m = re.match(r"// \((\d+), (\d+), '([a-zA-Z0-9_/]+)'\)", line)
if m:
x = int(m.group(1))
y = int(m.group(2))
net = m.group(3)
if not (net.startswith("sp") or net.startswith("glb") or net.startswith("neigh") or net.startswith("io") or net.startswith("local") or net.startswith("fabout")):
net_map[current_net].add((x, y, net))
def parse_exp(f):
current_x = 0
current_y = 0
bits = set()
for line in f:
splitline = line.split(' ')
if splitline[0].endswith("_tile"):
current_x = int(splitline[1])
current_y = int(splitline[2])
elif splitline[0] == "IpConfig":
bits.add((current_x, current_y, splitline[1].strip()))
return bits
if not os.path.exists("./work_ip"):
os.mkdir("./work_ip")
for ip in ip_types:
ip_data[ip] = {}
for loc in ip_locs[ip]:
x, y, z = loc
net_cbit_map = {}
init_cbits = []
for sig in ip_signals[ip][0]:
net_cbit_map[sig] = set()
for sig in ip_signals[ip][1]:
net_cbit_map[sig] = set()
first = True
for state in ["FUZZ_NETS", "FUZZ_CBITS"]:
fuzz_options = None
if state == "FUZZ_NETS":
fuzz_options = fuzz_net_options[ip]
else:
if ip in fuzz_cbits:
fuzz_options = fuzz_cbits[ip]
else:
fuzz_options = []
for n in fuzz_options:
print("Fuzzing %s (%d, %d, %d) %s" % (ip, x, y, z, n))
fuzz_nets = fuzz_net_options[ip][0]
if state == "FUZZ_NETS":
fuzz_nets = n
set_cbits = set()
if state == "FUZZ_CBITS":
set_cbits.add(n)
pin2net = make_ip(ip, loc, fuzz_nets, set_cbits)
retval = os.system("bash ../../icecube.sh -" + device + " ./work_ip/ip.v > ./work_ip/icecube.log 2>&1")
if retval != 0:
sys.stderr.write('ERROR: icecube returned non-zero error code\n')
sys.exit(1)
retval = os.system("../../../icebox/icebox_explain.py ./work_ip/ip.asc > ./work_ip/ip.exp")
if retval != 0:
sys.stderr.write('ERROR: icebox_explain returned non-zero error code\n')
sys.exit(1)
retval = os.system("../../../icebox/icebox_vlog.py -l ./work_ip/ip.asc > ./work_ip/ip.vlog")
if retval != 0:
sys.stderr.write('ERROR: icebox_vlog returned non-zero error code\n')
sys.exit(1)
with open("./work_ip/ip.vlog", "r") as f:
parse_vlog(f, pin2net, net_cbit_map)
bits = []
with open("./work_ip/ip.exp", "r") as f:
bits = parse_exp(f)
if first:
idx = 0
for bit in bits:
init_cbits.append(bit)
if len(bits) == 1:
net_cbit_map[ip + "_ENABLE"] = [bit]
else:
net_cbit_map[ip + "_ENABLE_" + str(idx)] = [bit]
idx += 1
for bit in init_cbits:
if bit not in bits:
bx, by, bn = bit
print('WARNING: while fuzzing %s (%d, %d, %d) bit (%d, %d, %s) has unknown function (not always set)' %
(ip, x, y, z, bx, by, bn))
new_bits = []
for bit in bits:
if bit not in init_cbits:
new_bits.append(bit)
if state == "FUZZ_NETS" and len(new_bits) != 0:
for bit in new_bits:
bx, by, bn = bit
print('WARNING: while fuzzing %s (%d, %d, %d) bit (%d, %d, %s) has unknown function (not always set)' %
(ip, x, y, z, bx, by, bn))
elif state == "FUZZ_CBITS":
if len(new_bits) == 0:
print('WARNING: while fuzzing %s (%d, %d, %d) param %s causes no change' %
(ip, x, y, z, n))
else:
idx = 0
for bit in new_bits:
if len(new_bits) == 1:
net_cbit_map[n] = [bit]
else:
net_cbit_map[n + "_" + str(idx)] = [bit]
idx += 1
first = False
ip_data[ip][loc] = net_cbit_map
with open(device + "_" + ip + "_data.txt", "w") as f:
for loc in ip_data[ip]:
x, y, z = loc
print("\t(\"%s\", (%d, %d, %d)): {" % (ip, x, y, z), file=f)
data = ip_data[ip][loc]
for net in sorted(data):
cnets = []
for cnet in data[net]:
cnets.append("(%d, %d, \"%s\")" % cnet)
print("\t\t%s %s, " % (("\"" + net.replace("[","_").replace("]","") + "\":").ljust(24), " ".join(cnets)), file=f)
print("\t},", file=f)

View File

@ -0,0 +1,84 @@
("I2C", (0, 31, 0)): {
"I2CIRQ": (0, 30, "slf_op_7"),
"I2CWKUP": (0, 29, "slf_op_5"),
"I2C_ENABLE_0": (13, 31, "cbit2usealt_in_0"),
"I2C_ENABLE_1": (12, 31, "cbit2usealt_in_1"),
"SBACKO": (0, 30, "slf_op_6"),
"SBADRI0": (0, 30, "lutff_1/in_0"),
"SBADRI1": (0, 30, "lutff_2/in_0"),
"SBADRI2": (0, 30, "lutff_3/in_0"),
"SBADRI3": (0, 30, "lutff_4/in_0"),
"SBADRI4": (0, 30, "lutff_5/in_0"),
"SBADRI5": (0, 30, "lutff_6/in_0"),
"SBADRI6": (0, 30, "lutff_7/in_0"),
"SBADRI7": (0, 29, "lutff_2/in_0"),
"SBCLKI": (0, 30, "clk"),
"SBDATI0": (0, 29, "lutff_5/in_0"),
"SBDATI1": (0, 29, "lutff_6/in_0"),
"SBDATI2": (0, 29, "lutff_7/in_0"),
"SBDATI3": (0, 30, "lutff_0/in_3"),
"SBDATI4": (0, 30, "lutff_5/in_1"),
"SBDATI5": (0, 30, "lutff_6/in_1"),
"SBDATI6": (0, 30, "lutff_7/in_1"),
"SBDATI7": (0, 30, "lutff_0/in_0"),
"SBDATO0": (0, 29, "slf_op_6"),
"SBDATO1": (0, 29, "slf_op_7"),
"SBDATO2": (0, 30, "slf_op_0"),
"SBDATO3": (0, 30, "slf_op_1"),
"SBDATO4": (0, 30, "slf_op_2"),
"SBDATO5": (0, 30, "slf_op_3"),
"SBDATO6": (0, 30, "slf_op_4"),
"SBDATO7": (0, 30, "slf_op_5"),
"SBRWI": (0, 29, "lutff_4/in_0"),
"SBSTBI": (0, 29, "lutff_3/in_0"),
"SCLI": (0, 29, "lutff_2/in_1"),
"SCLO": (0, 29, "slf_op_3"),
"SCLOE": (0, 29, "slf_op_4"),
"SDAI": (0, 29, "lutff_1/in_1"),
"SDAO": (0, 29, "slf_op_1"),
"SDAOE": (0, 29, "slf_op_2"),
"SDA_INPUT_DELAYED": (12, 31, "SDA_input_delay"),
"SDA_OUTPUT_DELAYED": (12, 31, "SDA_output_delay"),
},
("I2C", (25, 31, 0)): {
"I2CIRQ": (25, 30, "slf_op_7"),
"I2CWKUP": (25, 29, "slf_op_5"),
"I2C_ENABLE_0": (19, 31, "cbit2usealt_in_0"),
"I2C_ENABLE_1": (19, 31, "cbit2usealt_in_1"),
"SBACKO": (25, 30, "slf_op_6"),
"SBADRI0": (25, 30, "lutff_1/in_0"),
"SBADRI1": (25, 30, "lutff_2/in_0"),
"SBADRI2": (25, 30, "lutff_3/in_0"),
"SBADRI3": (25, 30, "lutff_4/in_0"),
"SBADRI4": (25, 30, "lutff_5/in_0"),
"SBADRI5": (25, 30, "lutff_6/in_0"),
"SBADRI6": (25, 30, "lutff_7/in_0"),
"SBADRI7": (25, 29, "lutff_2/in_0"),
"SBCLKI": (25, 30, "clk"),
"SBDATI0": (25, 29, "lutff_5/in_0"),
"SBDATI1": (25, 29, "lutff_6/in_0"),
"SBDATI2": (25, 29, "lutff_7/in_0"),
"SBDATI3": (25, 30, "lutff_0/in_3"),
"SBDATI4": (25, 30, "lutff_5/in_1"),
"SBDATI5": (25, 30, "lutff_6/in_1"),
"SBDATI6": (25, 30, "lutff_7/in_1"),
"SBDATI7": (25, 30, "lutff_0/in_0"),
"SBDATO0": (25, 29, "slf_op_6"),
"SBDATO1": (25, 29, "slf_op_7"),
"SBDATO2": (25, 30, "slf_op_0"),
"SBDATO3": (25, 30, "slf_op_1"),
"SBDATO4": (25, 30, "slf_op_2"),
"SBDATO5": (25, 30, "slf_op_3"),
"SBDATO6": (25, 30, "slf_op_4"),
"SBDATO7": (25, 30, "slf_op_5"),
"SBRWI": (25, 29, "lutff_4/in_0"),
"SBSTBI": (25, 29, "lutff_3/in_0"),
"SCLI": (25, 29, "lutff_2/in_1"),
"SCLO": (25, 29, "slf_op_3"),
"SCLOE": (25, 29, "slf_op_4"),
"SDAI": (25, 29, "lutff_1/in_1"),
"SDAO": (25, 29, "slf_op_1"),
"SDAOE": (25, 29, "slf_op_2"),
"SDA_INPUT_DELAYED": (19, 31, "SDA_input_delay"),
"SDA_OUTPUT_DELAYED": (19, 31, "SDA_output_delay"),
},

View File

@ -0,0 +1,22 @@
("LEDDA_IP", (0, 31, 2)): {
"LEDDADDR0": (0, 28, "lutff_4/in_0"),
"LEDDADDR1": (0, 28, "lutff_5/in_0"),
"LEDDADDR2": (0, 28, "lutff_6/in_0"),
"LEDDADDR3": (0, 28, "lutff_7/in_0"),
"LEDDCLK": (0, 29, "clk"),
"LEDDCS": (0, 28, "lutff_2/in_0"),
"LEDDDAT0": (0, 28, "lutff_2/in_1"),
"LEDDDAT1": (0, 28, "lutff_3/in_1"),
"LEDDDAT2": (0, 28, "lutff_4/in_1"),
"LEDDDAT3": (0, 28, "lutff_5/in_1"),
"LEDDDAT4": (0, 28, "lutff_6/in_1"),
"LEDDDAT5": (0, 28, "lutff_7/in_1"),
"LEDDDAT6": (0, 28, "lutff_0/in_0"),
"LEDDDAT7": (0, 28, "lutff_1/in_0"),
"LEDDDEN": (0, 28, "lutff_1/in_1"),
"LEDDEXE": (0, 28, "lutff_0/in_1"),
"LEDDON": (0, 29, "slf_op_0"),
"PWMOUT0": (0, 28, "slf_op_4"),
"PWMOUT1": (0, 28, "slf_op_5"),
"PWMOUT2": (0, 28, "slf_op_6"),
},

View File

@ -0,0 +1,100 @@
("SPI", (0, 0, 0)): {
"MCSNO0": (0, 21, "slf_op_2"),
"MCSNO1": (0, 21, "slf_op_4"),
"MCSNO2": (0, 21, "slf_op_7"),
"MCSNO3": (0, 22, "slf_op_1"),
"MCSNOE0": (0, 21, "slf_op_3"),
"MCSNOE1": (0, 21, "slf_op_5"),
"MCSNOE2": (0, 22, "slf_op_0"),
"MCSNOE3": (0, 22, "slf_op_2"),
"MI": (0, 22, "lutff_0/in_1"),
"MO": (0, 20, "slf_op_6"),
"MOE": (0, 20, "slf_op_7"),
"SBACKO": (0, 20, "slf_op_1"),
"SBADRI0": (0, 19, "lutff_1/in_1"),
"SBADRI1": (0, 19, "lutff_2/in_1"),
"SBADRI2": (0, 20, "lutff_0/in_3"),
"SBADRI3": (0, 20, "lutff_1/in_3"),
"SBADRI4": (0, 20, "lutff_2/in_3"),
"SBADRI5": (0, 20, "lutff_3/in_3"),
"SBADRI6": (0, 20, "lutff_4/in_3"),
"SBADRI7": (0, 20, "lutff_5/in_3"),
"SBCLKI": (0, 20, "clk"),
"SBDATI0": (0, 19, "lutff_1/in_3"),
"SBDATI1": (0, 19, "lutff_2/in_3"),
"SBDATI2": (0, 19, "lutff_3/in_3"),
"SBDATI3": (0, 19, "lutff_4/in_3"),
"SBDATI4": (0, 19, "lutff_5/in_3"),
"SBDATI5": (0, 19, "lutff_6/in_3"),
"SBDATI6": (0, 19, "lutff_7/in_3"),
"SBDATI7": (0, 19, "lutff_0/in_1"),
"SBDATO0": (0, 19, "slf_op_1"),
"SBDATO1": (0, 19, "slf_op_2"),
"SBDATO2": (0, 19, "slf_op_3"),
"SBDATO3": (0, 19, "slf_op_4"),
"SBDATO4": (0, 19, "slf_op_5"),
"SBDATO5": (0, 19, "slf_op_6"),
"SBDATO6": (0, 19, "slf_op_7"),
"SBDATO7": (0, 20, "slf_op_0"),
"SBRWI": (0, 19, "lutff_0/in_3"),
"SBSTBI": (0, 20, "lutff_6/in_3"),
"SCKI": (0, 22, "lutff_1/in_1"),
"SCKO": (0, 21, "slf_op_0"),
"SCKOE": (0, 21, "slf_op_1"),
"SCSNI": (0, 22, "lutff_2/in_1"),
"SI": (0, 22, "lutff_7/in_3"),
"SO": (0, 20, "slf_op_4"),
"SOE": (0, 20, "slf_op_5"),
"SPIIRQ": (0, 20, "slf_op_2"),
"SPIWKUP": (0, 20, "slf_op_3"),
},
("SPI", (25, 0, 1)): {
"MCSNO0": (25, 21, "slf_op_2"),
"MCSNO1": (25, 21, "slf_op_4"),
"MCSNO2": (25, 21, "slf_op_7"),
"MCSNO3": (25, 22, "slf_op_1"),
"MCSNOE0": (25, 21, "slf_op_3"),
"MCSNOE1": (25, 21, "slf_op_5"),
"MCSNOE2": (25, 22, "slf_op_0"),
"MCSNOE3": (25, 22, "slf_op_2"),
"MI": (25, 22, "lutff_0/in_1"),
"MO": (25, 20, "slf_op_6"),
"MOE": (25, 20, "slf_op_7"),
"SBACKO": (25, 20, "slf_op_1"),
"SBADRI0": (25, 19, "lutff_1/in_1"),
"SBADRI1": (25, 19, "lutff_2/in_1"),
"SBADRI2": (25, 20, "lutff_0/in_3"),
"SBADRI3": (25, 20, "lutff_1/in_3"),
"SBADRI4": (25, 20, "lutff_2/in_3"),
"SBADRI5": (25, 20, "lutff_3/in_3"),
"SBADRI6": (25, 20, "lutff_4/in_3"),
"SBADRI7": (25, 20, "lutff_5/in_3"),
"SBCLKI": (25, 20, "clk"),
"SBDATI0": (25, 19, "lutff_1/in_3"),
"SBDATI1": (25, 19, "lutff_2/in_3"),
"SBDATI2": (25, 19, "lutff_3/in_3"),
"SBDATI3": (25, 19, "lutff_4/in_3"),
"SBDATI4": (25, 19, "lutff_5/in_3"),
"SBDATI5": (25, 19, "lutff_6/in_3"),
"SBDATI6": (25, 19, "lutff_7/in_3"),
"SBDATI7": (25, 19, "lutff_0/in_1"),
"SBDATO0": (25, 19, "slf_op_1"),
"SBDATO1": (25, 19, "slf_op_2"),
"SBDATO2": (25, 19, "slf_op_3"),
"SBDATO3": (25, 19, "slf_op_4"),
"SBDATO4": (25, 19, "slf_op_5"),
"SBDATO5": (25, 19, "slf_op_6"),
"SBDATO6": (25, 19, "slf_op_7"),
"SBDATO7": (25, 20, "slf_op_0"),
"SBRWI": (25, 19, "lutff_0/in_3"),
"SBSTBI": (25, 20, "lutff_6/in_3"),
"SCKI": (25, 22, "lutff_1/in_1"),
"SCKO": (25, 21, "slf_op_0"),
"SCKOE": (25, 21, "slf_op_1"),
"SCSNI": (25, 22, "lutff_2/in_1"),
"SI": (25, 22, "lutff_7/in_3"),
"SO": (25, 20, "slf_op_4"),
"SOE": (25, 20, "slf_op_5"),
"SPIIRQ": (25, 20, "slf_op_2"),
"SPIWKUP": (25, 20, "slf_op_3"),
},

22
icefuzz/tests/sb_i2c.pcf Normal file
View File

@ -0,0 +1,22 @@
set_io sbclki 2
set_io sbrwi 3
set_io sbstbi 4
set_io sbadri0 6
set_io sbadri1 9
set_io sbadri7 10
set_io sbdati0 11
set_io sbdati1 12
set_io sbdati7 13
set_io sbdato0 14
set_io sbdato1 15
set_io sbdato7 16
set_io sbacko 17
set_io i2cirq 18
set_io i2cwkup 19
set_io scli 20
set_io sdai 21
set_io sclo 23
set_io scloe 25
set_io sdao 26
set_io sdaoe 27
set_io scli2 28

74
icefuzz/tests/sb_i2c.v Normal file
View File

@ -0,0 +1,74 @@
module top (
input sbclki, sbrwi, sbstbi,
input sbadri0, sbadri1, sbadri7,
input sbdati0, sbdati1, sbdati7,
output sbdato0, sbdato1, sbdato7,
output sbacko, i2cirq, i2cwkup,
input scli, sdai, scli2,
output sclo, scloe, sdao, sdaoe
);
SB_I2C #(
.I2C_SLAVE_INIT_ADDR("0b1111100001"),
.BUS_ADDR74("0b0001")
) i2c_ip (
.SBCLKI(sbclki),
.SBRWI(sbrwi),
.SBSTBI(sbstbi),
.SBADRI0(sbadri0),
.SBADRI1(sbadri1),
.SBADRI7(sbadri7),
.SBDATI0(sbdati0),
.SBDATI1(sbdati1),
.SBDATI7(sbdati7),
.SBDATO0(sbdato0),
.SBDATO1(sbdato1),
.SBACKO(sbacko),
.I2CIRQ(i2cirq),
.I2CWKUP(i2cwkup),
.SCLI(scli),
.SCLO(sclo),
.SCLOE(scloe),
.SDAI(sdai),
.SDAO(sdao),
.SDAOE(sdaoe)
)
/* synthesis SDA_INPUT_DELAYED=0 */
/* synthesis SDA_OUTPUT_DELAYED=0 */
/* synthesis SCL_INPUT_FILTERED=1 */
;
SB_I2C #(
.I2C_SLAVE_INIT_ADDR("0b1111100010"),
.BUS_ADDR74("0b0011")
) i2c_ip2 (
.SBCLKI(sbclki),
.SBRWI(sbrwi),
.SBSTBI(sbstbi),
.SBADRI0(sbadri0),
.SBADRI1(sbadri1),
.SBADRI7(sbadri7),
.SBDATI0(sbdati0),
.SBDATI1(sbdati1),
.SBDATI7(sbdati7),
.SBDATO7(sbdato7),
.SCLI(scli2)
)
/* synthesis SDA_INPUT_DELAYED=0 */
/* synthesis SDA_OUTPUT_DELAYED=0 */
/* synthesis SCL_INPUT_FILTERED=1 */
;
endmodule

View File

@ -0,0 +1,18 @@
set_io sbclki 2
set_io sbrwi 3
set_io sbstbi 4
set_io sbadri0 6
set_io sbadri1 9
set_io sbadri7 10
set_io sbdati0 11
set_io sbdati1 12
set_io sbdati7 13
set_io sbdato0 14
set_io sbdato1 15
set_io sbdato7 16
set_io sbacko 17
set_io i2cirq 18
set_io i2cwkup 19
set_io scl 20
set_io sda 21

66
icefuzz/tests/sb_i2c_io.v Normal file
View File

@ -0,0 +1,66 @@
module top (
input sbclki, sbrwi, sbstbi,
input sbadri0, sbadri1, sbadri7,
input sbdati0, sbdati1, sbdati7,
output sbdato0, sbdato1, sbdato7,
output sbacko, i2cirq, i2cwkup,
inout scl, sda
);
wire scli, sclo, scloe, sdai, sdao, sdaoe;
SB_I2C #(
.I2C_SLAVE_INIT_ADDR("0b1111100010"),
.BUS_ADDR74("0b0011")
) i2c_ip (
.SBCLKI(sbclki),
.SBRWI(sbrwi),
.SBSTBI(sbstbi),
.SBADRI0(sbadri0),
.SBADRI1(sbadri1),
.SBADRI7(sbadri7),
.SBDATI0(sbdati0),
.SBDATI1(sbdati1),
.SBDATI7(sbdati7),
.SBDATO0(sbdato0),
.SBDATO1(sbdato1),
.SBDATO7(sbdato7),
.SBACKO(sbacko),
.I2CIRQ(i2cirq),
.I2CWKUP(i2cwkup),
.SCLI(scli),
.SCLO(sclo),
.SCLOE(scloe),
.SDAI(sdai),
.SDAO(sdao),
.SDAOE(sdaoe)
) /* synthesis SCL_INPUT_FILTERED=1 */;
SB_IO #(
.PIN_TYPE(6'b101001),
.PULLUP(1'b1)
) scl_io (
.PACKAGE_PIN(scl),
.OUTPUT_ENABLE(scloe),
.D_OUT_0(sclo),
.D_IN_0(scli)
);
SB_IO #(
.PIN_TYPE(6'b101001),
.PULLUP(1'b1)
) sda_io (
.PACKAGE_PIN(sda),
.OUTPUT_ENABLE(sdaoe),
.D_OUT_0(sdao),
.D_IN_0(sdai)
);
endmodule

3607
icefuzz/timings_up5k.txt Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,6 @@
CEMux.O LogicCell40.ce
CEMux.O PRE_IO.CLOCKENABLE
CEMux.O SB_MAC16.CE
CEMux.O SB_RAM40_4K.RCLKE
CEMux.O SB_RAM40_4K.WCLKE
CascadeBuf.O CascadeMux.I
@ -27,12 +28,32 @@ CascadeMux.O SB_RAM40_4K.WADDR[6]
CascadeMux.O SB_RAM40_4K.WADDR[7]
CascadeMux.O SB_RAM40_4K.WADDR[8]
CascadeMux.O SB_RAM40_4K.WADDR[9]
ClkMux.O DummyBuf.I
ClkMux.O INV.I
ClkMux.O LogicCell40.clk
ClkMux.O PRE_IO.INPUTCLK
ClkMux.O PRE_IO.OUTPUTCLK
ClkMux.O SB_MAC16.CLK
ClkMux.O SB_RAM40_4K.RCLK
ClkMux.O SB_RAM40_4K.WCLK
ClkMux.O SB_SPRAM256KA.CLOCK
DummyBuf.O Odrv4.I
DummyBuf.O SB_LEDDA_IP.LEDDADDR0
DummyBuf.O SB_LEDDA_IP.LEDDADDR1
DummyBuf.O SB_LEDDA_IP.LEDDADDR2
DummyBuf.O SB_LEDDA_IP.LEDDADDR3
DummyBuf.O SB_LEDDA_IP.LEDDCLK
DummyBuf.O SB_LEDDA_IP.LEDDCS
DummyBuf.O SB_LEDDA_IP.LEDDDAT0
DummyBuf.O SB_LEDDA_IP.LEDDDAT1
DummyBuf.O SB_LEDDA_IP.LEDDDAT2
DummyBuf.O SB_LEDDA_IP.LEDDDAT3
DummyBuf.O SB_LEDDA_IP.LEDDDAT4
DummyBuf.O SB_LEDDA_IP.LEDDDAT5
DummyBuf.O SB_LEDDA_IP.LEDDDAT6
DummyBuf.O SB_LEDDA_IP.LEDDDAT7
DummyBuf.O SB_LEDDA_IP.LEDDDEN
DummyBuf.O SB_LEDDA_IP.LEDDEXE
GND.Y LogicCell40.carryin
GND.Y LogicCell40.clk
GND.Y LogicCell40.in0
@ -41,6 +62,7 @@ GND.Y LogicCell40.in2
GND.Y LogicCell40.in3
GND.Y LogicCell40.sr
GND.Y PRE_IO.DOUT0
GND.Y SB_MAC16.CLK
GND.Y SB_RAM40_4K.WCLK
Glb2LocalMux.O LocalMux.I
GlobalMux.O CEMux.I
@ -60,9 +82,89 @@ IO_PAD.DOUT PRE_IO.PADIN
IO_PAD.DOUT PRE_IO_GBUF.PADSIGNALTOGLOBALBUFFER
IO_PAD.PACKAGEPIN IO_PAD.PACKAGEPIN
InMux.O CascadeMux.I
InMux.O DummyBuf.I
InMux.O LogicCell40.in0
InMux.O LogicCell40.in1
InMux.O LogicCell40.in3
InMux.O SB_HFOSC.CLKHFEN
InMux.O SB_HFOSC.CLKHFPU
InMux.O SB_LFOSC.CLKLFEN
InMux.O SB_LFOSC.CLKLFPU
InMux.O SB_MAC16.ADDSUBBOT
InMux.O SB_MAC16.ADDSUBTOP
InMux.O SB_MAC16.AHOLD
InMux.O SB_MAC16.A[0]
InMux.O SB_MAC16.A[10]
InMux.O SB_MAC16.A[11]
InMux.O SB_MAC16.A[12]
InMux.O SB_MAC16.A[13]
InMux.O SB_MAC16.A[14]
InMux.O SB_MAC16.A[15]
InMux.O SB_MAC16.A[1]
InMux.O SB_MAC16.A[2]
InMux.O SB_MAC16.A[3]
InMux.O SB_MAC16.A[4]
InMux.O SB_MAC16.A[5]
InMux.O SB_MAC16.A[6]
InMux.O SB_MAC16.A[7]
InMux.O SB_MAC16.A[8]
InMux.O SB_MAC16.A[9]
InMux.O SB_MAC16.BHOLD
InMux.O SB_MAC16.B[0]
InMux.O SB_MAC16.B[10]
InMux.O SB_MAC16.B[11]
InMux.O SB_MAC16.B[12]
InMux.O SB_MAC16.B[13]
InMux.O SB_MAC16.B[14]
InMux.O SB_MAC16.B[15]
InMux.O SB_MAC16.B[1]
InMux.O SB_MAC16.B[2]
InMux.O SB_MAC16.B[3]
InMux.O SB_MAC16.B[4]
InMux.O SB_MAC16.B[5]
InMux.O SB_MAC16.B[6]
InMux.O SB_MAC16.B[7]
InMux.O SB_MAC16.B[8]
InMux.O SB_MAC16.B[9]
InMux.O SB_MAC16.CHOLD
InMux.O SB_MAC16.CI
InMux.O SB_MAC16.C[0]
InMux.O SB_MAC16.C[10]
InMux.O SB_MAC16.C[11]
InMux.O SB_MAC16.C[12]
InMux.O SB_MAC16.C[13]
InMux.O SB_MAC16.C[14]
InMux.O SB_MAC16.C[15]
InMux.O SB_MAC16.C[1]
InMux.O SB_MAC16.C[2]
InMux.O SB_MAC16.C[3]
InMux.O SB_MAC16.C[4]
InMux.O SB_MAC16.C[5]
InMux.O SB_MAC16.C[6]
InMux.O SB_MAC16.C[7]
InMux.O SB_MAC16.C[8]
InMux.O SB_MAC16.C[9]
InMux.O SB_MAC16.DHOLD
InMux.O SB_MAC16.D[0]
InMux.O SB_MAC16.D[10]
InMux.O SB_MAC16.D[11]
InMux.O SB_MAC16.D[12]
InMux.O SB_MAC16.D[13]
InMux.O SB_MAC16.D[14]
InMux.O SB_MAC16.D[15]
InMux.O SB_MAC16.D[1]
InMux.O SB_MAC16.D[2]
InMux.O SB_MAC16.D[3]
InMux.O SB_MAC16.D[4]
InMux.O SB_MAC16.D[5]
InMux.O SB_MAC16.D[6]
InMux.O SB_MAC16.D[7]
InMux.O SB_MAC16.D[8]
InMux.O SB_MAC16.D[9]
InMux.O SB_MAC16.OHOLDBOT
InMux.O SB_MAC16.OHOLDTOP
InMux.O SB_MAC16.OLOADBOT
InMux.O SB_MAC16.OLOADTOP
InMux.O SB_RAM40_4K.MASK[0]
InMux.O SB_RAM40_4K.MASK[10]
InMux.O SB_RAM40_4K.MASK[11]
@ -95,6 +197,50 @@ InMux.O SB_RAM40_4K.WDATA[6]
InMux.O SB_RAM40_4K.WDATA[7]
InMux.O SB_RAM40_4K.WDATA[8]
InMux.O SB_RAM40_4K.WDATA[9]
InMux.O SB_RGBA_DRV.CURREN
InMux.O SB_RGBA_DRV.RGB0PWM
InMux.O SB_RGBA_DRV.RGB1PWM
InMux.O SB_RGBA_DRV.RGB2PWM
InMux.O SB_RGBA_DRV.RGBLEDEN
InMux.O SB_SPRAM256KA.ADDRESS[0]
InMux.O SB_SPRAM256KA.ADDRESS[10]
InMux.O SB_SPRAM256KA.ADDRESS[11]
InMux.O SB_SPRAM256KA.ADDRESS[12]
InMux.O SB_SPRAM256KA.ADDRESS[13]
InMux.O SB_SPRAM256KA.ADDRESS[1]
InMux.O SB_SPRAM256KA.ADDRESS[2]
InMux.O SB_SPRAM256KA.ADDRESS[3]
InMux.O SB_SPRAM256KA.ADDRESS[4]
InMux.O SB_SPRAM256KA.ADDRESS[5]
InMux.O SB_SPRAM256KA.ADDRESS[6]
InMux.O SB_SPRAM256KA.ADDRESS[7]
InMux.O SB_SPRAM256KA.ADDRESS[8]
InMux.O SB_SPRAM256KA.ADDRESS[9]
InMux.O SB_SPRAM256KA.CHIPSELECT
InMux.O SB_SPRAM256KA.DATAIN[0]
InMux.O SB_SPRAM256KA.DATAIN[10]
InMux.O SB_SPRAM256KA.DATAIN[11]
InMux.O SB_SPRAM256KA.DATAIN[12]
InMux.O SB_SPRAM256KA.DATAIN[13]
InMux.O SB_SPRAM256KA.DATAIN[14]
InMux.O SB_SPRAM256KA.DATAIN[15]
InMux.O SB_SPRAM256KA.DATAIN[1]
InMux.O SB_SPRAM256KA.DATAIN[2]
InMux.O SB_SPRAM256KA.DATAIN[3]
InMux.O SB_SPRAM256KA.DATAIN[4]
InMux.O SB_SPRAM256KA.DATAIN[5]
InMux.O SB_SPRAM256KA.DATAIN[6]
InMux.O SB_SPRAM256KA.DATAIN[7]
InMux.O SB_SPRAM256KA.DATAIN[8]
InMux.O SB_SPRAM256KA.DATAIN[9]
InMux.O SB_SPRAM256KA.MASKWREN[0]
InMux.O SB_SPRAM256KA.MASKWREN[1]
InMux.O SB_SPRAM256KA.MASKWREN[2]
InMux.O SB_SPRAM256KA.MASKWREN[3]
InMux.O SB_SPRAM256KA.POWEROFF
InMux.O SB_SPRAM256KA.SLEEP
InMux.O SB_SPRAM256KA.STANDBY
InMux.O SB_SPRAM256KA.WREN
IoInMux.O ICE_GB.USERSIGNALTOGLOBALBUFFER
IoInMux.O PLL40.BYPASS
IoInMux.O PLL40.DYNAMICDELAY[0]
@ -271,6 +417,105 @@ PRE_IO.DIN1 Odrv4.I
PRE_IO.PADOEN IO_PAD.OE
PRE_IO.PADOUT IO_PAD.DIN
PRE_IO_GBUF.GLOBALBUFFEROUTPUT gio2CtrlBuf.I
SB_HFOSC.CLKHF GlobalMux.I
SB_HFOSC.CLKHF Odrv12.I
SB_HFOSC.CLKHF Odrv4.I
SB_LEDDA_IP.PWMOUT0 DummyBuf.I
SB_LEDDA_IP.PWMOUT1 DummyBuf.I
SB_LEDDA_IP.PWMOUT2 DummyBuf.I
SB_LFOSC.CLKLF GlobalMux.I
SB_LFOSC.CLKLF Odrv12.I
SB_MAC16.ACCUMCO SB_MAC16.ACCUMCI
SB_MAC16.CO Odrv12.I
SB_MAC16.CO Odrv4.I
SB_MAC16.O[0] LocalMux.I
SB_MAC16.O[0] Odrv12.I
SB_MAC16.O[0] Odrv4.I
SB_MAC16.O[10] LocalMux.I
SB_MAC16.O[10] Odrv12.I
SB_MAC16.O[10] Odrv4.I
SB_MAC16.O[11] LocalMux.I
SB_MAC16.O[11] Odrv12.I
SB_MAC16.O[11] Odrv4.I
SB_MAC16.O[12] LocalMux.I
SB_MAC16.O[12] Odrv12.I
SB_MAC16.O[12] Odrv4.I
SB_MAC16.O[13] LocalMux.I
SB_MAC16.O[13] Odrv12.I
SB_MAC16.O[13] Odrv4.I
SB_MAC16.O[14] LocalMux.I
SB_MAC16.O[14] Odrv12.I
SB_MAC16.O[14] Odrv4.I
SB_MAC16.O[15] LocalMux.I
SB_MAC16.O[15] Odrv12.I
SB_MAC16.O[15] Odrv4.I
SB_MAC16.O[16] LocalMux.I
SB_MAC16.O[16] Odrv12.I
SB_MAC16.O[16] Odrv4.I
SB_MAC16.O[17] LocalMux.I
SB_MAC16.O[17] Odrv12.I
SB_MAC16.O[17] Odrv4.I
SB_MAC16.O[18] Odrv12.I
SB_MAC16.O[18] Odrv4.I
SB_MAC16.O[19] Odrv12.I
SB_MAC16.O[19] Odrv4.I
SB_MAC16.O[1] LocalMux.I
SB_MAC16.O[1] Odrv12.I
SB_MAC16.O[1] Odrv4.I
SB_MAC16.O[20] Odrv12.I
SB_MAC16.O[20] Odrv4.I
SB_MAC16.O[21] LocalMux.I
SB_MAC16.O[21] Odrv12.I
SB_MAC16.O[21] Odrv4.I
SB_MAC16.O[22] Odrv12.I
SB_MAC16.O[22] Odrv4.I
SB_MAC16.O[23] LocalMux.I
SB_MAC16.O[23] Odrv12.I
SB_MAC16.O[23] Odrv4.I
SB_MAC16.O[24] LocalMux.I
SB_MAC16.O[24] Odrv12.I
SB_MAC16.O[24] Odrv4.I
SB_MAC16.O[25] LocalMux.I
SB_MAC16.O[25] Odrv12.I
SB_MAC16.O[25] Odrv4.I
SB_MAC16.O[26] Odrv12.I
SB_MAC16.O[26] Odrv4.I
SB_MAC16.O[27] Odrv12.I
SB_MAC16.O[27] Odrv4.I
SB_MAC16.O[28] Odrv12.I
SB_MAC16.O[28] Odrv4.I
SB_MAC16.O[29] Odrv12.I
SB_MAC16.O[29] Odrv4.I
SB_MAC16.O[2] LocalMux.I
SB_MAC16.O[2] Odrv12.I
SB_MAC16.O[2] Odrv4.I
SB_MAC16.O[30] Odrv12.I
SB_MAC16.O[30] Odrv4.I
SB_MAC16.O[31] LocalMux.I
SB_MAC16.O[31] Odrv12.I
SB_MAC16.O[31] Odrv4.I
SB_MAC16.O[3] LocalMux.I
SB_MAC16.O[3] Odrv12.I
SB_MAC16.O[3] Odrv4.I
SB_MAC16.O[4] LocalMux.I
SB_MAC16.O[4] Odrv12.I
SB_MAC16.O[4] Odrv4.I
SB_MAC16.O[5] LocalMux.I
SB_MAC16.O[5] Odrv12.I
SB_MAC16.O[5] Odrv4.I
SB_MAC16.O[6] LocalMux.I
SB_MAC16.O[6] Odrv12.I
SB_MAC16.O[6] Odrv4.I
SB_MAC16.O[7] LocalMux.I
SB_MAC16.O[7] Odrv12.I
SB_MAC16.O[7] Odrv4.I
SB_MAC16.O[8] LocalMux.I
SB_MAC16.O[8] Odrv12.I
SB_MAC16.O[8] Odrv4.I
SB_MAC16.O[9] LocalMux.I
SB_MAC16.O[9] Odrv12.I
SB_MAC16.O[9] Odrv4.I
SB_MAC16.SIGNEXTOUT SB_MAC16.SIGNEXTIN
SB_PLL40_2F_CORE.LOCK LocalMux.I
SB_PLL40_2F_CORE.PLLOUTCOREA LocalMux.I
SB_PLL40_2F_CORE.PLLOUTCOREA Odrv12.I
@ -336,6 +581,10 @@ SB_RAM40_4K.RDATA[9] LocalMux.I
SB_RAM40_4K.RDATA[9] Odrv12.I
SB_RAM40_4K.RDATA[9] Odrv4.I
SRMux.O LogicCell40.sr
SRMux.O SB_MAC16.IRSTBOT
SRMux.O SB_MAC16.IRSTTOP
SRMux.O SB_MAC16.ORSTBOT
SRMux.O SB_MAC16.ORSTTOP
SRMux.O SB_RAM40_4K.RE
SRMux.O SB_RAM40_4K.WE
Sp12to4.O IoSpan4Mux.I
@ -610,6 +859,7 @@ Span12Mux_s9_v.O Span12Mux_s11_h.I
Span12Mux_s9_v.O Span12Mux_s5_h.I
Span12Mux_s9_v.O Span12Mux_s6_v.I
Span12Mux_s9_v.O Span12Mux_s7_h.I
Span12Mux_s9_v.O Span12Mux_s9_h.I
Span12Mux_s9_v.O Span12Mux_v.I
Span12Mux_v.O LocalMux.I
Span12Mux_v.O Sp12to4.I

View File

@ -9,8 +9,19 @@ hierarchy -generate PRE_IO o:PADOEN o:PADOUT i:PADIN i:CLOCKENABLE o:DIN0 o:DIN1
hierarchy -generate *PLL40* i:PACKAGEPIN i:BYPASS i:DYNAMICDELAY i:EXTFEEDBACK i:LATCHINPUTVALUE \
o:LOCK o:PLLOUT* i:REFERENCECLK i:RESETB i:SCLK i:SDI o:SDO i:PLLIN
hierarchy -generate SB_RAM40_4K o:RDATA i:RADDR i:WADDR i:MASK i:WDATA i:RCLKE i:RCLK i:RE i:WCLKE i:WCLK i:WE
hierarchy -generate SB_MAC16 i:CLK i:CE i:C i:A i:B i:D i:AHOLD i:BHOLD i:CHOLD i:DHOLD i:IRSTTOP i:IRSTBOT \
i:ORSTTOP i:ORSTBOT i:OLOADTOP i:OLOADBOT i:ADDSUBTOP i:ADDSUBBOT i:OHOLDTOP i:OHOLDBOT i:CI i:ACCUMCI \
i:SIGNEXTIN o:O o:CO o:ACCUMCO o:SIGNEXTOUT
hierarchy -generate SB_SPRAM256KA i:ADDRESS i:DATAIN i:MASKWREN i:WREN i:CHIPSELECT i:CLOCK i:STANDBY i:SLEEP \
i:POWEROFF i:DATAOUT
hierarchy -generate SB_RGBA_DRV i:CURREN i:RGBLEDEN i:RGB*PWM o:RGB*
hierarchy -generate SB_LFOSC i:CLKLFPU i:CLKLFEN o:CLKLF
hierarchy -generate SB_HFOSC i:CLKHFPU i:CLKHFEN o:CLKHF
hierarchy -generate SB_LEDDA_IP i:LEDDCS i:LEDDCLK i:LEDDDAT* i:LEDDADDR* i:LEDDDEN i:LEDDEXE i:LEDDRST o:PWMOUT* o:LEDDON
hierarchy -generate ICE_CARRY_IN_MUX i:*in o:*out
hierarchy -generate *Mux* i:I o:O
hierarchy -generate DummyBuf i:I o:O
hierarchy -generate Odrv* i:I o:O
hierarchy -generate Sp12to4 i:I o:O
hierarchy -generate INV i:I o:O

View File

@ -9,7 +9,7 @@ endif
all: icetime$(EXE)
ifeq ($(EXE),.js)
icetime$(EXE): | share/$(CHIPDB_SUBDIR)/chipdb-384.txt share/$(CHIPDB_SUBDIR)/chipdb-1k.txt share/$(CHIPDB_SUBDIR)/chipdb-8k.txt
icetime$(EXE): | share/$(CHIPDB_SUBDIR)/chipdb-384.txt share/$(CHIPDB_SUBDIR)/chipdb-1k.txt share/$(CHIPDB_SUBDIR)/chipdb-8k.txt share/$(CHIPDB_SUBDIR)/chipdb-5k.txt
share/$(CHIPDB_SUBDIR)/chipdb-384.txt: ../icebox/chipdb-384.txt
mkdir -p share/$(CHIPDB_SUBDIR)
@ -20,7 +20,9 @@ share/$(CHIPDB_SUBDIR)/chipdb-1k.txt: ../icebox/chipdb-1k.txt
share/$(CHIPDB_SUBDIR)/chipdb-8k.txt: ../icebox/chipdb-8k.txt
mkdir -p share/$(CHIPDB_SUBDIR)
cp $< $@
share/$(CHIPDB_SUBDIR)/chipdb-5k.txt: ../icebox/chipdb-5k.txt
mkdir -p share/$(CHIPDB_SUBDIR)
cp $< $@
override LDFLAGS += --embed-file share
endif

View File

@ -231,7 +231,10 @@ void read_config()
config_device = strtok(nullptr, " \t\r\n");
} else
if (!strcmp(tok, ".io_tile") || !strcmp(tok, ".logic_tile") ||
!strcmp(tok, ".ramb_tile") || !strcmp(tok, ".ramt_tile"))
!strcmp(tok, ".ramb_tile") || !strcmp(tok, ".ramt_tile") ||
!strcmp(tok, ".ipcon_tile") || !strcmp(tok, ".dsp0_tile") ||
!strcmp(tok, ".dsp1_tile") || !strcmp(tok, ".dsp2_tile") ||
!strcmp(tok, ".dsp3_tile"))
{
line_nr = 0;
tile_x = atoi(strtok(nullptr, " \t\r\n"));
@ -255,6 +258,16 @@ void read_config()
config_tile_type.at(tile_x).at(tile_y) = "ramb";
if (!strcmp(tok, ".ramt_tile"))
config_tile_type.at(tile_x).at(tile_y) = "ramt";
if (!strcmp(tok, ".dsp0_tile"))
config_tile_type.at(tile_x).at(tile_y) = "dsp0";
if (!strcmp(tok, ".dsp1_tile"))
config_tile_type.at(tile_x).at(tile_y) = "dsp1";
if (!strcmp(tok, ".dsp2_tile"))
config_tile_type.at(tile_x).at(tile_y) = "dsp2";
if (!strcmp(tok, ".dsp3_tile"))
config_tile_type.at(tile_x).at(tile_y) = "dsp3";
if (!strcmp(tok, ".ipcon_tile"))
config_tile_type.at(tile_x).at(tile_y) = "ipcon";
} else
if (!strcmp(tok, ".extra_bit")) {
int b = atoi(strtok(nullptr, " \t\r\n"));
@ -666,7 +679,9 @@ double get_delay(std::string cell_type, std::string in_port, std::string out_por
if (device_type == "hx8k")
return get_delay_hx8k(cell_type, in_port, out_port);
if (device_type == "up5k")
return get_delay_up5k(cell_type, in_port, out_port);
fprintf(stderr, "No built-in timing database for '%s' devices!\n", device_type.c_str());
exit(1);
}
@ -1077,7 +1092,7 @@ std::string make_seg_pre_io(int x, int y, int z)
std::string make_lc40(int x, int y, int z)
{
assert(0 < x && 0 < y && 0 <= z && z < 8);
assert(0 <= x && 0 < y && 0 <= z && z < 8);
auto cell = stringf("lc40_%d_%d_%d", x, y, z);
@ -1884,7 +1899,7 @@ void help(const char *cmd)
printf(" -j <output_file>\n");
printf(" write timing report in json format to the file\n");
printf("\n");
printf(" -d lp384|lp1k|hx1k|lp8k|hx8k\n");
printf(" -d lp384|lp1k|hx1k|lp8k|hx8k|up5k\n");
printf(" select the device type (default = lp variant)\n");
printf("\n");
printf(" -C <chipdb-file>\n");
@ -2025,6 +2040,10 @@ int main(int argc, char **argv)
if (device_type == "lp8k" || device_type == "hx8k") {
if (config_device != "8k")
goto device_chip_mismatch;
} else
if (device_type == "up5k") {
if (config_device != "5k")
goto device_chip_mismatch;
} else {
fprintf(stderr, "Error: Invalid device type '%s'.\n", device_type.c_str());
exit(1);

View File

@ -41,7 +41,7 @@ def timings_to_c(chip, f):
print(" exit(1);")
print("}")
for db in "lp384 lp1k lp8k hx1k hx8k".split():
for db in "lp384 lp1k lp8k hx1k hx8k up5k".split():
with open("../icefuzz/timings_%s.txt" % db, "r") as f:
timings_to_c(db, f);