mirror of
https://github.com/The-OpenROAD-Project/OpenDB.git
synced 2026-03-06 17:31:17 +08:00
271 lines
8.9 KiB
C++
271 lines
8.9 KiB
C++
#define BOOST_TEST_MODULE example
|
|
#include <boost/test/included/unit_test.hpp>
|
|
#include <iostream>
|
|
|
|
#include "CallBack.h"
|
|
#include "db.h"
|
|
#include "helper.cpp"
|
|
using namespace odb;
|
|
using namespace std;
|
|
BOOST_AUTO_TEST_SUITE(test_suite)
|
|
dbDatabase* db;
|
|
dbLib* lib;
|
|
dbBlock* block;
|
|
CallBack* cb;
|
|
void setup()
|
|
{
|
|
cb = new CallBack();
|
|
cb->clearEvents();
|
|
}
|
|
void tearDown()
|
|
{
|
|
db->destroy(db);
|
|
delete cb;
|
|
}
|
|
BOOST_AUTO_TEST_CASE(test_inst_and_iterm)
|
|
{
|
|
setup();
|
|
db = createSimpleDB();
|
|
block = db->getChip()->getBlock();
|
|
dbNet* n1 = dbNet::create(block, "n1");
|
|
cb->addOwner(block);
|
|
dbInst* i1 = dbInst::create(block, db->findMaster("and2"), "i1");
|
|
BOOST_ASSERT(cb->events.size() == 4);
|
|
BOOST_ASSERT(cb->events[0] == "Create inst i1");
|
|
BOOST_ASSERT(cb->events[1] == "Create iterm a of inst i1");
|
|
BOOST_ASSERT(cb->events[2] == "Create iterm b of inst i1");
|
|
BOOST_ASSERT(cb->events[3] == "Create iterm o of inst i1");
|
|
cb->clearEvents();
|
|
cb->pause();
|
|
dbRegion* parent_region = dbRegion::create(block, "parent");
|
|
cb->unpause();
|
|
dbInst* i2
|
|
= dbInst::create(block, db->findMaster("and2"), "i2", parent_region);
|
|
BOOST_ASSERT(cb->events.size() == 4);
|
|
BOOST_ASSERT(cb->events[0] == "Create inst i2 in region parent");
|
|
BOOST_ASSERT(cb->events[1] == "Create iterm a of inst i2");
|
|
BOOST_ASSERT(cb->events[2] == "Create iterm b of inst i2");
|
|
BOOST_ASSERT(cb->events[3] == "Create iterm o of inst i2");
|
|
cb->clearEvents();
|
|
i1->swapMaster(db->findMaster("or2"));
|
|
BOOST_ASSERT(cb->events.size() == 2);
|
|
BOOST_ASSERT(cb->events[0]
|
|
== "PreSwap inst i1 from master and2 to master or2");
|
|
BOOST_ASSERT(cb->events[1] == "PostSwap inst i1 to master or2");
|
|
cb->clearEvents();
|
|
i1->setOrigin(100, 100);
|
|
BOOST_ASSERT(cb->events.size() == 2);
|
|
BOOST_ASSERT(cb->events[0] == "PreMove inst i1");
|
|
BOOST_ASSERT(cb->events[1] == "PostMove inst i1");
|
|
cb->clearEvents();
|
|
i1->setOrigin(100, 100);
|
|
BOOST_ASSERT(cb->events.size() == 0);
|
|
dbITerm::connect(i1->findITerm("a"), n1);
|
|
BOOST_ASSERT(cb->events.size() == 2);
|
|
BOOST_ASSERT(cb->events[0] == "PreConnect iterm to net n1");
|
|
BOOST_ASSERT(cb->events[1] == "PostConnect iterm to net n1");
|
|
cb->clearEvents();
|
|
dbITerm::connect(i1->findITerm("a"), n1);
|
|
BOOST_ASSERT(cb->events.size() == 0);
|
|
dbITerm::disconnect(i1->findITerm("a"));
|
|
BOOST_ASSERT(cb->events.size() == 2);
|
|
BOOST_ASSERT(cb->events[0] == "PreDisconnect iterm from net n1");
|
|
BOOST_ASSERT(cb->events[1] == "PostDisconnect iterm from net n1");
|
|
cb->clearEvents();
|
|
dbITerm::disconnect(i1->findITerm("a"));
|
|
BOOST_ASSERT(cb->events.size() == 0);
|
|
|
|
i1->destroy(i1);
|
|
BOOST_ASSERT(cb->events.size() == 4);
|
|
BOOST_ASSERT(cb->events[0] == "Destroy iterm a of inst i1");
|
|
BOOST_ASSERT(cb->events[1] == "Destroy iterm b of inst i1");
|
|
BOOST_ASSERT(cb->events[2] == "Destroy iterm o of inst i1");
|
|
BOOST_ASSERT(cb->events[3] == "Destroy inst i1");
|
|
tearDown();
|
|
}
|
|
BOOST_AUTO_TEST_CASE(test_net)
|
|
{
|
|
setup();
|
|
db = createSimpleDB();
|
|
block = db->getChip()->getBlock();
|
|
cb->addOwner(block);
|
|
dbNet* n1 = dbNet::create(block, "n1");
|
|
BOOST_ASSERT(cb->events.size() == 1);
|
|
BOOST_ASSERT(cb->events[0] == "Create net n1");
|
|
cb->clearEvents();
|
|
dbNet::destroy(n1);
|
|
BOOST_ASSERT(cb->events.size() == 1);
|
|
BOOST_ASSERT(cb->events[0] == "Destroy net n1");
|
|
tearDown();
|
|
}
|
|
BOOST_AUTO_TEST_CASE(test_bterm)
|
|
{
|
|
setup();
|
|
db = create2LevetDbNoBTerms();
|
|
block = db->getChip()->getBlock();
|
|
cb->addOwner(block);
|
|
auto n1 = block->findNet("n1");
|
|
dbBTerm* IN1 = dbBTerm::create(n1, "IN1");
|
|
IN1->setIoType(dbIoType::INPUT);
|
|
BOOST_ASSERT(cb->events.size() == 3);
|
|
BOOST_ASSERT(cb->events[0] == "Create IN1");
|
|
BOOST_ASSERT(cb->events[1] == "Preconnect IN1 to n1");
|
|
BOOST_ASSERT(cb->events[2] == "Postconnect IN1");
|
|
cb->clearEvents();
|
|
IN1->disconnect();
|
|
BOOST_ASSERT(cb->events.size() == 2);
|
|
BOOST_ASSERT(cb->events[0] == "Predisconnect IN1");
|
|
BOOST_ASSERT(cb->events[1] == "Postdisconnect IN1 from n1");
|
|
cb->clearEvents();
|
|
IN1->destroy(IN1);
|
|
BOOST_ASSERT(cb->events.size() == 1);
|
|
BOOST_ASSERT(cb->events[0] == "Destroy IN1");
|
|
tearDown();
|
|
}
|
|
BOOST_AUTO_TEST_CASE(test_bpin)
|
|
{
|
|
setup();
|
|
db = create2LevetDbWithBTerms();
|
|
block = db->getChip()->getBlock();
|
|
cb->addOwner(block);
|
|
dbBPin* pin = dbBPin::create(block->findBTerm("IN1"));
|
|
BOOST_ASSERT(cb->events.size() == 1);
|
|
BOOST_ASSERT(cb->events[0] == "Create BPin for IN1");
|
|
cb->clearEvents();
|
|
dbBPin::destroy(pin);
|
|
BOOST_ASSERT(cb->events.size() == 1);
|
|
BOOST_ASSERT(cb->events[0] == "Destroy BPin");
|
|
tearDown();
|
|
}
|
|
BOOST_AUTO_TEST_CASE(test_blockage)
|
|
{
|
|
setup();
|
|
db = create2LevetDbWithBTerms();
|
|
block = db->getChip()->getBlock();
|
|
cb->addOwner(block);
|
|
dbBlockage* blockage = dbBlockage::create(block, 0, 0, 100, 100);
|
|
BOOST_ASSERT(cb->events.size() == 1);
|
|
BOOST_ASSERT(cb->events[0] == "Create blockage (0,0) (100,100)");
|
|
tearDown();
|
|
}
|
|
BOOST_AUTO_TEST_CASE(test_obstruction)
|
|
{
|
|
setup();
|
|
db = create2LevetDbWithBTerms();
|
|
block = db->getChip()->getBlock();
|
|
cb->addOwner(block);
|
|
dbObstruction* obs = dbObstruction::create(
|
|
block, db->getTech()->findLayer("L1"), 0, 0, 100, 100);
|
|
BOOST_ASSERT(cb->events.size() == 1);
|
|
BOOST_ASSERT(cb->events[0] == "Create obstruction (0,0) (100,100)");
|
|
cb->clearEvents();
|
|
dbObstruction::destroy(obs);
|
|
BOOST_ASSERT(cb->events.size() == 1);
|
|
BOOST_ASSERT(cb->events[0] == "Destroy obstruction");
|
|
tearDown();
|
|
}
|
|
BOOST_AUTO_TEST_CASE(test_region)
|
|
{
|
|
setup();
|
|
db = create2LevetDbWithBTerms();
|
|
block = db->getChip()->getBlock();
|
|
cb->addOwner(block);
|
|
dbRegion* parent_region = dbRegion::create(block, "parent");
|
|
dbRegion* child_region = dbRegion::create(parent_region, "child");
|
|
BOOST_ASSERT(cb->events.size() == 2);
|
|
BOOST_ASSERT(cb->events[0] == "Create region parent");
|
|
BOOST_ASSERT(cb->events[1] == "Create region child");
|
|
cb->clearEvents();
|
|
dbRegion::destroy(parent_region);
|
|
BOOST_ASSERT(cb->events.size() == 2);
|
|
BOOST_ASSERT(cb->events[0] == "Destroy region child");
|
|
BOOST_ASSERT(cb->events[1] == "Destroy region parent");
|
|
tearDown();
|
|
}
|
|
BOOST_AUTO_TEST_CASE(test_row)
|
|
{
|
|
setup();
|
|
db = create2LevetDbWithBTerms();
|
|
block = db->getChip()->getBlock();
|
|
cb->addOwner(block);
|
|
dbSite* site = dbSite::create(db->findLib("lib1"), "site1");
|
|
dbRow* row = dbRow::create(
|
|
block, "row1", site, 0, 0, dbOrientType::MX, dbRowDir::HORIZONTAL, 1, 20);
|
|
BOOST_ASSERT(cb->events.size() == 1);
|
|
BOOST_ASSERT(cb->events[0] == "Create row row1");
|
|
cb->clearEvents();
|
|
dbRow::destroy(row);
|
|
BOOST_ASSERT(cb->events.size() == 1);
|
|
BOOST_ASSERT(cb->events[0] == "Destroy row row1");
|
|
tearDown();
|
|
}
|
|
BOOST_AUTO_TEST_CASE(test_wire)
|
|
{
|
|
setup();
|
|
db = create2LevetDbWithBTerms();
|
|
block = db->getChip()->getBlock();
|
|
cb->addOwner(block);
|
|
dbWire* wire1 = dbWire::create(block->findNet("n1"));
|
|
BOOST_ASSERT(cb->events.size() == 1);
|
|
BOOST_ASSERT(cb->events[0] == "Create wire");
|
|
cb->clearEvents();
|
|
wire1->attach(block->findNet("n1"));
|
|
BOOST_ASSERT(cb->events.size() == 0);
|
|
wire1->detach();
|
|
BOOST_ASSERT(cb->events.size() == 2);
|
|
BOOST_ASSERT(cb->events[0] == "PreDetach wire");
|
|
BOOST_ASSERT(cb->events[1] == "PostDetach wire from n1");
|
|
cb->clearEvents();
|
|
wire1->attach(block->findNet("n1"));
|
|
BOOST_ASSERT(cb->events.size() == 2);
|
|
BOOST_ASSERT(cb->events[0] == "PreAttach wire to n1");
|
|
BOOST_ASSERT(cb->events[1] == "PostAttach wire");
|
|
cb->clearEvents();
|
|
|
|
cb->pause();
|
|
dbWire* wire2 = dbWire::create(block);
|
|
cb->unpause();
|
|
wire2->append(wire1);
|
|
BOOST_ASSERT(cb->events.size() == 2);
|
|
BOOST_ASSERT(cb->events[0] == "PreAppend wire");
|
|
BOOST_ASSERT(cb->events[1] == "PostAppend wire");
|
|
cb->clearEvents();
|
|
cb->pause();
|
|
dbWire* wire3 = dbWire::create(block);
|
|
cb->unpause();
|
|
dbWire::copy(wire1, wire3);
|
|
BOOST_ASSERT(cb->events.size() == 2);
|
|
BOOST_ASSERT(cb->events[0] == "PreCopy wire");
|
|
BOOST_ASSERT(cb->events[1] == "PostCopy wire");
|
|
cb->clearEvents();
|
|
|
|
dbWire::destroy(wire2);
|
|
BOOST_ASSERT(cb->events.size() == 1);
|
|
BOOST_ASSERT(cb->events[0] == "Destroy wire");
|
|
}
|
|
BOOST_AUTO_TEST_CASE(test_swire)
|
|
{
|
|
setup();
|
|
db = create2LevetDbWithBTerms();
|
|
block = db->getChip()->getBlock();
|
|
cb->addOwner(block);
|
|
dbSWire* wire = dbSWire::create(block->findNet("n1"), dbWireType::NOSHIELD);
|
|
BOOST_ASSERT(cb->events.size() == 1);
|
|
BOOST_ASSERT(cb->events[0] == "Create swire");
|
|
cb->clearEvents();
|
|
dbSBox* box = dbSBox::create(wire,
|
|
db->getTech()->findLayer("L1"),
|
|
0,
|
|
100,
|
|
100,
|
|
100,
|
|
dbWireShapeType::IOWIRE,
|
|
dbSBox::Direction::HORIZONTAL);
|
|
|
|
dbSWire::destroy(wire);
|
|
BOOST_ASSERT(cb->events.size() == 3);
|
|
BOOST_ASSERT(cb->events[0] == "PreDestroySBoxes");
|
|
BOOST_ASSERT(cb->events[1] == "PostDestroySBoxes");
|
|
BOOST_ASSERT(cb->events[2] == "Destroy swire");
|
|
}
|
|
BOOST_AUTO_TEST_SUITE_END() |