Review issues addressed

This commit is contained in:
Miodrag Milanovic 2024-07-03 17:00:24 +02:00
parent 438b6af40d
commit 69ad2b87f0
4 changed files with 508 additions and 454 deletions

View File

@ -0,0 +1,451 @@
/*
* nextpnr -- Next Generation Place and Route
*
* Copyright (C) 2024 Miodrag Milanovic <micko@yosyshq.com>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
*/
#include "location_map.h"
NEXTPNR_NAMESPACE_BEGIN
const Loc ng_ultra_place_cy_map[24] = {
{ 0, 1, 0 }, // S1 0 -> S2 0 CY24->CY1
{ 0, 0, -1 }, // S1 1 -> S1 0 CY23->CY24
{ 0, 0, -1 }, // S1 2 -> S1 1 CY22->CY23
{ 0, 0, -1 }, // S1 3 -> S1 2 CY21->CY22
{-1, 0,+3}, // S5 0 -> S1 1 CY20->CY21
{0, 0, -1}, // S5 1 -> S5 0 CY19->CY20
{0, 0, -1}, // S5 2 -> S5 1 CY18->CY19
{0, 0, -1}, // S5 3 -> S5 2 CY17->CY18
{-1, 0,+3}, // S9 0 -> S5 1 CY16->CY17
{0, 0, -1}, // S9 1 -> S9 0 CY15->CY16
{0, 0, -1}, // S9 2 -> S9 1 CY14->CY15
{0, 0, -1}, // S9 3 -> S9 2 CY13->CY14
{0, 0, +1}, // S2 0 -> S2 1 CY1->CY2
{0, 0, +1}, // S2 1 -> S2 2 CY2->CY3
{0, 0, +1}, // S2 2 -> S2 3 CY3->CY4
{1, 0, -3}, // S2 3 -> S6 0 CY4->CY5
{0, 0, +1}, // S6 0 -> S6 1 CY5->CY6
{0, 0, +1}, // S6 1 -> S6 2 CY6->CY7
{0, 0, +1}, // S6 2 -> S6 3 CY7->CY8
{1, 0, -3}, // S6 3 -> S10 0 CY8->CY9
{0, 0, +1}, // S10 0 -> S10 1 CY9->CY10
{0, 0, +1}, // S10 1 -> S10 2 CY10->CY11
{0, 0, +1}, // S10 2 -> S10 3 CY11->CY12
{0,-1, 0}, // S10 3 -> S9 3 CY12->CY13
};
const Loc ng_ultra_place_xrf[] =
{
{-1, 0, 1},// I/O1
{-1, 0, 2},// I/O2
{-1, 0, 5},// I/O3
{-1, 0, 6},// I/O4
{-1, 0, 7},// I/O5
{-1, 0, 9},// I/O6
{-1, 0, 10},// I/O7
{-1, 0, 13},// I/O8
{-1, 0, 14},// I/O9
{-1, 0, 15},// I/O10
{-1, 0, 16},// I/O11
{-1, 0, 17},// I/O12
{-1, 0, 18},// I/O13
{-1, 0, 21},// I/O14
{-1, 0, 24},// I/O15
{-1, 0, 25},// I/O16
{-1, 0, 26},// I/O17
{-1, 0, 29},// I/O18
{+1, 0, 1},// I/O19
{+1, 0, 2},// I/O20
{+1, 0, 5},// I/O21
{+1, 0, 6},// I/O22
{+1, 0, 7},// I/O23
{+1, 0, 9},// I/O24
{+1, 0, 10},// I/O25
{+1, 0, 13},// I/O26
{+1, 0, 14},// I/O27
{+1, 0, 15},// I/O28
{+1, 0, 16},// I/O29
{+1, 0, 17},// I/O30
{+1, 0, 18},// I/O31
{+1, 0, 21},// I/O32
{+1, 0, 24},// I/O33
{+1, 0, 25},// I/O34
{+1, 0, 26},// I/O35
{+1, 0, 29},// I/O36
{-1, 0, 4},// RA1
{-1, 0, 12},// RA2
{-1, 0, 20},// RA3
{-1, 0, 27},// RA4
{-1, 0, 31},// RA5
{+1, 0, 4},// RA6
{+1, 0, 12},// RA7
{+1, 0, 20},// RA8
{+1, 0, 27},// RA9
{+1, 0, 31},// RA10
{-1, 0, 3},// WA1
{-1, 0, 11},// WA2
{-1, 0, 19},// WA3
{-1, 0, 23},// WA4
{-1, 0, 28},// WA5
{+1, 0, 3},// WA6
{-1, 0, 0},// WE
{-1, 0, 8},// WEA
};
const Loc ng_ultra_place_cdc1[] =
{
{+1, 0, 1}, // AI1
{+1, 0, 2}, // AI2
{+1, 0, 9}, // AI3
{+1, 0, 17},// AI4
{+1, 0, 18},// AI5
{+1, 0, 25},// AI6
{+1, 0, 3}, // BI1
{+1, 0, 10},// BI2
{+1, 0, 11},// BI3
{+1, 0, 19},// BI4
{+1, 0, 26},// BI5
{+1, 0, 27},// BI6
{ 0, 0, 22},// ASRSTI
{ 0, 0, 30},// ADRSTI
{+1, 0, 24},// BSRSTI
{+1, 0, 8}, // BDRSTI
};
const Loc ng_ultra_place_cdc2[] =
{
{-1, 0, 4}, // AI1
{-1, 0, 5}, // AI2
{-1, 0, 12},// AI3
{-1, 0, 20},// AI4
{-1, 0, 21},// AI5
{-1, 0, 28},// AI6
{-1, 0, 6}, // BI1
{-1, 0, 13},// BI2
{-1, 0, 14},// BI3
{-1, 0, 22},// BI4
{-1, 0, 29},// BI5
{-1, 0, 30},// BI6
{ 0, 0, 22},// ASRSTI
{ 0, 0, 30},// ADRSTI
{-1, 0, 23},// BSRSTI
{-1, 0, 7}, // BDRSTI
};
const Loc ng_ultra_place_xcdc[] =
{
{ 0, 0, 1}, // AI1
{ 0, 0, 2}, // AI2
{ 0, 0, 9}, // AI3
{ 0, 0, 17},// AI4
{ 0, 0, 18},// AI5
{ 0, 0, 25},// AI6
{ 0, 0, 4}, // BI1
{ 0, 0, 5}, // BI2
{ 0, 0, 12},// BI3
{ 0, 0, 20},// BI4
{ 0, 0, 21},// BI5
{ 0, 0, 28},// BI6
{-1, 0, 22},// ASRSTI
{-1, 0, 30},// ADRSTI
{+1, 0, 22},// BSRSTI
{+1, 0, 30},// BDRSTI
{ 0, 0, 3}, // CI1
{ 0, 0, 10},// CI2
{ 0, 0, 11},// CI3
{ 0, 0, 19},// CI4
{ 0, 0, 26},// CI5
{ 0, 0, 27},// CI6
{ 0, 0, 6}, // DI1
{ 0, 0, 13},// DI2
{ 0, 0, 14},// DI3
{ 0, 0, 22},// DI4
{ 0, 0, 29},// DI5
{ 0, 0, 30},// DI6
{ 0, 0, 24},// CSRSTI
{ 0, 0, 8}, // CDRSTI
{ 0, 0, 23},// DSRSTI
{ 0, 0, 7}, // DDRSTI
};
const Loc ng_ultra_place_fifo1[] =
{
{-1, 0, 1}, // I/O1
{-1, 0, 2}, // I/O2
{-1, 0, 5}, // I/O3
{-1, 0, 6}, // I/O4
{-1, 0, 7}, // I/O5
{-1, 0, 9}, // I/O6
{-1, 0, 10},// I/O7
{-1, 0, 13},// I/O8
{-1, 0, 14},// I/O9
{-1, 0, 15},// I/O10
{-1, 0, 16},// I/O11
{-1, 0, 17},// I/O12
{-1, 0, 18},// I/O13
{-1, 0, 21},// I/O14
{-1, 0, 24},// I/O15
{-1, 0, 25},// I/O16
{-1, 0, 26},// I/O17
{-1, 0, 29},// I/O18
{ 0, 0, 0},// I/O19
{ 0, 0, 0},// I/O20
{ 0, 0, 0},// I/O21
{ 0, 0, 0},// I/O22
{ 0, 0, 0},// I/O23
{ 0, 0, 0},// I/O24
{ 0, 0, 0},// I/O25
{ 0, 0, 0},// I/O26
{ 0, 0, 0},// I/O27
{ 0, 0, 0},// I/O28
{ 0, 0, 0},// I/O29
{ 0, 0, 0},// I/O30
{ 0, 0, 0},// I/O31
{ 0, 0, 0},// I/O32
{ 0, 0, 0},// I/O33
{ 0, 0, 0},// I/O34
{ 0, 0, 0},// I/O35
{ 0, 0, 0},// I/O36
{ 0, 0, 3}, // RAI1/RAO1
{ 0, 0, 10},// RAI2/RAO2
{ 0, 0, 11},// RAI3/RAO3
{ 0, 0, 19},// RAI4/RAO4
{ 0, 0, 26},// RAI5/RAO5
{ 0, 0, 27},// RAI6/RAO6
{ 0, 0, 0},// RAI7/RAO7
{ 0, 0, 1}, // WAI1/WAO1
{ 0, 0, 2}, // WAI2/WAO2
{ 0, 0, 9}, // WAI3/WAO3
{ 0, 0, 17},// WAI4/WAO4
{ 0, 0, 18},// WAI5/WAO5
{ 0, 0, 25},// WAI6/WAO6
{ 0, 0, 0},// WAI7/WAO7
{-1, 0, 0}, // WE
{-1, 0, 8}, // WEA
{-1, 0, 22},// WRSTI1/WRSTO
{-1, 0, 30},// RRSTI1/RRSTO
{ 0, 0, 8}, // WRSTI2
{ 0, 0, 24},// RRSTI2
{ 0, 0, 0}, // WRSTI3/WRSTO
{ 0, 0, 0}, // RRSTI3/RRSTO
{ 0, 0, 0}, // WRSTI4
{ 0, 0, 0}, // RRSTI4
{-1, 0, 3}, // WEQ
{-1, 0, 4}, // REQ
// {-1, 0, 11}, WEQ
// {-1, 0, 12}, REQ
// {-1, 0, 19}, WEQ
// {-1, 0, 20}, REQ
// {-1, 0, 27}, WEQ
// {-1, 0, 28}, REQ
{ 0, 0, 0}, // WEQ2
{ 0, 0, 0}, // REQ2
};
const Loc ng_ultra_place_fifo2[] =
{
{+1, 0, 1}, // I/O1
{+1, 0, 2}, // I/O2
{+1, 0, 5}, // I/O3
{+1, 0, 6}, // I/O4
{+1, 0, 7}, // I/O5
{+1, 0, 9}, // I/O6
{+1, 0, 10},// I/O7
{+1, 0, 13},// I/O8
{+1, 0, 14},// I/O9
{+1, 0, 15},// I/O10
{+1, 0, 16},// I/O11
{+1, 0, 17},// I/O12
{+1, 0, 18},// I/O13
{+1, 0, 21},// I/O14
{+1, 0, 24},// I/O15
{+1, 0, 25},// I/O16
{+1, 0, 26},// I/O17
{+1, 0, 29},// I/O18
{ 0, 0, 0},// I/O19
{ 0, 0, 0},// I/O20
{ 0, 0, 0},// I/O21
{ 0, 0, 0},// I/O22
{ 0, 0, 0},// I/O23
{ 0, 0, 0},// I/O24
{ 0, 0, 0},// I/O25
{ 0, 0, 0},// I/O26
{ 0, 0, 0},// I/O27
{ 0, 0, 0},// I/O28
{ 0, 0, 0},// I/O29
{ 0, 0, 0},// I/O30
{ 0, 0, 0},// I/O31
{ 0, 0, 0},// I/O32
{ 0, 0, 0},// I/O33
{ 0, 0, 0},// I/O34
{ 0, 0, 0},// I/O35
{ 0, 0, 0},// I/O36
{ 0, 0, 6}, // RAI1/RAO1
{ 0, 0, 13},// RAI2/RAO2
{ 0, 0, 14},// RAI3/RAO3
{ 0, 0, 22},// RAI4/RAO4
{ 0, 0, 29},// RAI5/RAO5
{ 0, 0, 30},// RAI6/RAO6
{ 0, 0, 0},// RAI7/RAO7
{ 0, 0, 4}, // WAI1/WAO1
{ 0, 0, 5}, // WAI2/WAO2
{ 0, 0, 12},// WAI3/WAO3
{ 0, 0, 20},// WAI4/WAO4
{ 0, 0, 21},// WAI5/WAO5
{ 0, 0, 28},// WAI6/WAO6
{ 0, 0, 0},// WAI7/WAO7
{+1, 0, 0}, // WE
{+1, 0, 8}, // WEA
{+1, 0, 22},// WRSTI1/WRSTO
{+1, 0, 30},// RRSTI1/RRSTO
{ 0, 0, 7}, // WRSTI2
{ 0, 0, 23},// RRSTI2
{ 0, 0, 0}, // WRSTI3/WRSTO
{ 0, 0, 0}, // RRSTI3/RRSTO
{ 0, 0, 0}, // WRSTI4
{ 0, 0, 0}, // RRSTI4
{+1, 0, 3}, // WEQ
{+1, 0, 4}, // REQ
// {+1, 0, 11}, WEQ
// {+1, 0, 12}, REQ
// {+1, 0, 19}, WEQ
// {+1, 0, 20}, REQ
// {+1, 0, 27}, WEQ
// {+1, 0, 28}, REQ
{ 0, 0, 0}, // WEQ2
{ 0, 0, 0}, // REQ2
};
const Loc ng_ultra_place_xfifo[] =
{
{-1, 0, 1}, // I/O1
{-1, 0, 2}, // I/O2
{-1, 0, 5}, // I/O3
{-1, 0, 6}, // I/O4
{-1, 0, 7}, // I/O5
{-1, 0, 9}, // I/O6
{-1, 0, 10},// I/O7
{-1, 0, 13},// I/O8
{-1, 0, 14},// I/O9
{-1, 0, 15},// I/O10
{-1, 0, 16},// I/O11
{-1, 0, 17},// I/O12
{-1, 0, 18},// I/O13
{-1, 0, 21},// I/O14
{-1, 0, 24},// I/O15
{-1, 0, 25},// I/O16
{-1, 0, 26},// I/O17
{-1, 0, 29},// I/O18
{+1, 0, 1}, // I/O19
{+1, 0, 2}, // I/O20
{+1, 0, 5}, // I/O21
{+1, 0, 6}, // I/O22
{+1, 0, 7}, // I/O23
{+1, 0, 9}, // I/O24
{+1, 0, 10},// I/O25
{+1, 0, 13},// I/O26
{+1, 0, 14},// I/O27
{+1, 0, 15},// I/O28
{+1, 0, 16},// I/O29
{+1, 0, 17},// I/O30
{+1, 0, 18},// I/O31
{+1, 0, 21},// I/O32
{+1, 0, 24},// I/O33
{+1, 0, 25},// I/O34
{+1, 0, 26},// I/O35
{+1, 0, 29},// I/O36
{ 0, 0, 3}, // RAI1/RAO1
{ 0, 0, 10},// RAI2/RAO2
{ 0, 0, 11},// RAI3/RAO3
{ 0, 0, 19},// RAI4/RAO4
{ 0, 0, 26},// RAI5/RAO5
{ 0, 0, 27},// RAI6/RAO6
{ 0, 0, 6}, // RAI7/RAO7
{ 0, 0, 1}, // WAI1/WAO1
{ 0, 0, 2}, // WAI2/WAO2
{ 0, 0, 9}, // WAI3/WAO3
{ 0, 0, 17},// WAI4/WAO4
{ 0, 0, 18},// WAI5/WAO5
{ 0, 0, 25},// WAI6/WAO6
{ 0, 0, 4}, // WAI7/WAO7
{-1, 0, 0}, // WE
{-1, 0, 8}, // WEA
{-1, 0, 22},// WRSTI1/WRSTO
{-1, 0, 30},// RRSTI1/RRSTO
{ 0, 0, 8}, // WRSTI2
{ 0, 0, 24},// RRSTI2
{+1, 0, 22},// WRSTI3/WRSTO
{+1, 0, 30},// RRSTI3/RRSTO
{ 0, 0, 7}, // WRSTI4
{ 0, 0, 23},// RRSTI4
{-1, 0, 3}, // WEQ1
{-1, 0, 4}, // REQ1
// {-1, 0, 11}, WEQ1
// {-1, 0, 12}, REQ1
// {-1, 0, 19}, WEQ1
// {-1, 0, 20}, REQ1
// {-1, 0, 27}, WEQ1
// {-1, 0, 28}, REQ1
{+1, 0, 3}, // WEQ2
{+1, 0, 4}, // REQ2
// {+1, 0, 11}, WEQ2
// {+1, 0, 12}, REQ2
// {+1, 0, 19}, WEQ2
// {+1, 0, 20}, REQ2
// {+1, 0, 27}, WEQ2
// {+1, 0, 28}, REQ2
};
NEXTPNR_NAMESPACE_END

View File

@ -0,0 +1,37 @@
/*
* nextpnr -- Next Generation Place and Route
*
* Copyright (C) 2024 Miodrag Milanovic <micko@yosyshq.com>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
*/
#include "nextpnr.h"
#ifndef NG_ULTRA_LOCATION_MAP_H
#define NG_ULTRA_LOCATION_MAP_H
NEXTPNR_NAMESPACE_BEGIN
extern const Loc ng_ultra_place_cy_map[];
extern const Loc ng_ultra_place_xrf[];
extern const Loc ng_ultra_place_cdc1[];
extern const Loc ng_ultra_place_cdc2[];
extern const Loc ng_ultra_place_xcdc[];
extern const Loc ng_ultra_place_fifo1[];
extern const Loc ng_ultra_place_fifo2[];
extern const Loc ng_ultra_place_xfifo[];
NEXTPNR_NAMESPACE_END
#endif

View File

@ -32,6 +32,7 @@
#include "himbaechel_helpers.h"
#include "ng_ultra.h"
#include "location_map.h"
#define GEN_INIT_CONSTIDS
#define HIMBAECHEL_CONSTIDS "uarch/ng-ultra/constids.inc"
@ -595,40 +596,8 @@ Loc getNextLocInDSPChain(const NgUltraImpl *impl, Loc loc)
Loc getNextLocInCYChain(Loc loc)
{
static const std::vector<Loc> map =
{
Loc(0, 1, 0), // S1 0 -> S2 0 CY24->CY1
Loc(0, 0, -1), // S1 1 -> S1 0 CY23->CY24
Loc(0, 0, -1), // S1 2 -> S1 1 CY22->CY23
Loc(0, 0, -1), // S1 3 -> S1 2 CY21->CY22
Loc(-1, 0,+3), // S5 0 -> S1 1 CY20->CY21
Loc(0, 0, -1), // S5 1 -> S5 0 CY19->CY20
Loc(0, 0, -1), // S5 2 -> S5 1 CY18->CY19
Loc(0, 0, -1), // S5 3 -> S5 2 CY17->CY18
Loc(-1, 0,+3), // S9 0 -> S5 1 CY16->CY17
Loc(0, 0, -1), // S9 1 -> S9 0 CY15->CY16
Loc(0, 0, -1), // S9 2 -> S9 1 CY14->CY15
Loc(0, 0, -1), // S9 3 -> S9 2 CY13->CY14
Loc(0, 0, +1), // S2 0 -> S2 1 CY1->CY2
Loc(0, 0, +1), // S2 1 -> S2 2 CY2->CY3
Loc(0, 0, +1), // S2 2 -> S2 3 CY3->CY4
Loc(1, 0, -3), // S2 3 -> S6 0 CY4->CY5
Loc(0, 0, +1), // S6 0 -> S6 1 CY5->CY6
Loc(0, 0, +1), // S6 1 -> S6 2 CY6->CY7
Loc(0, 0, +1), // S6 2 -> S6 3 CY7->CY8
Loc(1, 0, -3), // S6 3 -> S10 0 CY8->CY9
Loc(0, 0, +1), // S10 0 -> S10 1 CY9->CY10
Loc(0, 0, +1), // S10 1 -> S10 2 CY10->CY11
Loc(0, 0, +1), // S10 2 -> S10 3 CY11->CY12
Loc(0,-1, 0), // S10 3 -> S9 3 CY12->CY13
};
int section = (loc.x % 4 - 1 + 3 * (loc.y % 4)) * 4 + loc.z - BEL_CY_Z;
Loc result = map.at(section);
Loc result = ng_ultra_place_cy_map[section];
result.x += loc.x;
result.y += loc.y;
result.z += loc.z;
@ -657,72 +626,7 @@ Loc getXLUTFE(Loc root, int pos)
Loc getXRFFE(Loc root, int pos)
{
static const std::vector<Loc> map =
{
Loc(-1, 0, 1),// I/O1
Loc(-1, 0, 2),// I/O2
Loc(-1, 0, 5),// I/O3
Loc(-1, 0, 6),// I/O4
Loc(-1, 0, 7),// I/O5
Loc(-1, 0, 9),// I/O6
Loc(-1, 0, 10),// I/O7
Loc(-1, 0, 13),// I/O8
Loc(-1, 0, 14),// I/O9
Loc(-1, 0, 15),// I/O10
Loc(-1, 0, 16),// I/O11
Loc(-1, 0, 17),// I/O12
Loc(-1, 0, 18),// I/O13
Loc(-1, 0, 21),// I/O14
Loc(-1, 0, 24),// I/O15
Loc(-1, 0, 25),// I/O16
Loc(-1, 0, 26),// I/O17
Loc(-1, 0, 29),// I/O18
Loc(+1, 0, 1),// I/O19
Loc(+1, 0, 2),// I/O20
Loc(+1, 0, 5),// I/O21
Loc(+1, 0, 6),// I/O22
Loc(+1, 0, 7),// I/O23
Loc(+1, 0, 9),// I/O24
Loc(+1, 0, 10),// I/O25
Loc(+1, 0, 13),// I/O26
Loc(+1, 0, 14),// I/O27
Loc(+1, 0, 15),// I/O28
Loc(+1, 0, 16),// I/O29
Loc(+1, 0, 17),// I/O30
Loc(+1, 0, 18),// I/O31
Loc(+1, 0, 21),// I/O32
Loc(+1, 0, 24),// I/O33
Loc(+1, 0, 25),// I/O34
Loc(+1, 0, 26),// I/O35
Loc(+1, 0, 29),// I/O36
Loc(-1, 0, 4),// RA1
Loc(-1, 0, 12),// RA2
Loc(-1, 0, 20),// RA3
Loc(-1, 0, 27),// RA4
Loc(-1, 0, 31),// RA5
Loc(+1, 0, 4),// RA6
Loc(+1, 0, 12),// RA7
Loc(+1, 0, 20),// RA8
Loc(+1, 0, 27),// RA9
Loc(+1, 0, 31),// RA10
Loc(-1, 0, 3),// WA1
Loc(-1, 0, 11),// WA2
Loc(-1, 0, 19),// WA3
Loc(-1, 0, 23),// WA4
Loc(-1, 0, 28),// WA5
Loc(+1, 0, 3),// WA6
Loc(-1, 0, 0),// WE
Loc(-1, 0, 8),// WEA
};
Loc result = map.at(pos);
Loc result = ng_ultra_place_xrf[pos];
if (root.z == BEL_XRF_Z) {
// XRF1
result.x += root.x;
@ -736,98 +640,13 @@ Loc getXRFFE(Loc root, int pos)
Loc getCDCFE(Loc root, int pos)
{
static const std::vector<Loc> cdc1 =
{
Loc(+1, 0, 1), // AI1
Loc(+1, 0, 2), // AI2
Loc(+1, 0, 9), // AI3
Loc(+1, 0, 17),// AI4
Loc(+1, 0, 18),// AI5
Loc(+1, 0, 25),// AI6
Loc(+1, 0, 3), // BI1
Loc(+1, 0, 10),// BI2
Loc(+1, 0, 11),// BI3
Loc(+1, 0, 19),// BI4
Loc(+1, 0, 26),// BI5
Loc(+1, 0, 27),// BI6
Loc( 0, 0, 22),// ASRSTI
Loc( 0, 0, 30),// ADRSTI
Loc(+1, 0, 24),// BSRSTI
Loc(+1, 0, 8), // BDRSTI
};
static const std::vector<Loc> cdc2 =
{
Loc(-1, 0, 4), // AI1
Loc(-1, 0, 5), // AI2
Loc(-1, 0, 12),// AI3
Loc(-1, 0, 20),// AI4
Loc(-1, 0, 21),// AI5
Loc(-1, 0, 28),// AI6
Loc(-1, 0, 6), // BI1
Loc(-1, 0, 13),// BI2
Loc(-1, 0, 14),// BI3
Loc(-1, 0, 22),// BI4
Loc(-1, 0, 29),// BI5
Loc(-1, 0, 30),// BI6
Loc( 0, 0, 22),// ASRSTI
Loc( 0, 0, 30),// ADRSTI
Loc(-1, 0, 23),// BSRSTI
Loc(-1, 0, 7), // BDRSTI
};
static const std::vector<Loc> xcdc =
{
Loc( 0, 0, 1), // AI1
Loc( 0, 0, 2), // AI2
Loc( 0, 0, 9), // AI3
Loc( 0, 0, 17),// AI4
Loc( 0, 0, 18),// AI5
Loc( 0, 0, 25),// AI6
Loc( 0, 0, 4), // BI1
Loc( 0, 0, 5), // BI2
Loc( 0, 0, 12),// BI3
Loc( 0, 0, 20),// BI4
Loc( 0, 0, 21),// BI5
Loc( 0, 0, 28),// BI6
Loc(-1, 0, 22),// ASRSTI
Loc(-1, 0, 30),// ADRSTI
Loc(+1, 0, 22),// BSRSTI
Loc(+1, 0, 30),// BDRSTI
Loc( 0, 0, 3), // CI1
Loc( 0, 0, 10),// CI2
Loc( 0, 0, 11),// CI3
Loc( 0, 0, 19),// CI4
Loc( 0, 0, 26),// CI5
Loc( 0, 0, 27),// CI6
Loc( 0, 0, 6), // DI1
Loc( 0, 0, 13),// DI2
Loc( 0, 0, 14),// DI3
Loc( 0, 0, 22),// DI4
Loc( 0, 0, 29),// DI5
Loc( 0, 0, 30),// DI6
Loc( 0, 0, 24),// CSRSTI
Loc( 0, 0, 8), // CDRSTI
Loc( 0, 0, 23),// DSRSTI
Loc( 0, 0, 7), // DDRSTI
};
Loc result;
if (root.z == BEL_CDC_Z) {
result = cdc1.at(pos);
result = ng_ultra_place_cdc1[pos];
} else if (root.z == BEL_CDC_Z+1) {
result = cdc2.at(pos);
result = ng_ultra_place_cdc2[pos];
} else if (root.z == BEL_XCDC_Z) {
result = xcdc.at(pos);
result = ng_ultra_place_xcdc[pos];
} else {
log_error("Trying to place CDC on wrong location.\n");
}
@ -838,257 +657,13 @@ Loc getCDCFE(Loc root, int pos)
Loc getFIFOFE(Loc root, int pos)
{
static const std::vector<Loc> fifo1 =
{
Loc(-1, 0, 1), // I/O1
Loc(-1, 0, 2), // I/O2
Loc(-1, 0, 5), // I/O3
Loc(-1, 0, 6), // I/O4
Loc(-1, 0, 7), // I/O5
Loc(-1, 0, 9), // I/O6
Loc(-1, 0, 10),// I/O7
Loc(-1, 0, 13),// I/O8
Loc(-1, 0, 14),// I/O9
Loc(-1, 0, 15),// I/O10
Loc(-1, 0, 16),// I/O11
Loc(-1, 0, 17),// I/O12
Loc(-1, 0, 18),// I/O13
Loc(-1, 0, 21),// I/O14
Loc(-1, 0, 24),// I/O15
Loc(-1, 0, 25),// I/O16
Loc(-1, 0, 26),// I/O17
Loc(-1, 0, 29),// I/O18
Loc( 0, 0, 0),// I/O19
Loc( 0, 0, 0),// I/O20
Loc( 0, 0, 0),// I/O21
Loc( 0, 0, 0),// I/O22
Loc( 0, 0, 0),// I/O23
Loc( 0, 0, 0),// I/O24
Loc( 0, 0, 0),// I/O25
Loc( 0, 0, 0),// I/O26
Loc( 0, 0, 0),// I/O27
Loc( 0, 0, 0),// I/O28
Loc( 0, 0, 0),// I/O29
Loc( 0, 0, 0),// I/O30
Loc( 0, 0, 0),// I/O31
Loc( 0, 0, 0),// I/O32
Loc( 0, 0, 0),// I/O33
Loc( 0, 0, 0),// I/O34
Loc( 0, 0, 0),// I/O35
Loc( 0, 0, 0),// I/O36
Loc( 0, 0, 3), // RAI1/RAO1
Loc( 0, 0, 10),// RAI2/RAO2
Loc( 0, 0, 11),// RAI3/RAO3
Loc( 0, 0, 19),// RAI4/RAO4
Loc( 0, 0, 26),// RAI5/RAO5
Loc( 0, 0, 27),// RAI6/RAO6
Loc( 0, 0, 0),// RAI7/RAO7
Loc( 0, 0, 1), // WAI1/WAO1
Loc( 0, 0, 2), // WAI2/WAO2
Loc( 0, 0, 9), // WAI3/WAO3
Loc( 0, 0, 17),// WAI4/WAO4
Loc( 0, 0, 18),// WAI5/WAO5
Loc( 0, 0, 25),// WAI6/WAO6
Loc( 0, 0, 0),// WAI7/WAO7
Loc(-1, 0, 0), // WE
Loc(-1, 0, 8), // WEA
Loc(-1, 0, 22),// WRSTI1/WRSTO
Loc(-1, 0, 30),// RRSTI1/RRSTO
Loc( 0, 0, 8), // WRSTI2
Loc( 0, 0, 24),// RRSTI2
Loc( 0, 0, 0), // WRSTI3/WRSTO
Loc( 0, 0, 0), // RRSTI3/RRSTO
Loc( 0, 0, 0), // WRSTI4
Loc( 0, 0, 0), // RRSTI4
Loc(-1, 0, 3), // WEQ
Loc(-1, 0, 4), // REQ
// Loc(-1, 0, 11), WEQ
// Loc(-1, 0, 12), REQ
// Loc(-1, 0, 19), WEQ
// Loc(-1, 0, 20), REQ
// Loc(-1, 0, 27), WEQ
// Loc(-1, 0, 28), REQ
Loc( 0, 0, 0), // WEQ2
Loc( 0, 0, 0), // REQ2
};
static const std::vector<Loc> fifo2 =
{
Loc(+1, 0, 1), // I/O1
Loc(+1, 0, 2), // I/O2
Loc(+1, 0, 5), // I/O3
Loc(+1, 0, 6), // I/O4
Loc(+1, 0, 7), // I/O5
Loc(+1, 0, 9), // I/O6
Loc(+1, 0, 10),// I/O7
Loc(+1, 0, 13),// I/O8
Loc(+1, 0, 14),// I/O9
Loc(+1, 0, 15),// I/O10
Loc(+1, 0, 16),// I/O11
Loc(+1, 0, 17),// I/O12
Loc(+1, 0, 18),// I/O13
Loc(+1, 0, 21),// I/O14
Loc(+1, 0, 24),// I/O15
Loc(+1, 0, 25),// I/O16
Loc(+1, 0, 26),// I/O17
Loc(+1, 0, 29),// I/O18
Loc( 0, 0, 0),// I/O19
Loc( 0, 0, 0),// I/O20
Loc( 0, 0, 0),// I/O21
Loc( 0, 0, 0),// I/O22
Loc( 0, 0, 0),// I/O23
Loc( 0, 0, 0),// I/O24
Loc( 0, 0, 0),// I/O25
Loc( 0, 0, 0),// I/O26
Loc( 0, 0, 0),// I/O27
Loc( 0, 0, 0),// I/O28
Loc( 0, 0, 0),// I/O29
Loc( 0, 0, 0),// I/O30
Loc( 0, 0, 0),// I/O31
Loc( 0, 0, 0),// I/O32
Loc( 0, 0, 0),// I/O33
Loc( 0, 0, 0),// I/O34
Loc( 0, 0, 0),// I/O35
Loc( 0, 0, 0),// I/O36
Loc( 0, 0, 6), // RAI1/RAO1
Loc( 0, 0, 13),// RAI2/RAO2
Loc( 0, 0, 14),// RAI3/RAO3
Loc( 0, 0, 22),// RAI4/RAO4
Loc( 0, 0, 29),// RAI5/RAO5
Loc( 0, 0, 30),// RAI6/RAO6
Loc( 0, 0, 0),// RAI7/RAO7
Loc( 0, 0, 4), // WAI1/WAO1
Loc( 0, 0, 5), // WAI2/WAO2
Loc( 0, 0, 12),// WAI3/WAO3
Loc( 0, 0, 20),// WAI4/WAO4
Loc( 0, 0, 21),// WAI5/WAO5
Loc( 0, 0, 28),// WAI6/WAO6
Loc( 0, 0, 0),// WAI7/WAO7
Loc(+1, 0, 0), // WE
Loc(+1, 0, 8), // WEA
Loc(+1, 0, 22),// WRSTI1/WRSTO
Loc(+1, 0, 30),// RRSTI1/RRSTO
Loc( 0, 0, 7), // WRSTI2
Loc( 0, 0, 23),// RRSTI2
Loc( 0, 0, 0), // WRSTI3/WRSTO
Loc( 0, 0, 0), // RRSTI3/RRSTO
Loc( 0, 0, 0), // WRSTI4
Loc( 0, 0, 0), // RRSTI4
Loc(+1, 0, 3), // WEQ
Loc(+1, 0, 4), // REQ
// Loc(+1, 0, 11), WEQ
// Loc(+1, 0, 12), REQ
// Loc(+1, 0, 19), WEQ
// Loc(+1, 0, 20), REQ
// Loc(+1, 0, 27), WEQ
// Loc(+1, 0, 28), REQ
Loc( 0, 0, 0), // WEQ2
Loc( 0, 0, 0), // REQ2
};
static const std::vector<Loc> xfifo =
{
Loc(-1, 0, 1), // I/O1
Loc(-1, 0, 2), // I/O2
Loc(-1, 0, 5), // I/O3
Loc(-1, 0, 6), // I/O4
Loc(-1, 0, 7), // I/O5
Loc(-1, 0, 9), // I/O6
Loc(-1, 0, 10),// I/O7
Loc(-1, 0, 13),// I/O8
Loc(-1, 0, 14),// I/O9
Loc(-1, 0, 15),// I/O10
Loc(-1, 0, 16),// I/O11
Loc(-1, 0, 17),// I/O12
Loc(-1, 0, 18),// I/O13
Loc(-1, 0, 21),// I/O14
Loc(-1, 0, 24),// I/O15
Loc(-1, 0, 25),// I/O16
Loc(-1, 0, 26),// I/O17
Loc(-1, 0, 29),// I/O18
Loc(+1, 0, 1), // I/O19
Loc(+1, 0, 2), // I/O20
Loc(+1, 0, 5), // I/O21
Loc(+1, 0, 6), // I/O22
Loc(+1, 0, 7), // I/O23
Loc(+1, 0, 9), // I/O24
Loc(+1, 0, 10),// I/O25
Loc(+1, 0, 13),// I/O26
Loc(+1, 0, 14),// I/O27
Loc(+1, 0, 15),// I/O28
Loc(+1, 0, 16),// I/O29
Loc(+1, 0, 17),// I/O30
Loc(+1, 0, 18),// I/O31
Loc(+1, 0, 21),// I/O32
Loc(+1, 0, 24),// I/O33
Loc(+1, 0, 25),// I/O34
Loc(+1, 0, 26),// I/O35
Loc(+1, 0, 29),// I/O36
Loc( 0, 0, 3), // RAI1/RAO1
Loc( 0, 0, 10),// RAI2/RAO2
Loc( 0, 0, 11),// RAI3/RAO3
Loc( 0, 0, 19),// RAI4/RAO4
Loc( 0, 0, 26),// RAI5/RAO5
Loc( 0, 0, 27),// RAI6/RAO6
Loc( 0, 0, 6), // RAI7/RAO7
Loc( 0, 0, 1), // WAI1/WAO1
Loc( 0, 0, 2), // WAI2/WAO2
Loc( 0, 0, 9), // WAI3/WAO3
Loc( 0, 0, 17),// WAI4/WAO4
Loc( 0, 0, 18),// WAI5/WAO5
Loc( 0, 0, 25),// WAI6/WAO6
Loc( 0, 0, 4), // WAI7/WAO7
Loc(-1, 0, 0), // WE
Loc(-1, 0, 8), // WEA
Loc(-1, 0, 22),// WRSTI1/WRSTO
Loc(-1, 0, 30),// RRSTI1/RRSTO
Loc( 0, 0, 8), // WRSTI2
Loc( 0, 0, 24),// RRSTI2
Loc(+1, 0, 22),// WRSTI3/WRSTO
Loc(+1, 0, 30),// RRSTI3/RRSTO
Loc( 0, 0, 7), // WRSTI4
Loc( 0, 0, 23),// RRSTI4
Loc(-1, 0, 3), // WEQ1
Loc(-1, 0, 4), // REQ1
// Loc(-1, 0, 11), WEQ1
// Loc(-1, 0, 12), REQ1
// Loc(-1, 0, 19), WEQ1
// Loc(-1, 0, 20), REQ1
// Loc(-1, 0, 27), WEQ1
// Loc(-1, 0, 28), REQ1
Loc(+1, 0, 3), // WEQ2
Loc(+1, 0, 4), // REQ2
// Loc(+1, 0, 11), WEQ2
// Loc(+1, 0, 12), REQ2
// Loc(+1, 0, 19), WEQ2
// Loc(+1, 0, 20), REQ2
// Loc(+1, 0, 27), WEQ2
// Loc(+1, 0, 28), REQ2
};
Loc result;
if (root.z == BEL_FIFO_Z) {
result = fifo1.at(pos);
result = ng_ultra_place_fifo1[pos];
} else if (root.z == BEL_FIFO_Z+1) {
result = fifo2.at(pos);
result = ng_ultra_place_fifo2[pos];
} else if (root.z == BEL_XFIFO_Z) {
result = xfifo.at(pos);
result = ng_ultra_place_xfifo[pos];
} else {
log_error("Trying to place CDC on wrong location.\n");
}

View File

@ -319,25 +319,16 @@ void NgUltraPacker::pack_xluts(void)
if (ci.cluster!=ClusterId())
continue;
CellInfo *lut[4];
if (!ci.getPort(id_I1))
continue;
if (!ci.getPort(id_I2))
continue;
if (!ci.getPort(id_I3))
continue;
if (!ci.getPort(id_I4))
continue;
lut[0] = net_driven_by(ctx, ci.getPort(id_I1), is_lut, id_O);
if (!lut[0] || ci.getPort(id_I1)->users.entries()!=1)
continue;
lut[1] = net_driven_by(ctx, ci.getPort(id_I2), is_lut, id_O);
if (!lut[1] || ci.getPort(id_I2)->users.entries()!=1)
continue;
lut[2] = net_driven_by(ctx, ci.getPort(id_I3), is_lut, id_O);
if (!lut[2] || ci.getPort(id_I3)->users.entries()!=1)
continue;
lut[3] = net_driven_by(ctx, ci.getPort(id_I4), is_lut, id_O);
if (!lut[3] || ci.getPort(id_I4)->users.entries()!=1)
int inputs_used = 0;
for(int i=0;i<4;i++) {
NetInfo *net = ci.getPort(ctx->idf("I%d",i+1));
if (!net)
continue;
lut[i] = net_driven_by(ctx, net, is_lut, id_O);
if (lut[i] && net->users.entries()==1)
inputs_used++;
}
if (inputs_used!=4)
continue;
ci.type = id_XLUT;