mirror of https://github.com/YosysHQ/abc.git
112 lines
2.8 KiB
C
112 lines
2.8 KiB
C
/*===================================================================*/
|
|
//
|
|
// place_inc.c
|
|
//
|
|
// Aaron P. Hurst, 2003-2007
|
|
// ahurst@eecs.berkeley.edu
|
|
//
|
|
/*===================================================================*/
|
|
|
|
#include <stdlib.h>
|
|
#include <limits.h>
|
|
#include <assert.h>
|
|
#include <string.h>
|
|
|
|
#include "place_base.h"
|
|
#include "place_gordian.h"
|
|
|
|
ABC_NAMESPACE_IMPL_START
|
|
|
|
|
|
inline int sqHashId(int id, int max) {
|
|
return ((id * (id+17)) % max);
|
|
}
|
|
|
|
#if 0
|
|
// --------------------------------------------------------------------
|
|
// fastPlace()
|
|
//
|
|
/// The first cell is assumed to be the "output".
|
|
// --------------------------------------------------------------------
|
|
float fastPlace(int numCells, ConcreteCell *cells[],
|
|
int numNets, ConcreteNet *nets[]) {
|
|
|
|
int n, t, c, i, local_id = 0, pass;
|
|
const int NUM_PASSES = 4;
|
|
int *cell_numTerms = calloc(numCells, sizeof(int));
|
|
ConcreteNet **cell_terms;
|
|
ConcreteNet *net;
|
|
Rect outputBox;
|
|
|
|
outputBox = getNetBBox(nets[0]);
|
|
|
|
// assign local ids
|
|
// put cells in reasonable initial location
|
|
for(n=0; n<numNets; n++)
|
|
for(t=0; nets[n]->m_numTerms; t++)
|
|
nets[n]->m_terms[t]->m_data = -1;
|
|
|
|
for(c=0; c<numCells; c++) {
|
|
cells[c]->m_data = local_id;
|
|
cells[c]->m_x = outputBox.x + 0.5*outputBox.w;
|
|
cells[c]->m_y = outputBox.y + 0.5*outputBox.h;
|
|
}
|
|
|
|
// build reverse map of cells to nets
|
|
for(n=0; n<numNets; n++)
|
|
for(t=0; nets[n]->m_numTerms; t++) {
|
|
local_id = nets[n]->m_terms[t]->m_data;
|
|
if (local_id >= 0)
|
|
cell_numTerms[local_id]++;
|
|
}
|
|
|
|
for(c=0; c<numCells; c++) {
|
|
cell_terms[c] = malloc(sizeof(ConcreteNet*)*cell_numTerms[c]);
|
|
cell_numTerms[c] = 0;
|
|
}
|
|
|
|
for(n=0; n<numNets; n++)
|
|
for(t=0; nets[n]->m_numTerms; t++) {
|
|
local_id = nets[n]->m_terms[t]->m_data;
|
|
if (local_id >= 0)
|
|
cell_terms[cell_numTerms[local_id]++] = nets[n];
|
|
}
|
|
|
|
// topological order?
|
|
|
|
// iterative linear
|
|
for(pass=0; pass<NUM_PASSES; pass++)
|
|
for(c=0; c<numCells; c++) {
|
|
for(n=0; n<cell_numTerms[c]; n++) {
|
|
net = cell_terms[c];
|
|
for(t=0; t<net->m_numTerms; t++);
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
// --------------------------------------------------------------------
|
|
// fastEstimate()
|
|
//
|
|
// --------------------------------------------------------------------
|
|
float fastEstimate(ConcreteCell *cell,
|
|
int numNets, ConcreteNet *nets[]) {
|
|
float len = 0;
|
|
int n;
|
|
Rect box;
|
|
|
|
assert(cell);
|
|
|
|
for(n=0; n<numNets; n++) {
|
|
box = getNetBBox(nets[n]);
|
|
if (cell->m_x < box.x) len += (box.x - cell->m_x);
|
|
if (cell->m_x > box.x+box.w) len += (cell->m_x-box.x-box.w);
|
|
if (cell->m_y < box.y) len += (box.x - cell->m_y);
|
|
if (cell->m_y > box.y+box.h) len += (cell->m_y-box.y-box.h);
|
|
}
|
|
|
|
return len;
|
|
}
|
|
ABC_NAMESPACE_IMPL_END
|
|
|