make_port

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2023-06-28 10:01:39 -07:00
parent ab0055afff
commit ef43ee9a45
8 changed files with 85 additions and 18 deletions

View File

@ -44,6 +44,7 @@ typedef Map<const char *, ConcreteInstance*,
CharPtrLess> ConcreteInstanceChildMap; CharPtrLess> ConcreteInstanceChildMap;
typedef Map<const char *, ConcreteNet*, CharPtrLess> ConcreteInstanceNetMap; typedef Map<const char *, ConcreteNet*, CharPtrLess> ConcreteInstanceNetMap;
typedef Vector<ConcreteNet*> ConcreteNetSeq; typedef Vector<ConcreteNet*> ConcreteNetSeq;
typedef Vector<ConcretePin*> ConcretePinSeq;
typedef Map<Cell*, Instance*> CellNetworkViewMap; typedef Map<Cell*, Instance*> CellNetworkViewMap;
typedef Set<const ConcreteNet*> ConcreteNetSet; typedef Set<const ConcreteNet*> ConcreteNetSet;
@ -306,7 +307,7 @@ protected:
ConcreteCell *cell_; ConcreteCell *cell_;
ConcreteInstance *parent_; ConcreteInstance *parent_;
// Array of pins indexed by pin->port->index(). // Array of pins indexed by pin->port->index().
ConcretePin **pins_; ConcretePinSeq pins_;
ConcreteInstanceChildMap *children_; ConcreteInstanceChildMap *children_;
ConcreteInstanceNetMap *nets_; ConcreteInstanceNetMap *nets_;

View File

@ -34,6 +34,7 @@ public:
static PortDirection *ground() { return ground_; } static PortDirection *ground() { return ground_; }
static PortDirection *power() { return power_; } static PortDirection *power() { return power_; }
static PortDirection *unknown() { return unknown_; } static PortDirection *unknown() { return unknown_; }
static PortDirection *find(const char *dir_name);
const char *name() const { return name_; } const char *name() const { return name_; }
int index() const { return index_; } int index() const { return index_; }
bool isInput() const { return this == input_; } bool isInput() const { return this == input_; }

View File

@ -1179,6 +1179,8 @@ public:
Net *net); Net *net);
// disconnect_net // disconnect_net
virtual void disconnectPin(Pin *pin); virtual void disconnectPin(Pin *pin);
virtual void makePortPin(const char *port_name,
const char *direction);
// Notify STA of network change. // Notify STA of network change.
void networkChanged(); void networkChanged();
void deleteLeafInstanceBefore(const Instance *inst); void deleteLeafInstanceBefore(const Instance *inst);
@ -1196,6 +1198,7 @@ public:
virtual void replaceCellBefore(const Instance *inst, virtual void replaceCellBefore(const Instance *inst,
const LibertyCell *to_cell); const LibertyCell *to_cell);
virtual void replaceCellAfter(const Instance *inst); virtual void replaceCellAfter(const Instance *inst);
virtual void makePortPinAfter(Pin *pin);
virtual void connectPinAfter(const Pin *pin); virtual void connectPinAfter(const Pin *pin);
virtual void disconnectPinBefore(const Pin *pin); virtual void disconnectPinBefore(const Pin *pin);
virtual void deleteNetBefore(const Net *net); virtual void deleteNetBefore(const Net *net);

View File

@ -138,7 +138,7 @@ public:
private: private:
void findNext(); void findNext();
ConcretePin **pins_; const ConcretePinSeq &pins_;
int pin_count_; int pin_count_;
int pin_index_; int pin_index_;
ConcretePin *next_; ConcretePin *next_;
@ -1211,8 +1211,8 @@ ConcreteNetwork::replaceCell(Instance *inst,
ConcreteCell *ccell = reinterpret_cast<ConcreteCell*>(cell); ConcreteCell *ccell = reinterpret_cast<ConcreteCell*>(cell);
int port_count = ccell->portBitCount(); int port_count = ccell->portBitCount();
ConcreteInstance *cinst = reinterpret_cast<ConcreteInstance*>(inst); ConcreteInstance *cinst = reinterpret_cast<ConcreteInstance*>(inst);
ConcretePin **pins = cinst->pins_; ConcretePinSeq &pins = cinst->pins_;
ConcretePin **rpins = new ConcretePin*[port_count]; ConcretePinSeq rpins(port_count);
for (int i = 0; i < port_count; i++) for (int i = 0; i < port_count; i++)
rpins[i] = nullptr; rpins[i] = nullptr;
for (int i = 0; i < port_count; i++) { for (int i = 0; i < port_count; i++) {
@ -1227,7 +1227,6 @@ ConcreteNetwork::replaceCell(Instance *inst,
} }
} }
} }
delete [] pins;
cinst->pins_ = rpins; cinst->pins_ = rpins;
cinst->setCell(ccell); cinst->setCell(ccell);
} }
@ -1333,6 +1332,7 @@ ConcreteNetwork::connect(Instance *inst,
if (inst == top_instance_) { if (inst == top_instance_) {
// makeTerm // makeTerm
ConcreteTerm *cterm = new ConcreteTerm(cpin, cnet); ConcreteTerm *cterm = new ConcreteTerm(cpin, cnet);
if (cnet)
cnet->addTerm(cterm); cnet->addTerm(cterm);
cpin->term_ = cterm; cpin->term_ = cterm;
cpin->net_ = nullptr; cpin->net_ = nullptr;
@ -1541,20 +1541,13 @@ ConcreteInstance::ConcreteInstance(const char *name,
void void
ConcreteInstance::initPins() ConcreteInstance::initPins()
{ {
int pin_count = reinterpret_cast<ConcreteCell*>(cell_)->portBitCount(); ConcreteCell *ccell = reinterpret_cast<ConcreteCell*>(cell_);
if (pin_count) { pins_.resize(ccell->portBitCount());
pins_ = new ConcretePin*[pin_count];
for (int i = 0; i < pin_count; i++)
pins_[i] = nullptr;
}
else
pins_ = nullptr;
} }
ConcreteInstance::~ConcreteInstance() ConcreteInstance::~ConcreteInstance()
{ {
stringDelete(name_); stringDelete(name_);
delete [] pins_;
delete children_; delete children_;
delete nets_; delete nets_;
} }
@ -1585,7 +1578,11 @@ ConcretePin *
ConcreteInstance::findPin(const Port *port) const ConcreteInstance::findPin(const Port *port) const
{ {
const ConcretePort *cport = reinterpret_cast<const ConcretePort*>(port); const ConcretePort *cport = reinterpret_cast<const ConcretePort*>(port);
return pins_[cport->pinIndex()]; size_t port_index = cport->pinIndex();
if (port_index < pins_.size())
return pins_[port_index];
else
return nullptr;
} }
ConcreteNet * ConcreteNet *
@ -1655,7 +1652,10 @@ void
ConcreteInstance::addPin(ConcretePin *pin) ConcreteInstance::addPin(ConcretePin *pin)
{ {
ConcretePort *cport = reinterpret_cast<ConcretePort *>(pin->port()); ConcretePort *cport = reinterpret_cast<ConcretePort *>(pin->port());
pins_[cport->pinIndex()] = pin; size_t pin_index = cport->pinIndex();
if (pin_index >= pins_.size())
pins_.resize(pin_index + 1);
pins_[pin_index] = pin;
} }
void void

View File

@ -16,6 +16,8 @@
#include "PortDirection.hh" #include "PortDirection.hh"
#include "StringUtil.hh"
namespace sta { namespace sta {
PortDirection *PortDirection::input_; PortDirection *PortDirection::input_;
@ -68,6 +70,27 @@ PortDirection::PortDirection(const char *name,
{ {
} }
PortDirection *
PortDirection::find(const char *dir_name)
{
if (stringEqual(dir_name, "input"))
return input_;
else if (stringEqual(dir_name, "output"))
return output_;
else if (stringEqual(dir_name, "tristate"))
return tristate_;
else if (stringEqual(dir_name, "bidirect"))
return bidirect_;
else if (stringEqual(dir_name, "internal"))
return internal_;
else if (stringEqual(dir_name, "ground"))
return ground_;
else if (stringEqual(dir_name, "power"))
return power_;
else
return nullptr;
}
bool bool
PortDirection::isAnyInput() const PortDirection::isAnyInput() const
{ {

View File

@ -4133,6 +4133,21 @@ Sta::disconnectPin(Pin *pin)
network->disconnectPin(pin); network->disconnectPin(pin);
} }
void
Sta::makePortPin(const char *port_name,
const char *direction)
{
NetworkReader *network = dynamic_cast<NetworkReader*>(network_);
Instance *top_inst = network->topInstance();
Cell *top_cell = network->cell(top_inst);
Port *port = network->makePort(top_cell, port_name);
PortDirection *dir = PortDirection::find(direction);
if (dir)
network->setDirection(port, dir);
Pin *pin = network->makePin(top_inst, port, nullptr);
makePortPinAfter(pin);
}
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
// //
// Network edit before/after methods. // Network edit before/after methods.
@ -4161,6 +4176,15 @@ Sta::makeInstanceAfter(const Instance *inst)
} }
} }
void
Sta::makePortPinAfter(Pin *pin)
{
if (graph_) {
Vertex *vertex, *bidir_drvr_vertex;
graph_->makePinVertices(pin, vertex, bidir_drvr_vertex);
}
}
void void
Sta::replaceEquivCellBefore(const Instance *inst, Sta::replaceEquivCellBefore(const Instance *inst,
const LibertyCell *to_cell) const LibertyCell *to_cell)

View File

@ -73,6 +73,13 @@ make_net_cmd(const char *name,
return net; return net;
} }
void
make_port_pin_cmd(const char *port_name,
const char *direction)
{
Sta::sta()->makePortPin(port_name, direction);
}
void void
delete_net_cmd(Net *net) delete_net_cmd(Net *net)
{ {

View File

@ -45,7 +45,7 @@ proc make_instance { inst_path lib_cell } {
################################################################ ################################################################
define_cmd_args "make_net" {} define_cmd_args "make_net" {net_path}
proc make_net { net_path } { proc make_net { net_path } {
# Copy backslashes that will be removed by foreach. # Copy backslashes that will be removed by foreach.
@ -65,6 +65,14 @@ proc make_net { net_path } {
################################################################ ################################################################
define_cmd_args "make_port" {port_name direction}
proc make_port { port_name direction } {
make_port_pin_cmd $port_name $direction
}
################################################################
define_cmd_args "connect_pin" {net pin} define_cmd_args "connect_pin" {net pin}
proc connect_pin { net pin } { proc connect_pin { net pin } {