blob: cbad1922b9cc2fdc256bd7a8cde2c2a3f70fba05 [file] [log] [blame]
/*===================================================================*/
//
// place_base.h
//
// Aaron P. Hurst, 2003-2007
// ahurst@eecs.berkeley.edu
//
/*===================================================================*/
#if !defined(PLACE_BASE_H_)
#define ABC__phys__place__place_base_h
ABC_NAMESPACE_HEADER_START
// --------------------------------------------------------------------
// Data structures
//
// --------------------------------------------------------------------
// --- a C++ bool-like type
//typedef char bool;
#ifndef ABC__phys__place__place_base_h
#define bool int
#endif
#define true 1
#define false 0
// --- Rect - rectangle
typedef struct Rect {
float x, y;
float w, h;
} Rect;
// --- AbstractCell - a definition of a cell type
typedef struct AbstractCell {
char *m_label; // string description
float m_width, m_height; // dimensions
bool m_pad; // a pad (external I/O) cell?
} AbstractCell;
// --- ConcreteCell - a design object
typedef struct ConcreteCell {
int m_id; // a unique ID (see below)
char *m_label; // string description
AbstractCell *m_parent; // cell type
bool m_fixed; // position is fixed?
float m_x, m_y; // center of cell
int m_data;
} ConcreteCell;
// --- ConcreteNet - a design net
typedef struct ConcreteNet {
int m_id; // a unique ID (see below)
int m_numTerms; // num. of connected cells
ConcreteCell **m_terms; // connected cells
float m_weight; // relative weight
int m_data;
} ConcreteNet;
// A note about IDs - the IDs are non-nonegative integers. They need not
// be contiguous, but this is certainly a good idea, as they are stored
// in a non-sparse array.
// Cells and nets have separate ID spaces.
// --------------------------------------------------------------------
// Global variable prototypes
//
// --------------------------------------------------------------------
// NOTE: None of these need to be managed externally.
extern int g_place_numCells; // number of cells
extern int g_place_numNets; // number of nets
extern float g_place_rowHeight; // height of placement row
extern Rect g_place_coreBounds; // border of placeable area
// (x,y) = corner
extern Rect g_place_padBounds; // border of total die area
// (x,y) = corner
extern ConcreteCell **g_place_concreteCells; // all concrete cells
extern ConcreteNet **g_place_concreteNets; // all concrete nets
// --------------------------------------------------------------------
// Function prototypes
//
// --------------------------------------------------------------------
void addConcreteNet(ConcreteNet *net);
void addConcreteCell(ConcreteCell *cell);
void delConcreteNet(ConcreteNet *net);
void delConcreteCell(ConcreteCell *cell);
void globalPreplace(float utilization);
void globalPlace();
void globalIncremental();
void globalFixDensity(int numBins, float maxMovement);
float fastEstimate(ConcreteCell *cell,
int numNets, ConcreteNet *nets[]);
float fastTopoPlace(int numCells, ConcreteCell *cells[],
int numNets, ConcreteNet *nets[]);
Rect getNetBBox(const ConcreteNet *net);
float getNetWirelength(const ConcreteNet *net);
float getTotalWirelength();
float getCellArea(const ConcreteCell *cell);
void writeBookshelf(const char *filename);
// comparative qsort-style functions
int netSortByL(const void *a, const void *b);
int netSortByR(const void *a, const void *b);
int netSortByB(const void *a, const void *b);
int netSortByT(const void *a, const void *b);
int netSortByID(const void *a, const void *b);
int cellSortByX(const void *a, const void *b);
int cellSortByY(const void *a, const void *b);
int cellSortByID(const void *a, const void *b);
ABC_NAMESPACE_HEADER_END
#endif