mirror of https://github.com/KLayout/klayout.git
Merge adb81262a4 into 072b02c55c
This commit is contained in:
commit
f0b4c4dfde
|
|
@ -138,6 +138,11 @@ public:
|
|||
|
||||
virtual RegionDelegate *add (const Region &other) const;
|
||||
|
||||
virtual RegionDelegate *peel (double /*complexity_factor*/) const
|
||||
{
|
||||
return const_cast<AsIfFlatRegion *> (this);
|
||||
}
|
||||
|
||||
virtual RegionDelegate *selected_outside (const Region &other) const
|
||||
{
|
||||
return selected_interacting_generic (other, 1, false, Positive, size_t (1), std::numeric_limits<size_t>::max ()).first;
|
||||
|
|
|
|||
|
|
@ -42,15 +42,15 @@ namespace db
|
|||
/**
|
||||
* @brief A utility class for the box scanner implementation
|
||||
*/
|
||||
template <class BoxConvert, class Obj, class Prop, class SideOp>
|
||||
template <class BoxConvertAdaptor, class Obj, class Prop, class SideOp>
|
||||
struct bs_side_compare_func
|
||||
#if __cplusplus < 201703L
|
||||
: std::binary_function<std::pair<const Obj *, Prop>, std::pair<const Obj *, Prop>, bool>
|
||||
#endif
|
||||
{
|
||||
typedef typename BoxConvert::box_type box_type;
|
||||
typedef typename BoxConvertAdaptor::box_type box_type;
|
||||
|
||||
bs_side_compare_func (const BoxConvert &bc)
|
||||
bs_side_compare_func (const BoxConvertAdaptor &bc)
|
||||
: m_bc (bc)
|
||||
{
|
||||
// .. nothing yet ..
|
||||
|
|
@ -59,26 +59,26 @@ struct bs_side_compare_func
|
|||
bool operator() (const std::pair<const Obj *, Prop> &a, const std::pair<const Obj *, Prop> &b) const
|
||||
{
|
||||
SideOp sideop;
|
||||
return sideop (m_bc (*a.first)) < sideop (m_bc (*b.first));
|
||||
return sideop (m_bc (a)) < sideop (m_bc (b));
|
||||
}
|
||||
|
||||
private:
|
||||
BoxConvert m_bc;
|
||||
BoxConvertAdaptor m_bc;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief A utility class for the box scanner implementation
|
||||
*/
|
||||
template <class BoxConvert, class Obj, class Prop, class SideOp>
|
||||
template <class BoxConvertAdaptor, class Obj, class Prop, class SideOp>
|
||||
struct bs_side_compare_vs_const_func
|
||||
#if __cplusplus < 201703L
|
||||
: std::unary_function<std::pair<const Obj *, Prop>, bool>
|
||||
#endif
|
||||
{
|
||||
typedef typename BoxConvert::box_type box_type;
|
||||
typedef typename BoxConvertAdaptor::box_type box_type;
|
||||
typedef typename box_type::coord_type coord_type;
|
||||
|
||||
bs_side_compare_vs_const_func (const BoxConvert &bc, coord_type c)
|
||||
bs_side_compare_vs_const_func (const BoxConvertAdaptor &bc, coord_type c)
|
||||
: m_bc (bc), m_c (c)
|
||||
{
|
||||
// .. nothing yet ..
|
||||
|
|
@ -87,11 +87,11 @@ struct bs_side_compare_vs_const_func
|
|||
bool operator() (const std::pair<const Obj *, Prop> &a) const
|
||||
{
|
||||
SideOp sideop;
|
||||
return sideop (m_bc (*a.first)) < m_c;
|
||||
return sideop (m_bc (a)) < m_c;
|
||||
}
|
||||
|
||||
private:
|
||||
BoxConvert m_bc;
|
||||
BoxConvertAdaptor m_bc;
|
||||
coord_type m_c;
|
||||
};
|
||||
|
||||
|
|
@ -186,6 +186,34 @@ public:
|
|||
typedef std::vector<std::pair<const Obj *, Prop> > container_type;
|
||||
typedef typename container_type::iterator iterator_type;
|
||||
|
||||
template <class BoxConvert>
|
||||
struct box_convert_adaptor_take_first
|
||||
{
|
||||
typedef typename BoxConvert::box_type box_type;
|
||||
|
||||
box_convert_adaptor_take_first (const BoxConvert &bc)
|
||||
: m_bc (bc)
|
||||
{ }
|
||||
|
||||
box_type operator() (const std::pair<const Obj *, Prop> &p) const
|
||||
{
|
||||
return m_bc (*p.first);
|
||||
}
|
||||
|
||||
private:
|
||||
const BoxConvert &m_bc;
|
||||
};
|
||||
|
||||
struct BoxConvertAdaptorTakeSecond
|
||||
{
|
||||
typedef Prop box_type;
|
||||
|
||||
const box_type &operator() (const std::pair<const Obj *, Prop> &p) const
|
||||
{
|
||||
return p.second;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Default ctor
|
||||
*/
|
||||
|
|
@ -288,7 +316,22 @@ public:
|
|||
bool process (Rec &rec, typename BoxConvert::box_type::coord_type enl, const BoxConvert &bc = BoxConvert ())
|
||||
{
|
||||
rec.initialize ();
|
||||
bool ret = do_process (rec, enl, bc);
|
||||
bool ret = do_process (rec, enl, box_convert_adaptor_take_first<BoxConvert> (bc));
|
||||
rec.finalize (ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Same as "process", but allows specfying a box convert adaptor
|
||||
*
|
||||
* This version is useful for use with BoxConvertAdaptorTakeSecond. In that case, "Prop" needs to be
|
||||
* a box type and is used directly as the bounding box.
|
||||
*/
|
||||
template <class Rec, class BoxConvertAdaptor = BoxConvertAdaptorTakeSecond>
|
||||
bool process_with_adaptor (Rec &rec, typename BoxConvertAdaptor::box_type::coord_type enl, const BoxConvertAdaptor &bca = BoxConvertAdaptor ())
|
||||
{
|
||||
rec.initialize ();
|
||||
bool ret = do_process (rec, enl, bca);
|
||||
rec.finalize (ret);
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -300,21 +343,21 @@ private:
|
|||
bool m_report_progress;
|
||||
std::string m_progress_desc;
|
||||
|
||||
template <class Rec, class BoxConvert>
|
||||
bool do_process (Rec &rec, typename BoxConvert::box_type::coord_type enl, const BoxConvert &bc = BoxConvert ())
|
||||
template <class Rec, class BoxConvertAdaptor>
|
||||
bool do_process (Rec &rec, typename BoxConvertAdaptor::box_type::coord_type enl, const BoxConvertAdaptor &bc = BoxConvertAdaptor ())
|
||||
{
|
||||
typedef typename BoxConvert::box_type box_type;
|
||||
typedef typename BoxConvertAdaptor::box_type box_type;
|
||||
typedef typename box_type::coord_type coord_type;
|
||||
typedef bs_side_compare_func<BoxConvert, Obj, Prop, box_bottom<Box> > bottom_side_compare_func;
|
||||
typedef bs_side_compare_func<BoxConvert, Obj, Prop, box_left<Box> > left_side_compare_func;
|
||||
typedef bs_side_compare_vs_const_func<BoxConvert, Obj, Prop, box_top<Box> > below_func;
|
||||
typedef bs_side_compare_vs_const_func<BoxConvert, Obj, Prop, box_right<Box> > left_func;
|
||||
typedef bs_side_compare_func<BoxConvertAdaptor, Obj, Prop, box_bottom<Box> > bottom_side_compare_func;
|
||||
typedef bs_side_compare_func<BoxConvertAdaptor, Obj, Prop, box_left<Box> > left_side_compare_func;
|
||||
typedef bs_side_compare_vs_const_func<BoxConvertAdaptor, Obj, Prop, box_top<Box> > below_func;
|
||||
typedef bs_side_compare_vs_const_func<BoxConvertAdaptor, Obj, Prop, box_right<Box> > left_func;
|
||||
|
||||
// sort out the entries with an empty bbox (we must not put that into sort)
|
||||
|
||||
typename container_type::iterator wi = m_pp.begin ();
|
||||
for (typename container_type::iterator ri = m_pp.begin (); ri != m_pp.end (); ++ri) {
|
||||
if (! bc (*ri->first).empty ()) {
|
||||
if (! bc (*ri).empty ()) {
|
||||
if (wi != ri) {
|
||||
*wi = *ri;
|
||||
}
|
||||
|
|
@ -334,9 +377,9 @@ private:
|
|||
// below m_scanner_thr elements use the brute force approach which is faster in that case
|
||||
|
||||
for (iterator_type i = m_pp.begin (); i != m_pp.end (); ++i) {
|
||||
box_type b1 = bc (*i->first);
|
||||
box_type b1 = bc (*i);
|
||||
for (iterator_type j = i + 1; j != m_pp.end (); ++j) {
|
||||
if (bs_boxes_overlap (b1, bc (*j->first), enl)) {
|
||||
if (bs_boxes_overlap (b1, bc (*j), enl)) {
|
||||
rec.add (i->first, i->second, j->first, j->second);
|
||||
if (rec.stop ()) {
|
||||
return false;
|
||||
|
|
@ -355,7 +398,7 @@ private:
|
|||
|
||||
std::sort (m_pp.begin (), m_pp.end (), bottom_side_compare_func (bc));
|
||||
|
||||
coord_type y = bc (*m_pp.front ().first).bottom ();
|
||||
coord_type y = bc (m_pp.front ()).bottom ();
|
||||
|
||||
iterator_type current = m_pp.begin ();
|
||||
iterator_type future = m_pp.begin ();
|
||||
|
|
@ -389,10 +432,10 @@ private:
|
|||
typename std::iterator_traits<iterator_type>::difference_type min_band_size = size_t ((future - current) * m_fill_factor);
|
||||
coord_type yy = y;
|
||||
do {
|
||||
yy = bc (*future->first).bottom ();
|
||||
yy = bc (*future).bottom ();
|
||||
do {
|
||||
++future;
|
||||
} while (future != m_pp.end () && bc (*future->first).bottom () == yy);
|
||||
} while (future != m_pp.end () && bc (*future).bottom () == yy);
|
||||
} while (future != m_pp.end () && future - current < min_band_size);
|
||||
|
||||
std::sort (current, future, left_side_compare_func (bc));
|
||||
|
|
@ -400,7 +443,7 @@ private:
|
|||
iterator_type c = current;
|
||||
iterator_type f = current;
|
||||
|
||||
coord_type x = bc (*c->first).left ();
|
||||
coord_type x = bc (*c).left ();
|
||||
|
||||
while (f != future) {
|
||||
|
||||
|
|
@ -412,10 +455,10 @@ private:
|
|||
typename std::iterator_traits<iterator_type>::difference_type min_box_size = size_t ((f - c) * m_fill_factor);
|
||||
coord_type xx = x;
|
||||
do {
|
||||
xx = bc (*f->first).left ();
|
||||
xx = bc (*f).left ();
|
||||
do {
|
||||
++f;
|
||||
} while (f != future && bc (*f->first).left () == xx);
|
||||
} while (f != future && bc (*f).left () == xx);
|
||||
} while (f != future && f - c < min_box_size);
|
||||
|
||||
if (m_report_progress) {
|
||||
|
|
@ -425,9 +468,13 @@ private:
|
|||
|
||||
for (iterator_type i = f0; i != f; ++i) {
|
||||
for (iterator_type j = c; j < i; ++j) {
|
||||
if (bs_boxes_overlap (bc (*i->first), bc (*j->first), enl)) {
|
||||
if (seen.find (std::make_pair (i->first, j->first)) == seen.end () && seen.find (std::make_pair (j->first, i->first)) == seen.end ()) {
|
||||
seen.insert (std::make_pair (i->first, j->first));
|
||||
if (bs_boxes_overlap (bc (*i), bc (*j), enl)) {
|
||||
std::pair<const Obj *, const Obj *> k (i->first, j->first);
|
||||
if (k.first < k.second) {
|
||||
std::swap (k.first, k.second);
|
||||
}
|
||||
if (seen.find (k) == seen.end ()) {
|
||||
seen.insert (k);
|
||||
rec.add (i->first, i->second, j->first, j->second);
|
||||
if (rec.stop ()) {
|
||||
return false;
|
||||
|
|
@ -534,6 +581,62 @@ public:
|
|||
typedef typename container_type1::iterator iterator_type1;
|
||||
typedef typename container_type2::iterator iterator_type2;
|
||||
|
||||
template <class BoxConvert>
|
||||
struct box_convert_adaptor_take_first1
|
||||
{
|
||||
typedef typename BoxConvert::box_type box_type;
|
||||
|
||||
box_convert_adaptor_take_first1 (const BoxConvert &bc)
|
||||
: m_bc (bc)
|
||||
{ }
|
||||
|
||||
box_type operator() (const std::pair<const Obj1 *, Prop1> &p) const
|
||||
{
|
||||
return m_bc (*p.first);
|
||||
}
|
||||
|
||||
private:
|
||||
const BoxConvert &m_bc;
|
||||
};
|
||||
|
||||
template <class BoxConvert>
|
||||
struct box_convert_adaptor_take_first2
|
||||
{
|
||||
typedef typename BoxConvert::box_type box_type;
|
||||
|
||||
box_convert_adaptor_take_first2 (const BoxConvert &bc)
|
||||
: m_bc (bc)
|
||||
{ }
|
||||
|
||||
box_type operator() (const std::pair<const Obj2 *, Prop2> &p) const
|
||||
{
|
||||
return m_bc (*p.first);
|
||||
}
|
||||
|
||||
private:
|
||||
const BoxConvert &m_bc;
|
||||
};
|
||||
|
||||
struct BoxConvertAdaptorTakeSecond1
|
||||
{
|
||||
typedef Prop1 box_type;
|
||||
|
||||
const box_type &operator() (const std::pair<const Obj1 *, Prop1> &p) const
|
||||
{
|
||||
return p.second;
|
||||
}
|
||||
};
|
||||
|
||||
struct BoxConvertAdaptorTakeSecond2
|
||||
{
|
||||
typedef Prop2 box_type;
|
||||
|
||||
const box_type &operator() (const std::pair<const Obj2 *, Prop2> &p) const
|
||||
{
|
||||
return p.second;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Default ctor
|
||||
*/
|
||||
|
|
@ -678,7 +781,22 @@ public:
|
|||
bool process (Rec &rec, typename BoxConvert1::box_type::coord_type enl, const BoxConvert1 &bc1 = BoxConvert1 (), const BoxConvert2 &bc2 = BoxConvert2 ())
|
||||
{
|
||||
rec.initialize ();
|
||||
bool ret = do_process (rec, enl, bc1, bc2);
|
||||
bool ret = do_process (rec, enl, box_convert_adaptor_take_first1<BoxConvert1> (bc1), box_convert_adaptor_take_first2<BoxConvert2> (bc2));
|
||||
rec.finalize (ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Same as "process", but allows specfying a box convert adaptor
|
||||
*
|
||||
* This version is useful for use with BoxConvertAdaptorTakeSecond. In that case, "Prop" needs to be
|
||||
* a box type and is used directly as the bounding box.
|
||||
*/
|
||||
template <class Rec, class BoxConvertAdaptor1 = BoxConvertAdaptorTakeSecond1, class BoxConvertAdaptor2 = BoxConvertAdaptorTakeSecond2>
|
||||
bool process_with_adaptor (Rec &rec, typename BoxConvertAdaptor1::box_type::coord_type enl, const BoxConvertAdaptor1 &bca1 = BoxConvertAdaptor1 (), const BoxConvertAdaptor2 &bca2 = BoxConvertAdaptor2 ())
|
||||
{
|
||||
rec.initialize ();
|
||||
bool ret = do_process (rec, enl, bca1, bca2);
|
||||
rec.finalize (ret);
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -691,25 +809,25 @@ private:
|
|||
bool m_report_progress;
|
||||
std::string m_progress_desc;
|
||||
|
||||
template <class Rec, class BoxConvert1, class BoxConvert2>
|
||||
bool do_process (Rec &rec, typename BoxConvert1::box_type::coord_type enl, const BoxConvert1 &bc1 = BoxConvert1 (), const BoxConvert2 &bc2 = BoxConvert2 ())
|
||||
template <class Rec, class BoxConvertAdaptor1, class BoxConvertAdaptor2>
|
||||
bool do_process (Rec &rec, typename BoxConvertAdaptor1::box_type::coord_type enl, const BoxConvertAdaptor1 &bc1 = BoxConvertAdaptor1 (), const BoxConvertAdaptor2 &bc2 = BoxConvertAdaptor2 ())
|
||||
{
|
||||
typedef typename BoxConvert1::box_type box_type; // must be same as BoxConvert2::box_type
|
||||
typedef typename BoxConvertAdaptor1::box_type box_type; // must be same as BoxConvert2::box_type
|
||||
typedef typename box_type::coord_type coord_type;
|
||||
typedef bs_side_compare_func<BoxConvert1, Obj1, Prop1, box_bottom<Box> > bottom_side_compare_func1;
|
||||
typedef bs_side_compare_func<BoxConvert1, Obj1, Prop1, box_left<Box> > left_side_compare_func1;
|
||||
typedef bs_side_compare_vs_const_func<BoxConvert1, Obj1, Prop1, box_top<Box> > below_func1;
|
||||
typedef bs_side_compare_vs_const_func<BoxConvert1, Obj1, Prop1, box_right<Box> > left_func1;
|
||||
typedef bs_side_compare_func<BoxConvert2, Obj2, Prop2, box_bottom<Box> > bottom_side_compare_func2;
|
||||
typedef bs_side_compare_func<BoxConvert2, Obj2, Prop2, box_left<Box> > left_side_compare_func2;
|
||||
typedef bs_side_compare_vs_const_func<BoxConvert2, Obj2, Prop2, box_top<Box> > below_func2;
|
||||
typedef bs_side_compare_vs_const_func<BoxConvert2, Obj2, Prop2, box_right<Box> > left_func2;
|
||||
typedef bs_side_compare_func<BoxConvertAdaptor1, Obj1, Prop1, box_bottom<Box> > bottom_side_compare_func1;
|
||||
typedef bs_side_compare_func<BoxConvertAdaptor1, Obj1, Prop1, box_left<Box> > left_side_compare_func1;
|
||||
typedef bs_side_compare_vs_const_func<BoxConvertAdaptor1, Obj1, Prop1, box_top<Box> > below_func1;
|
||||
typedef bs_side_compare_vs_const_func<BoxConvertAdaptor1, Obj1, Prop1, box_right<Box> > left_func1;
|
||||
typedef bs_side_compare_func<BoxConvertAdaptor2, Obj2, Prop2, box_bottom<Box> > bottom_side_compare_func2;
|
||||
typedef bs_side_compare_func<BoxConvertAdaptor2, Obj2, Prop2, box_left<Box> > left_side_compare_func2;
|
||||
typedef bs_side_compare_vs_const_func<BoxConvertAdaptor2, Obj2, Prop2, box_top<Box> > below_func2;
|
||||
typedef bs_side_compare_vs_const_func<BoxConvertAdaptor2, Obj2, Prop2, box_right<Box> > left_func2;
|
||||
|
||||
// sort out the entries with an empty bbox (we must not put that into sort)
|
||||
|
||||
typename container_type1::iterator wi1 = m_pp1.begin ();
|
||||
for (typename container_type1::iterator ri1 = m_pp1.begin (); ri1 != m_pp1.end (); ++ri1) {
|
||||
if (! bc1 (*ri1->first).empty ()) {
|
||||
if (! bc1 (*ri1).empty ()) {
|
||||
if (wi1 != ri1) {
|
||||
*wi1 = *ri1;
|
||||
}
|
||||
|
|
@ -726,7 +844,7 @@ private:
|
|||
|
||||
typename container_type2::iterator wi2 = m_pp2.begin ();
|
||||
for (typename container_type2::iterator ri2 = m_pp2.begin (); ri2 != m_pp2.end (); ++ri2) {
|
||||
if (! bc2 (*ri2->first).empty ()) {
|
||||
if (! bc2 (*ri2).empty ()) {
|
||||
if (wi2 != ri2) {
|
||||
*wi2 = *ri2;
|
||||
}
|
||||
|
|
@ -757,9 +875,9 @@ private:
|
|||
// below m_scanner_thr elements use the brute force approach which is faster in that case
|
||||
|
||||
for (iterator_type1 i = m_pp1.begin (); i != m_pp1.end (); ++i) {
|
||||
box_type b1 = bc1 (*i->first);
|
||||
box_type b1 = bc1 (*i);
|
||||
for (iterator_type2 j = m_pp2.begin (); j != m_pp2.end (); ++j) {
|
||||
if (bs_boxes_overlap (b1, bc2 (*j->first), enl)) {
|
||||
if (bs_boxes_overlap (b1, bc2 (*j), enl)) {
|
||||
rec.add (i->first, i->second, j->first, j->second);
|
||||
if (rec.stop ()) {
|
||||
return false;
|
||||
|
|
@ -783,7 +901,7 @@ private:
|
|||
std::sort (m_pp1.begin (), m_pp1.end (), bottom_side_compare_func1 (bc1));
|
||||
std::sort (m_pp2.begin (), m_pp2.end (), bottom_side_compare_func2 (bc2));
|
||||
|
||||
coord_type y = std::min (bc1 (*m_pp1.front ().first).bottom (), bc2 (*m_pp2.front ().first).bottom ());
|
||||
coord_type y = std::min (bc1 (m_pp1.front ()).bottom (), bc2 (m_pp2.front ()).bottom ());
|
||||
|
||||
iterator_type1 current1 = m_pp1.begin ();
|
||||
iterator_type1 future1 = m_pp1.begin ();
|
||||
|
|
@ -833,16 +951,16 @@ private:
|
|||
coord_type yy = y;
|
||||
do {
|
||||
if (future1 != m_pp1.end () && future2 != m_pp2.end ()) {
|
||||
yy = std::min (bc1 (*future1->first).bottom (), bc2 (*future2->first).bottom ());
|
||||
yy = std::min (bc1 (*future1).bottom (), bc2 (*future2).bottom ());
|
||||
} else if (future1 != m_pp1.end ()) {
|
||||
yy = bc1 (*future1->first).bottom ();
|
||||
yy = bc1 (*future1).bottom ();
|
||||
} else {
|
||||
yy = bc2 (*future2->first).bottom ();
|
||||
yy = bc2 (*future2).bottom ();
|
||||
}
|
||||
while (future1 != m_pp1.end () && bc1 (*future1->first).bottom () == yy) {
|
||||
while (future1 != m_pp1.end () && bc1 (*future1).bottom () == yy) {
|
||||
++future1;
|
||||
}
|
||||
while (future2 != m_pp2.end () && bc2 (*future2->first).bottom () == yy) {
|
||||
while (future2 != m_pp2.end () && bc2 (*future2).bottom () == yy) {
|
||||
++future2;
|
||||
}
|
||||
} while ((future1 != m_pp1.end () || future2 != m_pp2.end ()) && size_t (future1 - current1) + size_t (future2 - current2) < min_band_size);
|
||||
|
|
@ -857,7 +975,7 @@ private:
|
|||
iterator_type2 c2 = current2;
|
||||
iterator_type2 f2 = current2;
|
||||
|
||||
coord_type x = std::min (bc1 (*c1->first).left (), bc2 (*c2->first).left ());
|
||||
coord_type x = std::min (bc1 (*c1).left (), bc2 (*c2).left ());
|
||||
|
||||
while (f1 != future1 || f2 != future2) {
|
||||
|
||||
|
|
@ -869,16 +987,16 @@ private:
|
|||
coord_type xx = x;
|
||||
do {
|
||||
if (f1 != future1 && f2 != future2) {
|
||||
xx = std::min (bc1 (*f1->first).left (), bc2 (*f2->first).left ());
|
||||
xx = std::min (bc1 (*f1).left (), bc2 (*f2).left ());
|
||||
} else if (f1 != future1) {
|
||||
xx = bc1 (*f1->first).left ();
|
||||
xx = bc1 (*f1).left ();
|
||||
} else if (f2 != future2) {
|
||||
xx = bc2 (*f2->first).left ();
|
||||
xx = bc2 (*f2).left ();
|
||||
}
|
||||
while (f1 != future1 && bc1 (*f1->first).left () == xx) {
|
||||
while (f1 != future1 && bc1 (*f1).left () == xx) {
|
||||
++f1;
|
||||
}
|
||||
while (f2 != future2 && bc2 (*f2->first).left () == xx) {
|
||||
while (f2 != future2 && bc2 (*f2).left () == xx) {
|
||||
++f2;
|
||||
}
|
||||
} while ((f1 != future1 || f2 != future2) && size_t (f1 - c1) + size_t (f2 - c2) < min_box_size);
|
||||
|
|
@ -886,7 +1004,7 @@ private:
|
|||
if (c1 != f1 && c2 != f2) {
|
||||
for (iterator_type1 i = c1; i != f1; ++i) {
|
||||
for (iterator_type2 j = c2; j < f2; ++j) {
|
||||
if (bs_boxes_overlap (bc1 (*i->first), bc2 (*j->first), enl)) {
|
||||
if (bs_boxes_overlap (bc1 (*i), bc2 (*j), enl)) {
|
||||
if (seen1.insert (std::make_pair (i->first, j->first)).second) {
|
||||
seen2.insert (std::make_pair (j->first, i->first));
|
||||
rec.add (i->first, i->second, j->first, j->second);
|
||||
|
|
|
|||
|
|
@ -401,6 +401,13 @@ DeepRegion::begin_merged () const
|
|||
}
|
||||
}
|
||||
|
||||
RegionIteratorDelegate *
|
||||
DeepRegion::begin_unmerged () const
|
||||
{
|
||||
ensure_unmerged_polygons_valid ();
|
||||
return begin ();
|
||||
}
|
||||
|
||||
std::pair<db::RecursiveShapeIterator, db::ICplxTrans>
|
||||
DeepRegion::begin_iter () const
|
||||
{
|
||||
|
|
@ -445,6 +452,13 @@ DeepRegion::begin_merged_iter () const
|
|||
}
|
||||
}
|
||||
|
||||
std::pair<db::RecursiveShapeIterator, db::ICplxTrans>
|
||||
DeepRegion::begin_unmerged_iter () const
|
||||
{
|
||||
ensure_unmerged_polygons_valid ();
|
||||
return begin_iter ();
|
||||
}
|
||||
|
||||
bool
|
||||
DeepRegion::empty () const
|
||||
{
|
||||
|
|
@ -787,6 +801,46 @@ DeepRegion::ensure_merged_polygons_valid () const
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
DeepRegion::ensure_unmerged_polygons_valid () const
|
||||
{
|
||||
if (! m_is_merged ||
|
||||
(deep_layer ().store ()->max_area_ratio () == 0.0 && deep_layer ().store ()->max_vertex_count () == 0)) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_merged_polygons = deep_layer ().derived ();
|
||||
db::DeepLayer &polygons = const_cast<db::DeepLayer &> (deep_layer ());
|
||||
|
||||
m_merged_polygons_valid = true;
|
||||
m_is_merged = false;
|
||||
m_merged_polygons_boc_hash = deep_layer ().breakout_cells_hash ();
|
||||
|
||||
db::Layout &layout = polygons.layout ();
|
||||
polygons.swap (m_merged_polygons);
|
||||
|
||||
for (db::Layout::iterator c = layout.begin (); c != layout.end (); ++c) {
|
||||
|
||||
const db::Shapes &s = c->shapes (m_merged_polygons.layer ());
|
||||
db::Shapes &st = c->shapes (deep_layer ().layer ());
|
||||
|
||||
db::PolygonRefToShapesGenerator pr (&layout, &st);
|
||||
db::PolygonSplitter splitter (pr, polygons.store ()->max_area_ratio (), polygons.store ()->max_vertex_count ());
|
||||
|
||||
splitter.start ();
|
||||
for (auto p = s.begin (db::ShapeIterator::All); ! p.at_end (); ++p) {
|
||||
if (p->is_polygon ()) {
|
||||
pr.set_prop_id (p->prop_id ());
|
||||
db::Polygon poly;
|
||||
p->polygon (poly);
|
||||
splitter.put (poly);
|
||||
}
|
||||
}
|
||||
splitter.flush ();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DeepRegion::set_is_merged (bool f)
|
||||
{
|
||||
|
|
@ -826,6 +880,140 @@ DeepRegion::nets (LayoutToNetlist *l2n, NetPropertyMode prop_mode, const tl::Var
|
|||
return new db::DeepRegion (result);
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
/**
|
||||
* @brief Implements a boolean AND or NOT operation with property handling
|
||||
*/
|
||||
class DB_PUBLIC PushHierLocalOperationWithProperties
|
||||
: public local_operation<db::object_with_properties<db::PolygonRef>, db::object_with_properties<db::PolygonRef>, db::object_with_properties<db::PolygonRef> >
|
||||
{
|
||||
public:
|
||||
PushHierLocalOperationWithProperties (double complexity_factor)
|
||||
: local_operation<db::object_with_properties<db::PolygonRef>, db::object_with_properties<db::PolygonRef>, db::object_with_properties<db::PolygonRef> > (),
|
||||
m_complexity_factor (complexity_factor)
|
||||
{
|
||||
// .. nothing yet ..
|
||||
}
|
||||
|
||||
OnEmptyIntruderHint on_empty_intruder_hint () const { return Copy; }
|
||||
|
||||
std::string description () const
|
||||
{
|
||||
return tl::to_string (tr ("'peel' operation"));
|
||||
}
|
||||
|
||||
|
||||
virtual void do_compute_local (db::Layout *layout, db::Cell * /*subject_cell*/, const shape_interactions<db::object_with_properties<db::PolygonRef>, db::object_with_properties<db::PolygonRef> > &interactions, std::vector<std::unordered_set<db::object_with_properties<db::PolygonRef> > > &results, const db::LocalProcessorBase *proc) const
|
||||
{
|
||||
tl_assert (results.size () == 1);
|
||||
auto &result = results.front ();
|
||||
|
||||
db::EdgeProcessor ep;
|
||||
|
||||
for (auto i = interactions.begin (); i != interactions.end (); ++i) {
|
||||
|
||||
const auto &subject = interactions.subject_shape (i->first);
|
||||
db::properties_id_type prop_id = subject.properties_id ();
|
||||
|
||||
if (i->second.empty ()) {
|
||||
|
||||
result.insert (subject);
|
||||
|
||||
} else {
|
||||
|
||||
ep.clear ();
|
||||
|
||||
const auto &subject = interactions.subject_shape (i->first);
|
||||
for (auto e = subject.begin_edge (); ! e.at_end(); ++e) {
|
||||
ep.insert (*e, 0);
|
||||
}
|
||||
|
||||
size_t p2 = 1;
|
||||
for (auto ii = i->second.begin (); ii != i->second.end (); ++ii) {
|
||||
const auto &intruder = interactions.intruder_shape (*ii);
|
||||
for (auto e = intruder.second.begin_edge (); ! e.at_end(); ++e) {
|
||||
ep.insert (*e, p2);
|
||||
}
|
||||
p2 += 2;
|
||||
}
|
||||
|
||||
std::unordered_set<db::object_with_properties<db::PolygonRef> > result1;
|
||||
|
||||
db::BooleanOp op (db::BooleanOp::ANotB);
|
||||
db::polygon_ref_generator_with_properties<db::object_with_properties<db::PolygonRef> > pr (layout, result1, prop_id);
|
||||
db::PolygonSplitter splitter (pr, proc->area_ratio (), proc->max_vertex_count ());
|
||||
db::PolygonGenerator pg (splitter, true, true);
|
||||
ep.set_base_verbosity (50);
|
||||
ep.process (pg, op);
|
||||
|
||||
if (result1.empty ()) {
|
||||
|
||||
// shortcut: nothing to do
|
||||
|
||||
} else if (m_complexity_factor < 0.0) {
|
||||
|
||||
// no complexity limit
|
||||
result.insert (result1.begin (), result1.end ());
|
||||
|
||||
} else if (m_complexity_factor == 0.0) {
|
||||
|
||||
// only remove shape if it is really entirely covered in this case
|
||||
result.insert (subject);
|
||||
|
||||
} else {
|
||||
|
||||
size_t vertices_before = subject.vertices ();
|
||||
size_t vertices_after = 0;
|
||||
for (auto r = result1.begin (); r != result1.end (); ++r) {
|
||||
vertices_after += r->vertices ();
|
||||
}
|
||||
|
||||
if (floor (0.5 + m_complexity_factor * vertices_before) >= vertices_after) {
|
||||
result.insert (result1.begin (), result1.end ());
|
||||
} else {
|
||||
result.insert (subject);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
double m_complexity_factor;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
RegionDelegate *
|
||||
DeepRegion::peel (double complexity_factor) const
|
||||
{
|
||||
if (empty ()) {
|
||||
// we can return "this", as this method is only intended for in-place execution inside Region
|
||||
return const_cast<DeepRegion *> (this);
|
||||
}
|
||||
|
||||
DeepLayer dl_out (deep_layer ().derived ());
|
||||
|
||||
PushHierLocalOperationWithProperties op (complexity_factor);
|
||||
|
||||
db::local_processor<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::PolygonRefWithProperties> proc (const_cast<db::Layout *> (&deep_layer ().layout ()), const_cast<db::Cell *> (&deep_layer ().initial_cell ()), deep_layer ().breakout_cells ());
|
||||
configure_proc (proc);
|
||||
proc.set_threads (deep_layer ().store ()->threads ());
|
||||
proc.set_area_ratio (deep_layer ().store ()->max_area_ratio ());
|
||||
proc.set_max_vertex_count (deep_layer ().store ()->max_vertex_count ());
|
||||
|
||||
// with this setting, only top-down interactions are considered
|
||||
proc.set_top_down (true);
|
||||
|
||||
proc.run (&op, deep_layer ().layer (), deep_layer ().layer (), dl_out.layer ());
|
||||
|
||||
return new DeepRegion (dl_out);
|
||||
}
|
||||
|
||||
RegionDelegate *
|
||||
DeepRegion::and_with (const Region &other, PropertyConstraint property_constraint) const
|
||||
{
|
||||
|
|
@ -922,6 +1110,10 @@ DeepRegion::andnot_with (const Region &other, PropertyConstraint property_constr
|
|||
DeepLayer
|
||||
DeepRegion::and_with_impl (const DeepRegion *other, db::PropertyConstraint property_constraint) const
|
||||
{
|
||||
// booleans run better on simple polygons
|
||||
ensure_unmerged_polygons_valid ();
|
||||
other->ensure_unmerged_polygons_valid ();
|
||||
|
||||
DeepLayer dl_out (deep_layer ().derived ());
|
||||
|
||||
if (pc_skip (property_constraint)) {
|
||||
|
|
@ -956,6 +1148,10 @@ DeepRegion::and_with_impl (const DeepRegion *other, db::PropertyConstraint prope
|
|||
DeepLayer
|
||||
DeepRegion::not_with_impl (const DeepRegion *other, db::PropertyConstraint property_constraint) const
|
||||
{
|
||||
// booleans run better on simple polygons
|
||||
ensure_unmerged_polygons_valid ();
|
||||
other->ensure_unmerged_polygons_valid ();
|
||||
|
||||
DeepLayer dl_out (deep_layer ().derived ());
|
||||
DeepLayer dl_prep;
|
||||
|
||||
|
|
@ -1059,6 +1255,10 @@ DeepRegion::not_with_impl (const DeepRegion *other, db::PropertyConstraint prope
|
|||
std::pair<DeepLayer, DeepLayer>
|
||||
DeepRegion::and_and_not_with (const DeepRegion *other, PropertyConstraint property_constraint) const
|
||||
{
|
||||
// booleans run better on simple polygons
|
||||
ensure_unmerged_polygons_valid ();
|
||||
other->ensure_unmerged_polygons_valid ();
|
||||
|
||||
DeepLayer dl_out1 (deep_layer ().derived ());
|
||||
DeepLayer dl_out2 (deep_layer ().derived ());
|
||||
|
||||
|
|
@ -1179,6 +1379,10 @@ DeepRegion::add_in_place (const Region &other)
|
|||
const DeepRegion *other_deep = dynamic_cast <const DeepRegion *> (other.delegate ());
|
||||
if (other_deep) {
|
||||
|
||||
// NOTE: as we don't benefit from merged shapes here, we prefer unmerged ones
|
||||
// for potentially better performance.
|
||||
other_deep->ensure_unmerged_polygons_valid ();
|
||||
|
||||
deep_layer ().add_from (other_deep->deep_layer ());
|
||||
|
||||
} else {
|
||||
|
|
@ -1885,6 +2089,10 @@ DeepRegion::sized (coord_type d, unsigned int mode) const
|
|||
return clone ();
|
||||
}
|
||||
|
||||
// in case of negative sizing the output polygons will still be merged (on positive sizing they might
|
||||
// overlap after size and are not necessarily merged)
|
||||
bool will_be_merged = (d < 0 && (merged_semantics () || is_merged ()));
|
||||
|
||||
const db::DeepLayer &polygons = merged_deep_layer ();
|
||||
|
||||
db::Layout &layout = const_cast<db::Layout &> (polygons.layout ());
|
||||
|
|
@ -1904,7 +2112,8 @@ DeepRegion::sized (coord_type d, unsigned int mode) const
|
|||
db::Shapes &st = c->shapes (res->deep_layer ().layer ());
|
||||
|
||||
db::PolygonRefToShapesGenerator pr (&layout, &st);
|
||||
db::PolygonGenerator pg2 (pr, false /*don't resolve holes*/, true /*min. coherence*/);
|
||||
db::PolygonSplitter splitter (pr, will_be_merged ? 0.0 : polygons.store ()->max_area_ratio (), will_be_merged ? 0 : polygons.store ()->max_vertex_count ());
|
||||
db::PolygonGenerator pg2 (splitter, false /*don't resolve holes*/, true /*min. coherence*/);
|
||||
db::SizingPolygonFilter siz (pg2, d_with_mag, d_with_mag, mode);
|
||||
|
||||
for (db::Shapes::shape_iterator si = s.begin (db::ShapeIterator::All); ! si.at_end (); ++si) {
|
||||
|
|
@ -1916,11 +2125,7 @@ DeepRegion::sized (coord_type d, unsigned int mode) const
|
|||
|
||||
}
|
||||
|
||||
// in case of negative sizing the output polygons will still be merged (on positive sizing they might
|
||||
// overlap after size and are not necessarily merged)
|
||||
if (d < 0 && (merged_semantics () || is_merged ())) {
|
||||
res->set_is_merged (true);
|
||||
}
|
||||
res->set_is_merged (will_be_merged);
|
||||
|
||||
return res.release ();
|
||||
}
|
||||
|
|
@ -1938,6 +2143,10 @@ DeepRegion::sized (coord_type dx, coord_type dy, unsigned int mode) const
|
|||
return sized (dx, mode);
|
||||
}
|
||||
|
||||
// in case of negative sizing the output polygons will still be merged (on positive sizing they might
|
||||
// overlap after size and are not necessarily merged)
|
||||
bool will_be_merged = (dx < 0 && dy < 0 && (merged_semantics () || is_merged ()));
|
||||
|
||||
const db::DeepLayer &polygons = merged_deep_layer ();
|
||||
|
||||
db::Layout &layout = const_cast<db::Layout &> (polygons.layout ());
|
||||
|
|
@ -1964,7 +2173,8 @@ DeepRegion::sized (coord_type dx, coord_type dy, unsigned int mode) const
|
|||
db::Shapes &st = c->shapes (res->deep_layer ().layer ());
|
||||
|
||||
db::PolygonRefToShapesGenerator pr (&layout, &st);
|
||||
db::PolygonGenerator pg2 (pr, false /*don't resolve holes*/, true /*min. coherence*/);
|
||||
db::PolygonSplitter splitter (pr, will_be_merged ? 0.0 : polygons.store ()->max_area_ratio (), will_be_merged ? 0 : polygons.store ()->max_vertex_count ());
|
||||
db::PolygonGenerator pg2 (splitter, false /*don't resolve holes*/, true /*min. coherence*/);
|
||||
db::SizingPolygonFilter siz (pg2, dx_with_mag, dy_with_mag, mode);
|
||||
|
||||
for (db::Shapes::shape_iterator si = s.begin (db::ShapeIterator::All); ! si.at_end (); ++si) {
|
||||
|
|
@ -1976,11 +2186,7 @@ DeepRegion::sized (coord_type dx, coord_type dy, unsigned int mode) const
|
|||
|
||||
}
|
||||
|
||||
// in case of negative sizing the output polygons will still be merged (on positive sizing they might
|
||||
// overlap after size and are not necessarily merged)
|
||||
if (dx < 0 && dy < 0 && (merged_semantics () || is_merged ())) {
|
||||
res->set_is_merged (true);
|
||||
}
|
||||
res->set_is_merged (will_be_merged);
|
||||
|
||||
return res.release ();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -66,9 +66,11 @@ public:
|
|||
|
||||
virtual RegionIteratorDelegate *begin () const;
|
||||
virtual RegionIteratorDelegate *begin_merged () const;
|
||||
virtual RegionIteratorDelegate *begin_unmerged () const;
|
||||
|
||||
virtual std::pair<db::RecursiveShapeIterator, db::ICplxTrans> begin_iter () const;
|
||||
virtual std::pair<db::RecursiveShapeIterator, db::ICplxTrans> begin_merged_iter () const;
|
||||
virtual std::pair<db::RecursiveShapeIterator, db::ICplxTrans> begin_unmerged_iter () const;
|
||||
|
||||
virtual bool empty () const;
|
||||
virtual bool is_merged () const;
|
||||
|
|
@ -138,6 +140,8 @@ public:
|
|||
virtual RegionDelegate *sized_inside (const Region &inside, bool outside, coord_type d, int steps, unsigned int mode) const;
|
||||
virtual RegionDelegate *sized_inside (const Region &inside, bool outside, coord_type dx, coord_type dy, int steps, unsigned int mode) const;
|
||||
|
||||
virtual RegionDelegate *peel (double complexity_factor) const;
|
||||
|
||||
virtual void insert_into (Layout *layout, db::cell_index_type into_cell, unsigned int into_layer) const;
|
||||
|
||||
virtual RegionDelegate *nets (LayoutToNetlist *l2n, NetPropertyMode prop_mode, const tl::Variant &net_prop_name, const std::vector<const Net *> *nets) const;
|
||||
|
|
@ -176,10 +180,11 @@ private:
|
|||
mutable DeepLayer m_merged_polygons;
|
||||
mutable bool m_merged_polygons_valid;
|
||||
mutable size_t m_merged_polygons_boc_hash;
|
||||
bool m_is_merged;
|
||||
mutable bool m_is_merged;
|
||||
|
||||
void init ();
|
||||
void ensure_merged_polygons_valid () const;
|
||||
void ensure_unmerged_polygons_valid () const;
|
||||
DeepLayer not_with_impl (const DeepRegion *other, PropertyConstraint property_constraint) const;
|
||||
DeepLayer and_with_impl (const DeepRegion *other, PropertyConstraint property_constraint) const;
|
||||
std::pair<DeepLayer, DeepLayer> and_and_not_with (const DeepRegion *other, PropertyConstraint property_constraint) const;
|
||||
|
|
|
|||
|
|
@ -232,6 +232,14 @@ bool DeepLayer::operator== (const DeepLayer &other) const
|
|||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
DeepLayer::swap (DeepLayer &other)
|
||||
{
|
||||
tl_assert (mp_store.get () == other.mp_store.get ());
|
||||
std::swap (m_layer, other.m_layer);
|
||||
std::swap (m_layout, other.m_layout);
|
||||
}
|
||||
|
||||
db::Layout &
|
||||
DeepLayer::layout ()
|
||||
{
|
||||
|
|
@ -563,13 +571,13 @@ static unsigned int init_layer (db::Layout &layout, const db::RecursiveShapeIter
|
|||
}
|
||||
|
||||
DeepShapeStore::DeepShapeStore ()
|
||||
: m_keep_layouts (true), m_wants_all_cells (false)
|
||||
: m_keep_layouts (true), m_wants_all_cells (false), m_sparse_array_limit (-1.0)
|
||||
{
|
||||
++s_instance_count;
|
||||
}
|
||||
|
||||
DeepShapeStore::DeepShapeStore (const std::string &topcell_name, double dbu)
|
||||
: m_keep_layouts (true), m_wants_all_cells (false)
|
||||
: m_keep_layouts (true), m_wants_all_cells (false), m_sparse_array_limit (-1.0)
|
||||
{
|
||||
++s_instance_count;
|
||||
|
||||
|
|
@ -857,6 +865,16 @@ bool DeepShapeStore::wants_all_cells () const
|
|||
return m_wants_all_cells;
|
||||
}
|
||||
|
||||
void DeepShapeStore::set_sparse_array_limit (double l)
|
||||
{
|
||||
m_sparse_array_limit = l;
|
||||
}
|
||||
|
||||
double DeepShapeStore::sparse_array_limit () const
|
||||
{
|
||||
return m_sparse_array_limit;
|
||||
}
|
||||
|
||||
void DeepShapeStore::set_reject_odd_polygons (bool f)
|
||||
{
|
||||
m_state.set_reject_odd_polygons (f);
|
||||
|
|
@ -1022,6 +1040,7 @@ DeepLayer DeepShapeStore::create_polygon_layer (const db::RecursiveShapeIterator
|
|||
db::HierarchyBuilder &builder = m_layouts[layout_index]->builder;
|
||||
|
||||
builder.set_wants_all_cells (m_wants_all_cells);
|
||||
builder.set_sparse_array_limit (m_sparse_array_limit);
|
||||
|
||||
unsigned int layer_index = init_layer (layout, si);
|
||||
builder.set_target_layer (layer_index);
|
||||
|
|
@ -1056,6 +1075,9 @@ DeepLayer DeepShapeStore::create_custom_layer (const db::RecursiveShapeIterator
|
|||
db::Layout &layout = m_layouts[layout_index]->layout;
|
||||
db::HierarchyBuilder &builder = m_layouts[layout_index]->builder;
|
||||
|
||||
builder.set_wants_all_cells (m_wants_all_cells);
|
||||
builder.set_sparse_array_limit (m_sparse_array_limit);
|
||||
|
||||
unsigned int layer_index = init_layer (layout, si);
|
||||
builder.set_target_layer (layer_index);
|
||||
|
||||
|
|
|
|||
|
|
@ -120,6 +120,11 @@ public:
|
|||
*/
|
||||
bool operator== (const DeepLayer &other) const;
|
||||
|
||||
/**
|
||||
* @brief Swap two layers
|
||||
*/
|
||||
void swap (DeepLayer &other);
|
||||
|
||||
/**
|
||||
* @brief Gets the layout object
|
||||
* The return value is guaranteed to be non-null.
|
||||
|
|
@ -696,6 +701,27 @@ public:
|
|||
*/
|
||||
bool wants_all_cells () const;
|
||||
|
||||
/**
|
||||
* @brief Sets the "sparse array" limit
|
||||
*
|
||||
* Sparse arrays are instance arrays whose bounding box is no longer a
|
||||
* good approximation of the covered area. The "sparse array ratio" is
|
||||
* the area of the bounding box divided by the area of the bounding box
|
||||
* of a single instance.
|
||||
*
|
||||
* Arrays above this limit will be resolved into single instances.
|
||||
*
|
||||
* Setting this value to 0 will resolve all arrays. Setting this
|
||||
* value to a negative value will never split arrays. The latter
|
||||
* is the default.
|
||||
*/
|
||||
void set_sparse_array_limit (double l);
|
||||
|
||||
/**
|
||||
* @brief Gets the "sparse array" limit
|
||||
*/
|
||||
double sparse_array_limit () const;
|
||||
|
||||
/**
|
||||
* @brief Sets a flag indicating whether to reject odd polygons
|
||||
*
|
||||
|
|
@ -853,6 +879,7 @@ private:
|
|||
std::list<DeepShapeStoreState> m_state_stack;
|
||||
bool m_keep_layouts;
|
||||
bool m_wants_all_cells;
|
||||
double m_sparse_array_limit;
|
||||
tl::Mutex m_lock;
|
||||
|
||||
struct DeliveryMappingCacheKey
|
||||
|
|
|
|||
|
|
@ -46,9 +46,11 @@ public:
|
|||
|
||||
virtual RegionIteratorDelegate *begin () const { return 0; }
|
||||
virtual RegionIteratorDelegate *begin_merged () const { return 0; }
|
||||
virtual RegionIteratorDelegate *begin_unmerged () const { return 0; }
|
||||
|
||||
virtual std::pair<db::RecursiveShapeIterator, db::ICplxTrans> begin_iter () const { return std::make_pair (db::RecursiveShapeIterator (), db::ICplxTrans ()); }
|
||||
virtual std::pair<db::RecursiveShapeIterator, db::ICplxTrans> begin_merged_iter () const { return std::make_pair (db::RecursiveShapeIterator (), db::ICplxTrans ()); }
|
||||
virtual std::pair<db::RecursiveShapeIterator, db::ICplxTrans> begin_unmerged_iter () const { return std::make_pair (db::RecursiveShapeIterator (), db::ICplxTrans ()); }
|
||||
|
||||
virtual bool empty () const { return true; }
|
||||
virtual size_t count () const { return 0; }
|
||||
|
|
@ -109,6 +111,8 @@ public:
|
|||
virtual RegionDelegate *add_in_place (const Region &other);
|
||||
virtual RegionDelegate *add (const Region &other) const;
|
||||
|
||||
virtual RegionDelegate *peel (double /*complexity_factor*/) const { return new EmptyRegion (); }
|
||||
|
||||
virtual RegionDelegate *selected_outside (const Region &) const { return new EmptyRegion (); }
|
||||
virtual RegionDelegate *selected_not_outside (const Region &) const { return new EmptyRegion (); }
|
||||
virtual std::pair<RegionDelegate *, RegionDelegate *> selected_outside_pair (const Region &) const { return std::make_pair (new EmptyRegion (), new EmptyRegion ()); }
|
||||
|
|
|
|||
|
|
@ -33,29 +33,33 @@ namespace db
|
|||
// -------------------------------------------------------------------------------------------------------------
|
||||
// FlatRegion implementation
|
||||
|
||||
FlatRegion::FlatRegion ()
|
||||
: MutableRegion (), mp_polygons (new db::Shapes (false)), mp_merged_polygons (new db::Shapes (false))
|
||||
FlatRegion::FlatRegion (double area_ratio, size_t max_vertex_count)
|
||||
: MutableRegion (), mp_polygons (new db::Shapes (false)), mp_merged_polygons (new db::Shapes (false)),
|
||||
m_area_ratio (area_ratio), m_max_vertex_count (max_vertex_count)
|
||||
{
|
||||
init ();
|
||||
}
|
||||
|
||||
FlatRegion::FlatRegion (const FlatRegion &other)
|
||||
: MutableRegion (other), mp_polygons (other.mp_polygons), mp_merged_polygons (other.mp_merged_polygons)
|
||||
: MutableRegion (other), mp_polygons (other.mp_polygons), mp_merged_polygons (other.mp_merged_polygons),
|
||||
m_area_ratio (other.m_area_ratio), m_max_vertex_count (other.m_max_vertex_count)
|
||||
{
|
||||
init ();
|
||||
m_is_merged = other.m_is_merged;
|
||||
m_merged_polygons_valid = other.m_merged_polygons_valid;
|
||||
}
|
||||
|
||||
FlatRegion::FlatRegion (const db::Shapes &polygons, bool is_merged)
|
||||
: MutableRegion (), mp_polygons (new db::Shapes (polygons)), mp_merged_polygons (new db::Shapes (false))
|
||||
FlatRegion::FlatRegion (const db::Shapes &polygons, bool is_merged, double area_ratio, size_t max_vertex_count)
|
||||
: MutableRegion (), mp_polygons (new db::Shapes (polygons)), mp_merged_polygons (new db::Shapes (false)),
|
||||
m_area_ratio (area_ratio), m_max_vertex_count (max_vertex_count)
|
||||
{
|
||||
init ();
|
||||
m_is_merged = is_merged;
|
||||
}
|
||||
|
||||
FlatRegion::FlatRegion (const db::Shapes &polygons, const db::ICplxTrans &trans, bool merged_semantics, bool is_merged)
|
||||
: MutableRegion (), mp_polygons (new db::Shapes (polygons)), mp_merged_polygons (new db::Shapes (false))
|
||||
FlatRegion::FlatRegion (const db::Shapes &polygons, const db::ICplxTrans &trans, bool merged_semantics, bool is_merged, double area_ratio, size_t max_vertex_count)
|
||||
: MutableRegion (), mp_polygons (new db::Shapes (polygons)), mp_merged_polygons (new db::Shapes (false)),
|
||||
m_area_ratio (area_ratio), m_max_vertex_count (max_vertex_count)
|
||||
{
|
||||
init ();
|
||||
m_is_merged = is_merged;
|
||||
|
|
@ -63,8 +67,9 @@ FlatRegion::FlatRegion (const db::Shapes &polygons, const db::ICplxTrans &trans,
|
|||
set_merged_semantics (merged_semantics);
|
||||
}
|
||||
|
||||
FlatRegion::FlatRegion (bool is_merged)
|
||||
: MutableRegion (), mp_polygons (new db::Shapes (false)), mp_merged_polygons (new db::Shapes (false))
|
||||
FlatRegion::FlatRegion (bool is_merged, double area_ratio, size_t max_vertex_count)
|
||||
: MutableRegion (), mp_polygons (new db::Shapes (false)), mp_merged_polygons (new db::Shapes (false)),
|
||||
m_area_ratio (area_ratio), m_max_vertex_count (max_vertex_count)
|
||||
{
|
||||
init ();
|
||||
m_is_merged = is_merged;
|
||||
|
|
@ -126,6 +131,20 @@ FlatRegion::ensure_merged_polygons_valid () const
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
FlatRegion::ensure_unmerged_polygons_valid () const
|
||||
{
|
||||
if (! m_is_merged || (m_area_ratio == 0.0 && m_max_vertex_count == 0)) {
|
||||
return;
|
||||
}
|
||||
|
||||
mp_merged_polygons.reset (new db::Shapes (*mp_polygons));
|
||||
m_merged_polygons_valid = true;
|
||||
m_is_merged = false;
|
||||
|
||||
break_polygons (*mp_polygons, m_max_vertex_count, m_area_ratio);
|
||||
}
|
||||
|
||||
RegionIteratorDelegate *FlatRegion::begin () const
|
||||
{
|
||||
return new FlatRegionIterator (mp_polygons.get_const ());
|
||||
|
|
@ -141,6 +160,12 @@ RegionIteratorDelegate *FlatRegion::begin_merged () const
|
|||
}
|
||||
}
|
||||
|
||||
RegionIteratorDelegate *FlatRegion::begin_unmerged () const
|
||||
{
|
||||
ensure_unmerged_polygons_valid ();
|
||||
return begin ();
|
||||
}
|
||||
|
||||
std::pair<db::RecursiveShapeIterator, db::ICplxTrans> FlatRegion::begin_iter () const
|
||||
{
|
||||
return std::make_pair (db::RecursiveShapeIterator (*mp_polygons), db::ICplxTrans ());
|
||||
|
|
@ -156,6 +181,12 @@ std::pair<db::RecursiveShapeIterator, db::ICplxTrans> FlatRegion::begin_merged_i
|
|||
}
|
||||
}
|
||||
|
||||
std::pair<db::RecursiveShapeIterator, db::ICplxTrans> FlatRegion::begin_unmerged_iter () const
|
||||
{
|
||||
ensure_unmerged_polygons_valid ();
|
||||
return begin_iter ();
|
||||
}
|
||||
|
||||
bool FlatRegion::empty () const
|
||||
{
|
||||
return mp_polygons->empty ();
|
||||
|
|
|
|||
|
|
@ -51,10 +51,10 @@ public:
|
|||
typedef db::layer<db::PolygonWithProperties, db::unstable_layer_tag> polygon_layer_wp_type;
|
||||
typedef polygon_layer_wp_type::iterator polygon_iterator_wp_type;
|
||||
|
||||
FlatRegion ();
|
||||
FlatRegion (const db::Shapes &polygons, bool is_merged = false);
|
||||
FlatRegion (const db::Shapes &polygons, const db::ICplxTrans &trans, bool merged_semantics, bool is_merged = false);
|
||||
FlatRegion (bool is_merged);
|
||||
FlatRegion (double area_ratio = 0.0, size_t max_vertex_count = 0);
|
||||
FlatRegion (const db::Shapes &polygons, bool is_merged = false, double area_ratio = 0.0, size_t max_vertex_count = 0);
|
||||
FlatRegion (const db::Shapes &polygons, const db::ICplxTrans &trans, bool merged_semantics, bool is_merged = false, double area_ratio = 0.0, size_t max_vertex_count = 0);
|
||||
FlatRegion (bool is_merged, double area_ratio = 0.0, size_t max_vertex_count = 0);
|
||||
|
||||
FlatRegion (const FlatRegion &other);
|
||||
|
||||
|
|
@ -69,9 +69,11 @@ public:
|
|||
|
||||
virtual RegionIteratorDelegate *begin () const;
|
||||
virtual RegionIteratorDelegate *begin_merged () const;
|
||||
virtual RegionIteratorDelegate *begin_unmerged () const;
|
||||
|
||||
virtual std::pair<db::RecursiveShapeIterator, db::ICplxTrans> begin_iter () const;
|
||||
virtual std::pair<db::RecursiveShapeIterator, db::ICplxTrans> begin_merged_iter () const;
|
||||
virtual std::pair<db::RecursiveShapeIterator, db::ICplxTrans> begin_unmerged_iter () const;
|
||||
|
||||
virtual bool empty () const;
|
||||
virtual size_t count () const;
|
||||
|
|
@ -143,13 +145,16 @@ private:
|
|||
|
||||
FlatRegion &operator= (const FlatRegion &other);
|
||||
|
||||
bool m_is_merged;
|
||||
mutable bool m_is_merged;
|
||||
mutable tl::copy_on_write_ptr<db::Shapes> mp_polygons;
|
||||
mutable tl::copy_on_write_ptr<db::Shapes> mp_merged_polygons;
|
||||
mutable bool m_merged_polygons_valid;
|
||||
double m_area_ratio;
|
||||
size_t m_max_vertex_count;
|
||||
|
||||
void init ();
|
||||
void ensure_merged_polygons_valid () const;
|
||||
void ensure_unmerged_polygons_valid () const;
|
||||
|
||||
template <class Trans>
|
||||
void transform_generic (const Trans &trans)
|
||||
|
|
|
|||
|
|
@ -20,7 +20,6 @@
|
|||
|
||||
*/
|
||||
|
||||
|
||||
#include "dbHierNetworkProcessor.h"
|
||||
#include "dbShape.h"
|
||||
#include "dbShapes.h"
|
||||
|
|
@ -1794,7 +1793,7 @@ public:
|
|||
cell_clusters_box_converter (const db::Layout &layout, const hier_clusters<T> &tree)
|
||||
: mp_layout (&layout), mp_tree (&tree)
|
||||
{
|
||||
// .. nothing yet ..
|
||||
m_cache.resize (layout.cells (), 0);
|
||||
}
|
||||
|
||||
const box_type &operator() (const db::CellInst &cell_inst) const
|
||||
|
|
@ -1804,10 +1803,10 @@ public:
|
|||
|
||||
const box_type &operator() (db::cell_index_type cell_index) const
|
||||
{
|
||||
typename std::map<db::cell_index_type, box_type>::const_iterator b = m_cache.find (cell_index);
|
||||
if (b != m_cache.end ()) {
|
||||
const box_type *b = m_cache [cell_index];
|
||||
if (b) {
|
||||
|
||||
return b->second;
|
||||
return *b;
|
||||
|
||||
} else {
|
||||
|
||||
|
|
@ -1820,13 +1819,17 @@ public:
|
|||
box += inst_array.bbox (*this);
|
||||
}
|
||||
|
||||
return m_cache.insert (std::make_pair (cell_index, box)).first->second;
|
||||
m_cached_boxes.push_front (box);
|
||||
b = m_cached_boxes.begin ().operator-> ();
|
||||
m_cache [cell_index] = b;
|
||||
return *b;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
mutable std::map<db::cell_index_type, box_type> m_cache;
|
||||
mutable std::vector<const box_type *> m_cache;
|
||||
mutable tl::slist<box_type> m_cached_boxes;
|
||||
const db::Layout *mp_layout;
|
||||
const hier_clusters<T> *mp_tree;
|
||||
};
|
||||
|
|
@ -1889,8 +1892,8 @@ namespace
|
|||
*/
|
||||
template <class T>
|
||||
struct hc_receiver
|
||||
: public db::box_scanner_receiver<db::Instance, unsigned int>,
|
||||
public db::box_scanner_receiver2<local_cluster<T>, unsigned int, db::Instance, unsigned int>
|
||||
: public db::box_scanner_receiver<db::Instance, db::Box>,
|
||||
public db::box_scanner_receiver2<local_cluster<T>, db::Box, db::Instance, db::Box>
|
||||
{
|
||||
public:
|
||||
typedef typename hier_clusters<T>::box_type box_type;
|
||||
|
|
@ -1960,7 +1963,7 @@ public:
|
|||
/**
|
||||
* @brief Receiver main event for instance-to-instance interactions
|
||||
*/
|
||||
void add (const db::Instance *i1, unsigned int /*p1*/, const db::Instance *i2, unsigned int /*p2*/)
|
||||
void add (const db::Instance *i1, db::Box /*p1*/, const db::Instance *i2, db::Box /*p2*/)
|
||||
{
|
||||
db::ICplxTrans t;
|
||||
|
||||
|
|
@ -1973,7 +1976,7 @@ public:
|
|||
/**
|
||||
* @brief Single-instance treatment - may be required because of interactions between array members
|
||||
*/
|
||||
void finish (const db::Instance *i, unsigned int /*p1*/)
|
||||
void finish (const db::Instance *i, db::Box /*p1*/)
|
||||
{
|
||||
consider_single_inst (*i);
|
||||
}
|
||||
|
|
@ -1981,7 +1984,7 @@ public:
|
|||
/**
|
||||
* @brief Receiver main event for local-to-instance interactions
|
||||
*/
|
||||
void add (const local_cluster<T> *c1, unsigned int /*p1*/, const db::Instance *i2, unsigned int /*p2*/)
|
||||
void add (const local_cluster<T> *c1, db::Box /*p1*/, const db::Instance *i2, db::Box /*p2*/)
|
||||
{
|
||||
std::list<ClusterInstanceInteraction> ic;
|
||||
|
||||
|
|
@ -1993,10 +1996,10 @@ public:
|
|||
}
|
||||
|
||||
/**
|
||||
* @brief Finally join the clusters in the join set
|
||||
* @brief Finally generate cluster-to-instance interactions and join the clusters in the join set
|
||||
*
|
||||
* This step is postponed because doing this while the iteration happens would
|
||||
* invalidate the box trees.
|
||||
* invalidate the box trees and disturb the propagation mechanism.
|
||||
*/
|
||||
void finish_cluster_to_instance_interactions ()
|
||||
{
|
||||
|
|
@ -2081,7 +2084,7 @@ private:
|
|||
const db::Connectivity *mp_conn;
|
||||
const std::set<db::cell_index_type> *mp_breakout_cells;
|
||||
typedef std::list<std::set<id_type> > join_set_list;
|
||||
std::map<id_type, typename join_set_list::iterator> m_cm2join_map;
|
||||
std::unordered_map<id_type, typename join_set_list::iterator> m_cm2join_map;
|
||||
join_set_list m_cm2join_sets;
|
||||
std::map<std::pair<size_t, size_t>, int> m_soft_connections;
|
||||
std::list<ClusterInstanceInteraction> m_ci_interactions;
|
||||
|
|
@ -2551,8 +2554,8 @@ private:
|
|||
return;
|
||||
}
|
||||
|
||||
typename std::map<id_type, typename join_set_list::iterator>::const_iterator x = m_cm2join_map.find (a);
|
||||
typename std::map<id_type, typename join_set_list::iterator>::const_iterator y = m_cm2join_map.find (b);
|
||||
typename std::unordered_map<id_type, typename join_set_list::iterator>::const_iterator x = m_cm2join_map.find (a);
|
||||
typename std::unordered_map<id_type, typename join_set_list::iterator>::const_iterator y = m_cm2join_map.find (b);
|
||||
|
||||
if (x == m_cm2join_map.end ()) {
|
||||
|
||||
|
|
@ -2579,6 +2582,11 @@ private:
|
|||
|
||||
} else if (x->second != y->second) {
|
||||
|
||||
// the y set should be the smaller one for better efficiency
|
||||
if (x->second->size () < y->second->size ()) {
|
||||
std::swap (x, y);
|
||||
}
|
||||
|
||||
// join two superclusters
|
||||
typename join_set_list::iterator yset = y->second;
|
||||
x->second->insert (yset->begin (), yset->end ());
|
||||
|
|
@ -2591,12 +2599,12 @@ private:
|
|||
|
||||
#if defined(DEBUG_HIER_NETWORK_PROCESSOR)
|
||||
// concistency check for debugging
|
||||
for (typename std::map<id_type, typename join_set_list::iterator>::const_iterator j = m_cm2join_map.begin (); j != m_cm2join_map.end (); ++j) {
|
||||
for (auto j = m_cm2join_map.begin (); j != m_cm2join_map.end (); ++j) {
|
||||
tl_assert (j->second->find (j->first) != j->second->end ());
|
||||
}
|
||||
|
||||
for (typename std::list<std::set<id_type> >::const_iterator i = m_cm2join_sets.begin (); i != m_cm2join_sets.end (); ++i) {
|
||||
for (typename std::set<id_type>::const_iterator j = i->begin(); j != i->end(); ++j) {
|
||||
for (auto i = m_cm2join_sets.begin (); i != m_cm2join_sets.end (); ++i) {
|
||||
for (auto j = i->begin(); j != i->end(); ++j) {
|
||||
tl_assert(m_cm2join_map.find (*j) != m_cm2join_map.end ());
|
||||
tl_assert(m_cm2join_map[*j] == i);
|
||||
}
|
||||
|
|
@ -2604,8 +2612,8 @@ private:
|
|||
|
||||
// the sets must be disjunct
|
||||
std::set<id_type> all;
|
||||
for (typename std::list<std::set<id_type> >::const_iterator i = m_cm2join_sets.begin (); i != m_cm2join_sets.end (); ++i) {
|
||||
for (typename std::set<id_type>::const_iterator j = i->begin(); j != i->end(); ++j) {
|
||||
for (auto i = m_cm2join_sets.begin (); i != m_cm2join_sets.end (); ++i) {
|
||||
for (auto j = i->begin(); j != i->end(); ++j) {
|
||||
tl_assert(all.find (*j) == all.end());
|
||||
all.insert(*j);
|
||||
}
|
||||
|
|
@ -2700,23 +2708,13 @@ private:
|
|||
} else if (x1 != x2) {
|
||||
|
||||
int soft = ic->soft;
|
||||
|
||||
// for instance-to-instance interactions the number of connections is more important for the
|
||||
// cost of the join operation: make the one with more connections the target
|
||||
// TODO: this will be SLOW for STL's not providing a fast size()
|
||||
if (mp_cell_clusters->connections_for_cluster (x1).size () < mp_cell_clusters->connections_for_cluster (x2).size ()) {
|
||||
std::swap (x1, x2);
|
||||
soft = -soft;
|
||||
}
|
||||
|
||||
if (soft != 0) {
|
||||
|
||||
register_soft_connection (x1, x2, soft);
|
||||
|
||||
} else {
|
||||
|
||||
mp_cell_clusters->join_cluster_with (x1, x2);
|
||||
mp_cell_clusters->remove_cluster (x2);
|
||||
mark_to_join (x1, x2);
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -3081,15 +3079,15 @@ hier_clusters<T>::build_hier_connections (cell_clusters_box_converter<T> &cbc, c
|
|||
static std::string desc = tl::to_string (tr ("Instance to instance treatment"));
|
||||
tl::SelfTimer timer (tl::verbosity () > m_base_verbosity + 30, desc);
|
||||
|
||||
db::box_scanner<db::Instance, unsigned int> bs (true, desc);
|
||||
db::box_scanner<db::Instance, db::Box> bs (true, desc);
|
||||
|
||||
for (std::vector<db::Instance>::const_iterator inst = inst_storage.begin (); inst != inst_storage.end (); ++inst) {
|
||||
if (! is_breakout_cell (breakout_cells, inst->cell_index ())) {
|
||||
bs.insert (inst.operator-> (), 0);
|
||||
bs.insert (inst.operator-> (), cibc (*inst));
|
||||
}
|
||||
}
|
||||
|
||||
bs.process (*rec, 1 /*touching*/, cibc);
|
||||
bs.process_with_adaptor (*rec, 1 /*touching*/);
|
||||
}
|
||||
|
||||
// handle local to instance connections
|
||||
|
|
@ -3101,7 +3099,8 @@ hier_clusters<T>::build_hier_connections (cell_clusters_box_converter<T> &cbc, c
|
|||
static std::string desc = tl::to_string (tr ("Local to instance treatment"));
|
||||
tl::SelfTimer timer (tl::verbosity () > m_base_verbosity + 30, desc);
|
||||
|
||||
db::box_scanner2<db::local_cluster<T>, unsigned int, db::Instance, unsigned int> bs2 (true, desc);
|
||||
local_cluster_box_convert<T> lcbc;
|
||||
db::box_scanner2<db::local_cluster<T>, db::Box, db::Instance, db::Box> bs2 (true, desc);
|
||||
|
||||
for (typename connected_clusters<T>::const_iterator c = local.begin (); c != local.end (); ++c) {
|
||||
|
||||
|
|
@ -3110,22 +3109,23 @@ hier_clusters<T>::build_hier_connections (cell_clusters_box_converter<T> &cbc, c
|
|||
std::back_insert_iterator<std::list<local_cluster<T> > > iout = std::back_inserter (heap);
|
||||
size_t n = c->split (area_ratio, iout);
|
||||
if (n == 0) {
|
||||
bs2.insert1 (c.operator-> (), 0);
|
||||
bs2.insert1 (c.operator-> (), lcbc (*c));
|
||||
} else {
|
||||
typename std::list<local_cluster<T> >::iterator h = heap.end ();
|
||||
while (n-- > 0) {
|
||||
bs2.insert1 ((--h).operator-> (), 0);
|
||||
--h;
|
||||
bs2.insert1 (h.operator-> (), lcbc (*h));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (std::vector<db::Instance>::const_iterator inst = inst_storage.begin (); inst != inst_storage.end (); ++inst) {
|
||||
if (! is_breakout_cell (breakout_cells, inst->cell_index ())) {
|
||||
bs2.insert2 (inst.operator-> (), 0);
|
||||
bs2.insert2 (inst.operator-> (), cibc (*inst));
|
||||
}
|
||||
}
|
||||
|
||||
bs2.process (*rec, 1 /*touching*/, local_cluster_box_convert<T> (), cibc);
|
||||
bs2.process_with_adaptor (*rec, 1 /*touching*/);
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -744,7 +744,7 @@ local_processor_result_computation_task<TS, TI, TR>::perform ()
|
|||
// LocalProcessorBase implementation
|
||||
|
||||
LocalProcessorBase::LocalProcessorBase ()
|
||||
: m_report_progress (true), m_nthreads (0), m_max_vertex_count (0), m_area_ratio (0.0), m_boolean_core (false),
|
||||
: m_report_progress (true), m_nthreads (0), m_max_vertex_count (0), m_area_ratio (0.0), m_top_down (false), m_boolean_core (false),
|
||||
m_base_verbosity (30), mp_vars (0), mp_current_cell (0)
|
||||
{
|
||||
// .. nothing yet ..
|
||||
|
|
@ -1034,84 +1034,90 @@ void local_processor<TS, TI, TR>::compute_contexts (local_processor_contexts<TS,
|
|||
}
|
||||
}
|
||||
|
||||
// TODO: can we shortcut this if interactions is empty?
|
||||
for (std::vector<unsigned int>::const_iterator il = contexts.intruder_layers ().begin (); il != contexts.intruder_layers ().end (); ++il) {
|
||||
// in top-down mode we are not interested in cell-to-cell interactions, nor shape-to-instance interactions
|
||||
// except local ones (shape-to-child cells), hence we skip this part
|
||||
if (! top_down ()) {
|
||||
|
||||
db::box_convert <db::CellInstArray, true> inst_bci (*mp_intruder_layout, contexts.actual_intruder_layer (*il));
|
||||
// TODO: can we shortcut this if interactions is empty?
|
||||
for (std::vector<unsigned int>::const_iterator il = contexts.intruder_layers ().begin (); il != contexts.intruder_layers ().end (); ++il) {
|
||||
|
||||
db::box_scanner2<db::CellInstArray, int, db::CellInstArray, int> scanner;
|
||||
interaction_registration_inst2inst<TS, TI, TR> rec (mp_subject_layout, contexts.subject_layer (), mp_intruder_layout, contexts.actual_intruder_layer (*il), contexts.is_foreign (*il), dist, &interactions);
|
||||
db::box_convert <db::CellInstArray, true> inst_bci (*mp_intruder_layout, contexts.actual_intruder_layer (*il));
|
||||
|
||||
unsigned int id = 0;
|
||||
db::box_scanner2<db::CellInstArray, int, db::CellInstArray, int> scanner;
|
||||
interaction_registration_inst2inst<TS, TI, TR> rec (mp_subject_layout, contexts.subject_layer (), mp_intruder_layout, contexts.actual_intruder_layer (*il), contexts.is_foreign (*il), dist, &interactions);
|
||||
|
||||
if (subject_cell == intruder_cell) {
|
||||
unsigned int id = 0;
|
||||
|
||||
// Use the same id's for same instances - this way we can easily detect same instances
|
||||
// and don't make them self-interacting
|
||||
if (subject_cell == intruder_cell) {
|
||||
|
||||
for (db::Cell::const_iterator i = subject_cell->begin (); !i.at_end (); ++i) {
|
||||
unsigned int iid = ++id;
|
||||
if (! inst_bcs (i->cell_inst ()).empty () && ! subject_cell_is_breakout (i->cell_index ())) {
|
||||
scanner.insert1 (&i->cell_inst (), iid);
|
||||
}
|
||||
if (! inst_bci (i->cell_inst ()).empty () && ! intruder_cell_is_breakout (i->cell_index ())) {
|
||||
scanner.insert2 (&i->cell_inst (), iid);
|
||||
}
|
||||
}
|
||||
// Use the same id's for same instances - this way we can easily detect same instances
|
||||
// and don't make them self-interacting
|
||||
|
||||
} else {
|
||||
|
||||
for (db::Cell::const_iterator i = subject_cell->begin (); !i.at_end (); ++i) {
|
||||
if (! inst_bcs (i->cell_inst ()).empty () && ! subject_cell_is_breakout (i->cell_index ())) {
|
||||
scanner.insert1 (&i->cell_inst (), ++id);
|
||||
}
|
||||
}
|
||||
|
||||
if (intruder_cell) {
|
||||
for (db::Cell::const_iterator i = intruder_cell->begin (); !i.at_end (); ++i) {
|
||||
for (db::Cell::const_iterator i = subject_cell->begin (); !i.at_end (); ++i) {
|
||||
unsigned int iid = ++id;
|
||||
if (! inst_bcs (i->cell_inst ()).empty () && ! subject_cell_is_breakout (i->cell_index ())) {
|
||||
scanner.insert1 (&i->cell_inst (), iid);
|
||||
}
|
||||
if (! inst_bci (i->cell_inst ()).empty () && ! intruder_cell_is_breakout (i->cell_index ())) {
|
||||
scanner.insert2 (&i->cell_inst (), ++id);
|
||||
scanner.insert2 (&i->cell_inst (), iid);
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
for (db::Cell::const_iterator i = subject_cell->begin (); !i.at_end (); ++i) {
|
||||
if (! inst_bcs (i->cell_inst ()).empty () && ! subject_cell_is_breakout (i->cell_index ())) {
|
||||
scanner.insert1 (&i->cell_inst (), ++id);
|
||||
}
|
||||
}
|
||||
|
||||
if (intruder_cell) {
|
||||
for (db::Cell::const_iterator i = intruder_cell->begin (); !i.at_end (); ++i) {
|
||||
if (! inst_bci (i->cell_inst ()).empty () && ! intruder_cell_is_breakout (i->cell_index ())) {
|
||||
scanner.insert2 (&i->cell_inst (), ++id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
for (std::set<db::CellInstArray>::const_iterator i = intruders.first.begin (); i != intruders.first.end (); ++i) {
|
||||
if (! inst_bci (*i).empty ()) {
|
||||
scanner.insert2 (i.operator-> (), ++id);
|
||||
}
|
||||
}
|
||||
|
||||
scanner.process (rec, dist, inst_bcs, inst_bci);
|
||||
|
||||
}
|
||||
|
||||
for (std::set<db::CellInstArray>::const_iterator i = intruders.first.begin (); i != intruders.first.end (); ++i) {
|
||||
if (! inst_bci (*i).empty ()) {
|
||||
scanner.insert2 (i.operator-> (), ++id);
|
||||
if (! intruders.second.empty () || ! intruder_shapes.empty ()) {
|
||||
|
||||
db::box_scanner2<db::CellInstArray, int, TI, int> scanner;
|
||||
db::addressable_object_from_shape<TI> heap;
|
||||
interaction_registration_inst2shape<TS, TI, TR> rec (mp_subject_layout, contexts.subject_layer (), dist, &interactions);
|
||||
|
||||
for (db::Cell::const_iterator i = subject_cell->begin (); !i.at_end (); ++i) {
|
||||
if (! inst_bcs (i->cell_inst ()).empty () && ! subject_cell_is_breakout (i->cell_index ())) {
|
||||
scanner.insert1 (&i->cell_inst (), 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
scanner.process (rec, dist, inst_bcs, inst_bci);
|
||||
|
||||
}
|
||||
|
||||
if (! intruders.second.empty () || ! intruder_shapes.empty ()) {
|
||||
|
||||
db::box_scanner2<db::CellInstArray, int, TI, int> scanner;
|
||||
db::addressable_object_from_shape<TI> heap;
|
||||
interaction_registration_inst2shape<TS, TI, TR> rec (mp_subject_layout, contexts.subject_layer (), dist, &interactions);
|
||||
|
||||
for (db::Cell::const_iterator i = subject_cell->begin (); !i.at_end (); ++i) {
|
||||
if (! inst_bcs (i->cell_inst ()).empty () && ! subject_cell_is_breakout (i->cell_index ())) {
|
||||
scanner.insert1 (&i->cell_inst (), 0);
|
||||
for (typename std::map<unsigned int, std::set<TI> >::const_iterator il = intruders.second.begin (); il != intruders.second.end (); ++il) {
|
||||
for (typename std::set<TI>::const_iterator i = il->second.begin (); i != il->second.end (); ++i) {
|
||||
scanner.insert2 (i.operator-> (), il->first);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (typename std::map<unsigned int, std::set<TI> >::const_iterator il = intruders.second.begin (); il != intruders.second.end (); ++il) {
|
||||
for (typename std::set<TI>::const_iterator i = il->second.begin (); i != il->second.end (); ++i) {
|
||||
scanner.insert2 (i.operator-> (), il->first);
|
||||
for (std::map<unsigned int, const db::Shapes *>::const_iterator im = intruder_shapes.begin (); im != intruder_shapes.end (); ++im) {
|
||||
for (db::Shapes::shape_iterator i = im->second->begin (shape_flags<TI> ()); !i.at_end (); ++i) {
|
||||
scanner.insert2 (heap (*i), im->first);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (std::map<unsigned int, const db::Shapes *>::const_iterator im = intruder_shapes.begin (); im != intruder_shapes.end (); ++im) {
|
||||
for (db::Shapes::shape_iterator i = im->second->begin (shape_flags<TI> ()); !i.at_end (); ++i) {
|
||||
scanner.insert2 (heap (*i), im->first);
|
||||
}
|
||||
}
|
||||
scanner.process (rec, dist, inst_bcs, db::box_convert<TI> ());
|
||||
|
||||
scanner.process (rec, dist, inst_bcs, db::box_convert<TI> ());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -1417,14 +1423,14 @@ local_processor<TS, TI, TR>::compute_local_cell (const db::local_processor_conte
|
|||
}
|
||||
}
|
||||
|
||||
// local shapes vs. child cell
|
||||
|
||||
db::box_convert<db::CellInstArray, true> inst_bci (*mp_intruder_layout, ail);
|
||||
|
||||
typename std::map<unsigned int, std::set<TI> >::const_iterator ipl = intruders.second.find (*il);
|
||||
static std::set<TI> empty_intruders;
|
||||
|
||||
if (! subject_shapes->empty () && (intruder_shapes || ipl != intruders.second.end ())) {
|
||||
// local shapes vs. local shapes
|
||||
|
||||
if (! top_down () && ! subject_shapes->empty () && (intruder_shapes || ipl != intruders.second.end ())) {
|
||||
|
||||
if (subject_cell == intruder_cell && contexts.subject_layer () == ail && !foreign) {
|
||||
|
||||
|
|
@ -1439,6 +1445,8 @@ local_processor<TS, TI, TR>::compute_local_cell (const db::local_processor_conte
|
|||
|
||||
}
|
||||
|
||||
// local shapes vs. child cells
|
||||
|
||||
if (! subject_shapes->empty () && ! ((! intruder_cell || intruder_cell->begin ().at_end ()) && intruders.first.empty ())) {
|
||||
|
||||
db::box_scanner2<TS, int, db::CellInstArray, int> scanner;
|
||||
|
|
@ -1452,7 +1460,7 @@ local_processor<TS, TI, TR>::compute_local_cell (const db::local_processor_conte
|
|||
|
||||
unsigned int inst_id = 0;
|
||||
|
||||
if (subject_cell == intruder_cell && contexts.subject_layer () == ail && !foreign) {
|
||||
if (! top_down () && subject_cell == intruder_cell && contexts.subject_layer () == ail && !foreign) {
|
||||
|
||||
// Same cell, same layer -> no shape to child instance interactions because this will be taken care of
|
||||
// by the instances themselves (and their intruders). This also means, we prefer to deal with
|
||||
|
|
|
|||
|
|
@ -465,6 +465,16 @@ public:
|
|||
return m_nthreads;
|
||||
}
|
||||
|
||||
void set_top_down (bool f)
|
||||
{
|
||||
m_top_down = f;
|
||||
}
|
||||
|
||||
bool top_down () const
|
||||
{
|
||||
return m_top_down;
|
||||
}
|
||||
|
||||
void set_max_vertex_count (size_t max_vertex_count)
|
||||
{
|
||||
m_max_vertex_count = max_vertex_count;
|
||||
|
|
@ -525,6 +535,7 @@ private:
|
|||
unsigned int m_nthreads;
|
||||
size_t m_max_vertex_count;
|
||||
double m_area_ratio;
|
||||
bool m_top_down;
|
||||
bool m_boolean_core;
|
||||
int m_base_verbosity;
|
||||
const db::VariantsCollectorBase *mp_vars;
|
||||
|
|
|
|||
|
|
@ -152,14 +152,14 @@ static std::pair<bool, std::set<db::Box> > compute_clip_variant (const db::Box &
|
|||
}
|
||||
|
||||
HierarchyBuilder::HierarchyBuilder (db::Layout *target, unsigned int target_layer, const db::ICplxTrans &trans, HierarchyBuilderShapeReceiver *pipe)
|
||||
: mp_target (target), m_target_layer (target_layer), m_wants_all_cells (false), m_trans (trans)
|
||||
: mp_target (target), m_target_layer (target_layer), m_wants_all_cells (false), m_trans (trans), m_sparse_array_limit (-1.0)
|
||||
{
|
||||
set_shape_receiver (pipe);
|
||||
reset ();
|
||||
}
|
||||
|
||||
HierarchyBuilder::HierarchyBuilder (db::Layout *target, const db::ICplxTrans &trans, HierarchyBuilderShapeReceiver *pipe)
|
||||
: mp_target (target), m_target_layer (0), m_wants_all_cells (false), m_trans (trans)
|
||||
: mp_target (target), m_target_layer (0), m_wants_all_cells (false), m_trans (trans), m_sparse_array_limit (-1.0)
|
||||
{
|
||||
set_shape_receiver (pipe);
|
||||
reset ();
|
||||
|
|
@ -396,13 +396,56 @@ HierarchyBuilder::new_inst (const RecursiveShapeIterator *iter, const db::CellIn
|
|||
|
||||
// for new cells, create this instance
|
||||
if (m_cell_stack.back ().first || m_cm_new_entry) {
|
||||
db::CellInstArray new_inst (inst, &mp_target->array_repository ());
|
||||
new_inst.object () = db::CellInst (new_cell);
|
||||
new_inst.transform (always_apply);
|
||||
new_inst.transform_into (m_trans);
|
||||
for (std::vector<db::Cell *>::const_iterator c = m_cell_stack.back ().second.begin (); c != m_cell_stack.back ().second.end (); ++c) {
|
||||
(*c)->insert (new_inst);
|
||||
|
||||
// check if the cell array is "sparse" according to
|
||||
// "sparse_array_limit" and resolve into single instances if so
|
||||
bool resolve = false;
|
||||
if (m_sparse_array_limit >= 0.0 && inst.size () > 1) {
|
||||
|
||||
if (m_sparse_array_limit == 0.0) {
|
||||
resolve = true;
|
||||
} else {
|
||||
db::box_convert<db::CellInst> bc (*iter->layout ());
|
||||
auto a1 = bc (inst.object ()).area ();
|
||||
auto aa = inst.bbox (bc).area ();
|
||||
if (a1 * m_sparse_array_limit * inst.size () < aa) {
|
||||
resolve = true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (resolve) {
|
||||
|
||||
// resolve the instances of the array
|
||||
for (auto i = inst.begin (); !i.at_end (); ++i) {
|
||||
|
||||
db::CellInstArray new_inst;
|
||||
if (inst.is_complex ()) {
|
||||
new_inst = db::CellInstArray (db::CellInst (new_cell), inst.complex_trans (*i));
|
||||
} else {
|
||||
new_inst = db::CellInstArray (db::CellInst (new_cell), *i);
|
||||
}
|
||||
new_inst.transform (always_apply);
|
||||
new_inst.transform_into (m_trans);
|
||||
for (std::vector<db::Cell *>::const_iterator c = m_cell_stack.back ().second.begin (); c != m_cell_stack.back ().second.end (); ++c) {
|
||||
(*c)->insert (new_inst);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
db::CellInstArray new_inst (inst, &mp_target->array_repository ());
|
||||
new_inst.object () = db::CellInst (new_cell);
|
||||
new_inst.transform (always_apply);
|
||||
new_inst.transform_into (m_trans);
|
||||
for (std::vector<db::Cell *>::const_iterator c = m_cell_stack.back ().second.begin (); c != m_cell_stack.back ().second.end (); ++c) {
|
||||
(*c)->insert (new_inst);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// To see the cell once, use NI_single. If we did see the cell already, skip the whole instance array.
|
||||
|
|
|
|||
|
|
@ -314,6 +314,25 @@ public:
|
|||
m_wants_all_cells = f;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sets the "sparse array" limit
|
||||
*
|
||||
* Sparse arrays are instance arrays whose bounding box is no longer a
|
||||
* good approximation of the covered area. The "sparse array ratio" is
|
||||
* the area of the bounding box divided by the area of the bounding box
|
||||
* of a single instance.
|
||||
*
|
||||
* Arrays above this limit will be resolved into single instances.
|
||||
*
|
||||
* Setting this value to 0 will resolve all arrays. Setting this
|
||||
* value to a negative value will never split arrays. The latter
|
||||
* is the default.
|
||||
*/
|
||||
void set_sparse_array_limit (double l)
|
||||
{
|
||||
m_sparse_array_limit = l;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Reset the builder - performs a new initial pass
|
||||
*/
|
||||
|
|
@ -440,6 +459,8 @@ private:
|
|||
db::Cell *mp_initial_cell;
|
||||
|
||||
db::ICplxTrans m_trans;
|
||||
|
||||
double m_sparse_array_limit;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -317,6 +317,12 @@ OriginalLayerRegion::begin_merged () const
|
|||
}
|
||||
}
|
||||
|
||||
RegionIteratorDelegate *
|
||||
OriginalLayerRegion::begin_unmerged () const
|
||||
{
|
||||
return begin ();
|
||||
}
|
||||
|
||||
std::pair<db::RecursiveShapeIterator, db::ICplxTrans>
|
||||
OriginalLayerRegion::begin_iter () const
|
||||
{
|
||||
|
|
@ -334,6 +340,12 @@ OriginalLayerRegion::begin_merged_iter () const
|
|||
}
|
||||
}
|
||||
|
||||
std::pair<db::RecursiveShapeIterator, db::ICplxTrans>
|
||||
OriginalLayerRegion::begin_unmerged_iter () const
|
||||
{
|
||||
return std::make_pair (m_iter, m_iter_trans);
|
||||
}
|
||||
|
||||
bool
|
||||
OriginalLayerRegion::empty () const
|
||||
{
|
||||
|
|
|
|||
|
|
@ -51,9 +51,11 @@ public:
|
|||
|
||||
virtual RegionIteratorDelegate *begin () const;
|
||||
virtual RegionIteratorDelegate *begin_merged () const;
|
||||
virtual RegionIteratorDelegate *begin_unmerged () const;
|
||||
|
||||
virtual std::pair<db::RecursiveShapeIterator, db::ICplxTrans> begin_iter () const;
|
||||
virtual std::pair<db::RecursiveShapeIterator, db::ICplxTrans> begin_merged_iter () const;
|
||||
virtual std::pair<db::RecursiveShapeIterator, db::ICplxTrans> begin_unmerged_iter () const;
|
||||
|
||||
virtual bool empty () const;
|
||||
|
||||
|
|
|
|||
|
|
@ -349,6 +349,17 @@ public:
|
|||
return RegionIterator (mp_delegate->begin_merged ());
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Returns the unmerged polygons
|
||||
*
|
||||
* "unmerged" polygons are polygons which are optimized for local operations,
|
||||
* specifically broken according to the area ratio and max vertex count.
|
||||
*/
|
||||
const_iterator begin_unmerged () const
|
||||
{
|
||||
return RegionIterator (mp_delegate->begin_unmerged ());
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Delivers a RecursiveShapeIterator pointing to the polygons plus the necessary transformation
|
||||
*/
|
||||
|
|
@ -365,6 +376,14 @@ public:
|
|||
return mp_delegate->begin_merged_iter ();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Delivers a RecursiveShapeIterator pointing to the unmerged polygons plus the necessary transformation
|
||||
*/
|
||||
std::pair<db::RecursiveShapeIterator, db::ICplxTrans> begin_unmerged_iter () const
|
||||
{
|
||||
return mp_delegate->begin_unmerged_iter ();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Inserts the given shape (working object) into the region
|
||||
*/
|
||||
|
|
@ -1312,6 +1331,25 @@ public:
|
|||
return std::make_pair (Region (res.first), Region (res.second));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief For deep regions, remove parts of shapes which are covered by child cell shapes (push shapes into hierarchy)
|
||||
*
|
||||
* This will reduce the hierarchical load. This means that shapes that do not add information
|
||||
* will be removed, so their interactions with child cells does not need to be considered.
|
||||
* These shapes are - maybe partially - "peeled" from upper hierarchy layers.
|
||||
*
|
||||
* The complexity factor indicates by how much the complexity of the resulting polygons
|
||||
* (counted in terms of vertexes) can increase before a shape is left as it was.
|
||||
* A negative complexity factor indicates, that no such limit exists. A zero complexity factor
|
||||
* means that only shapes are removed if they are covered entirely by shapes from below the
|
||||
* hierarchy.
|
||||
*/
|
||||
Region &peel (double complexity_factor = 0.0)
|
||||
{
|
||||
set_delegate (mp_delegate->peel (complexity_factor));
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Selects all polygons of this region which are completely outside polygons from the other region
|
||||
*
|
||||
|
|
|
|||
|
|
@ -185,9 +185,11 @@ public:
|
|||
|
||||
virtual RegionIteratorDelegate *begin () const = 0;
|
||||
virtual RegionIteratorDelegate *begin_merged () const = 0;
|
||||
virtual RegionIteratorDelegate *begin_unmerged () const = 0;
|
||||
|
||||
virtual std::pair<db::RecursiveShapeIterator, db::ICplxTrans> begin_iter () const = 0;
|
||||
virtual std::pair<db::RecursiveShapeIterator, db::ICplxTrans> begin_merged_iter () const = 0;
|
||||
virtual std::pair<db::RecursiveShapeIterator, db::ICplxTrans> begin_unmerged_iter () const = 0;
|
||||
|
||||
virtual bool empty () const = 0;
|
||||
virtual bool is_box () const = 0;
|
||||
|
|
@ -246,6 +248,8 @@ public:
|
|||
virtual RegionDelegate *add (const Region &other) const = 0;
|
||||
virtual std::pair<RegionDelegate *, RegionDelegate *> andnot_with (const Region &other, PropertyConstraint prop_constraint) const = 0;
|
||||
|
||||
virtual RegionDelegate *peel (double complexity_factor) const = 0;
|
||||
|
||||
virtual RegionDelegate *selected_outside (const Region &other) const = 0;
|
||||
virtual RegionDelegate *selected_not_outside (const Region &other) const = 0;
|
||||
virtual std::pair<RegionDelegate *, RegionDelegate *> selected_outside_pair (const Region &other) const = 0;
|
||||
|
|
|
|||
|
|
@ -124,6 +124,27 @@ private:
|
|||
db::Shapes *mp_shapes;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief A shape delivery implementation for polygons with properties
|
||||
*/
|
||||
template <>
|
||||
struct DB_PUBLIC shape_collection_processor_delivery<db::PolygonWithProperties>
|
||||
{
|
||||
shape_collection_processor_delivery (db::Layout *layout, db::Shapes *shapes)
|
||||
: mp_layout (layout), mp_shapes (shapes)
|
||||
{ }
|
||||
|
||||
void put (const db::PolygonWithProperties &result)
|
||||
{
|
||||
tl::MutexLocker locker (&mp_layout->lock ());
|
||||
mp_shapes->insert (db::PolygonRefWithProperties (db::PolygonRef (result, mp_layout->shape_repository ()), result.properties_id ()));
|
||||
}
|
||||
|
||||
private:
|
||||
db::Layout *mp_layout;
|
||||
db::Shapes *mp_shapes;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief A shape delivery implementation for texts
|
||||
*/
|
||||
|
|
@ -145,6 +166,27 @@ private:
|
|||
db::Shapes *mp_shapes;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief A shape delivery implementation for texts with properties
|
||||
*/
|
||||
template <>
|
||||
struct DB_PUBLIC shape_collection_processor_delivery<db::TextWithProperties>
|
||||
{
|
||||
shape_collection_processor_delivery (db::Layout *layout, db::Shapes *shapes)
|
||||
: mp_layout (layout), mp_shapes (shapes)
|
||||
{ }
|
||||
|
||||
void put (const db::TextWithProperties &result)
|
||||
{
|
||||
tl::MutexLocker locker (&mp_layout->lock ());
|
||||
mp_shapes->insert (db::TextRefWithProperties (db::TextRef (result, mp_layout->shape_repository ()), result.properties_id ()));
|
||||
}
|
||||
|
||||
private:
|
||||
db::Layout *mp_layout;
|
||||
db::Shapes *mp_shapes;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief A generic delivery
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -126,6 +126,26 @@ Class<db::DeepShapeStore> decl_dbDeepShapeStore ("db", "DeepShapeStore",
|
|||
"@brief Gets a flag wether to copy the full hierarchy for the working layouts\n"
|
||||
"This attribute has been introduced in version 0.28.10."
|
||||
) +
|
||||
gsi::method ("sparse_array_limit=", &db::DeepShapeStore::set_sparse_array_limit, gsi::arg ("limit"),
|
||||
"@brief Sets the \"sparse array\" limit\n"
|
||||
"\n"
|
||||
"Sparse arrays are instance arrays whose bounding box is no longer a\n"
|
||||
"good approximation of the covered area. The \"sparse array ratio\" is\n"
|
||||
"the area of the bounding box divided by the area of the bounding box\n"
|
||||
"of a single instance.\n"
|
||||
"\n"
|
||||
"Arrays above this limit will be resolved into single instances.\n"
|
||||
"\n"
|
||||
"Setting this value to 0 will resolve all arrays. Setting this\n"
|
||||
"value to a negative value will never split arrays. The latter\n"
|
||||
"is the default.\n"
|
||||
"\n"
|
||||
"This attribute has been introduced in version 0.30.8."
|
||||
) +
|
||||
gsi::method ("sparse_array_limit", &db::DeepShapeStore::sparse_array_limit,
|
||||
"@brief Gets the \"sparse array\" limit\n"
|
||||
"This attribute has been introduced in version 0.30.8."
|
||||
) +
|
||||
gsi::method ("reject_odd_polygons=", &db::DeepShapeStore::set_reject_odd_polygons, gsi::arg ("count"),
|
||||
"@brief Sets a flag indicating whether to reject odd polygons\n"
|
||||
"\n"
|
||||
|
|
@ -259,6 +279,9 @@ Class<db::DeepShapeStore> decl_dbDeepShapeStore ("db", "DeepShapeStore",
|
|||
"\n"
|
||||
"This method has been added in version 0.26.1\n"
|
||||
) +
|
||||
gsi::method ("layout", static_cast<db::Layout &(db::DeepShapeStore::*) (unsigned int)> (&db::DeepShapeStore::layout), gsi::arg ("index"),
|
||||
"@hide"
|
||||
) +
|
||||
gsi::method ("push_state", &db::DeepShapeStore::push_state,
|
||||
"@brief Pushes the store's state on the state state\n"
|
||||
"This will save the stores state (\\threads, \\max_vertex_count, \\max_area_ratio, breakout cells ...) on "
|
||||
|
|
|
|||
|
|
@ -2732,6 +2732,20 @@ Class<db::Region> decl_Region (decl_dbShapeCollection, "db", "Region",
|
|||
"\n"
|
||||
"This method has been introduced in version 0.29.3."
|
||||
) +
|
||||
method ("peel", &db::Region::peel, gsi::arg ("complexity_factor", -1.0, "unlimited"),
|
||||
"@brief Removes shapes parts which are overlapping with child cell shapes, reducing hierarchical load.\n"
|
||||
"\n"
|
||||
"This method will reduce the hierarchical load. This means that shapes that do not add information\n"
|
||||
"will be removed, so their interactions with child cells does not need to be considered.\n"
|
||||
"These shapes are - maybe partially - \"peeled\" from upper hierarchy layers.\n"
|
||||
"\n"
|
||||
"The complexity factor determines if the subtraction is rejected when the complexity - measured as polygon "
|
||||
"vertex count - increases by more than the given factor. This allows trading off hierarchical complexity vs. "
|
||||
"polygon complexity. A negative factor means no rejection. A factor of zero means that only shapes are removed "
|
||||
"which are entirely covered by shapes from below the hierarchy.\n"
|
||||
"\n"
|
||||
"This method has been introduced in version 0.30.8."
|
||||
) +
|
||||
method_ext ("andnot", &andnot, gsi::arg ("other"), gsi::arg ("property_constraint", db::IgnoreProperties, "IgnoreProperties"),
|
||||
"@brief Returns the boolean AND and NOT between self and the other region\n"
|
||||
"\n"
|
||||
|
|
|
|||
|
|
@ -3158,3 +3158,186 @@ TEST(deep_region_merged_with_pseudo_labels)
|
|||
rr2.merge ();
|
||||
EXPECT_EQ (rr2.to_string (), "(0,0;0,2000;2000,2000;2000,0){A=>17,B=>42};(998,2998;998,3002;1002,3002;1002,2998)");
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
class AttachPropertiesProcessor
|
||||
: public db::PolygonProcessorBase
|
||||
{
|
||||
public:
|
||||
AttachPropertiesProcessor (db::properties_id_type pid)
|
||||
: m_pid (pid)
|
||||
{ }
|
||||
|
||||
virtual void process (const db::PolygonWithProperties &s, std::vector<db::PolygonWithProperties> &res) const
|
||||
{
|
||||
res.push_back (db::PolygonWithProperties (s, m_pid));
|
||||
}
|
||||
|
||||
virtual bool result_is_merged () const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
db::properties_id_type m_pid;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
TEST(deep_unmerged_regions)
|
||||
{
|
||||
db::Layout ly;
|
||||
|
||||
db::Cell &top = ly.cell (ly.add_cell ("TOP"));
|
||||
|
||||
unsigned int l1 = ly.insert_layer (db::LayerProperties (1, 0));
|
||||
unsigned int l2 = ly.insert_layer (db::LayerProperties (2, 0));
|
||||
|
||||
top.shapes (l1).insert (db::Box (0, 0, 2000, 2000));
|
||||
top.shapes (l2).insert (db::Box (200, 200, 1800, 1800));
|
||||
|
||||
db::DeepShapeStore dss;
|
||||
dss.set_max_area_ratio (2.0);
|
||||
|
||||
db::Region r1 (db::RecursiveShapeIterator (ly, top, l1), dss);
|
||||
db::Region r2 (db::RecursiveShapeIterator (ly, top, l2), dss);
|
||||
|
||||
db::DeepRegion *r1_deep = dynamic_cast<db::DeepRegion *> (r1.delegate ());
|
||||
EXPECT_EQ (r1_deep->is_merged (), false);
|
||||
EXPECT_EQ (r1_deep->merged_polygons_available (), false);
|
||||
|
||||
db::Region r12 = (r1 - r2).merged ();
|
||||
EXPECT_EQ (r12.to_string (), "(0,0;0,2000;2000,2000;2000,0/200,200;1800,200;1800,1800;200,1800)");
|
||||
db::DeepRegion *r12_deep = dynamic_cast<db::DeepRegion *> (r12.delegate ());
|
||||
|
||||
EXPECT_EQ (r12_deep->is_merged (), true);
|
||||
EXPECT_EQ (r12_deep->merged_polygons_available (), true);
|
||||
|
||||
// this will force r12 back into unmerged state, but merged polygons are still available
|
||||
db::Region rx = r1 | r12;
|
||||
|
||||
EXPECT_EQ (r12_deep->is_merged (), false);
|
||||
EXPECT_EQ (r12_deep->merged_polygons_available (), true);
|
||||
EXPECT_EQ (r12.to_string (), "(200,0;200,200;2000,200;2000,0);(1800,200;1800,1000;2000,1000;2000,200);(0,0;0,1000;200,1000;200,0);(1800,1000;1800,2000;2000,2000;2000,1000);(0,1000;0,1800;200,1800;200,1000);(0,1800;0,2000;1800,2000;1800,1800)");
|
||||
EXPECT_EQ (rx.to_string (), "(0,0;0,2000;2000,2000;2000,0)");
|
||||
|
||||
// repeat with properties
|
||||
|
||||
db::PropertiesSet ps;
|
||||
ps.insert (tl::Variant ("n"), tl::Variant (42));
|
||||
auto pid = db::properties_id (ps);
|
||||
AttachPropertiesProcessor ap (pid);
|
||||
r12 = (r1 - r2).merged ().processed (ap);
|
||||
|
||||
EXPECT_EQ (r12.to_string (), "(0,0;0,2000;2000,2000;2000,0/200,200;1800,200;1800,1800;200,1800){n=>42}");
|
||||
r12_deep = dynamic_cast<db::DeepRegion *> (r12.delegate ());
|
||||
|
||||
EXPECT_EQ (r12_deep->is_merged (), true);
|
||||
EXPECT_EQ (r12_deep->merged_polygons_available (), true);
|
||||
|
||||
rx = r1 | r12;
|
||||
|
||||
EXPECT_EQ (r12_deep->is_merged (), false);
|
||||
EXPECT_EQ (r12_deep->merged_polygons_available (), true);
|
||||
EXPECT_EQ (r12.to_string (), "(200,0;200,200;2000,200;2000,0){n=>42};(1800,200;1800,1000;2000,1000;2000,200){n=>42};(0,0;0,1000;200,1000;200,0){n=>42};(1800,1000;1800,2000;2000,2000;2000,1000){n=>42};(0,1000;0,1800;200,1800;200,1000){n=>42};(0,1800;0,2000;1800,2000;1800,1800){n=>42}");
|
||||
EXPECT_EQ (rx.to_string (), "(0,0;0,2000;2000,2000;2000,0);(0,0;0,2000;2000,2000;2000,0/200,200;1800,200;1800,1800;200,1800){n=>42}");
|
||||
|
||||
// now with "+" instead of "|"
|
||||
|
||||
db::Region r12p = (r1 - r2).merged ();
|
||||
db::DeepRegion *r12p_deep = dynamic_cast<db::DeepRegion *> (r12p.delegate ());
|
||||
|
||||
EXPECT_EQ (r12p_deep->is_merged (), true);
|
||||
EXPECT_EQ (r12p_deep->merged_polygons_available (), true);
|
||||
|
||||
// this will also force r12 back into unmerged state, but merged polygons are still available
|
||||
db::Region ry = (r1 + r12p).merged ();
|
||||
|
||||
EXPECT_EQ (r12p_deep->is_merged (), false);
|
||||
EXPECT_EQ (r12p_deep->merged_polygons_available (), true);
|
||||
EXPECT_EQ (r12p.to_string (), "(200,0;200,200;2000,200;2000,0);(1800,200;1800,1000;2000,1000;2000,200);(0,0;0,1000;200,1000;200,0);(1800,1000;1800,2000;2000,2000;2000,1000);(0,1000;0,1800;200,1800;200,1000);(0,1800;0,2000;1800,2000;1800,1800)");
|
||||
EXPECT_EQ (ry.to_string (), "(0,0;0,2000;2000,2000;2000,0)");
|
||||
}
|
||||
|
||||
TEST(processed_delivers_polygon_refs)
|
||||
{
|
||||
db::Layout ly;
|
||||
|
||||
db::Cell &top = ly.cell (ly.add_cell ("TOP"));
|
||||
|
||||
unsigned int l1 = ly.insert_layer (db::LayerProperties (1, 0));
|
||||
unsigned int l2 = ly.insert_layer (db::LayerProperties (2, 0));
|
||||
|
||||
top.shapes (l1).insert (db::Box (0, 0, 2000, 2000));
|
||||
top.shapes (l2).insert (db::Box (200, 200, 1800, 1800));
|
||||
|
||||
db::DeepShapeStore dss;
|
||||
|
||||
db::Region r1 (db::RecursiveShapeIterator (ly, top, l1), dss);
|
||||
db::Region r2 (db::RecursiveShapeIterator (ly, top, l2), dss);
|
||||
|
||||
db::PropertiesSet ps;
|
||||
ps.insert (tl::Variant ("n"), tl::Variant (42));
|
||||
auto pid = db::properties_id (ps);
|
||||
AttachPropertiesProcessor ap (pid);
|
||||
|
||||
db::Region r12 = (r1 - r2).merged ().processed (ap);
|
||||
|
||||
r12.set_join_properties_on_merge (true);
|
||||
|
||||
db::Region rx = r1 | r12;
|
||||
|
||||
EXPECT_EQ (rx.to_string (), "(0,0;0,2000;2000,2000;2000,0);(0,0;0,2000;2000,2000;2000,0/200,200;1800,200;1800,1800;200,1800){n=>42}");
|
||||
}
|
||||
|
||||
TEST(deep_region_peel)
|
||||
{
|
||||
db::Layout ly;
|
||||
{
|
||||
std::string fn (tl::testdata ());
|
||||
fn += "/algo/deep_region_peel.gds";
|
||||
tl::InputStream stream (fn);
|
||||
db::Reader reader (stream);
|
||||
reader.read (ly);
|
||||
}
|
||||
|
||||
db::cell_index_type top_cell_index = *ly.begin_top_down ();
|
||||
db::Cell &top_cell = ly.cell (top_cell_index);
|
||||
|
||||
db::DeepShapeStore dss;
|
||||
|
||||
unsigned int l1 = ly.get_layer (db::LayerProperties (1, 0));
|
||||
unsigned int l2 = ly.get_layer (db::LayerProperties (2, 0));
|
||||
|
||||
db::RecursiveShapeIterator si1 (ly, top_cell, l1);
|
||||
si1.apply_property_translator (db::PropertiesTranslator::make_pass_all ());
|
||||
|
||||
db::RecursiveShapeIterator si2 (ly, top_cell, l2);
|
||||
si2.apply_property_translator (db::PropertiesTranslator::make_pass_all ());
|
||||
|
||||
db::Region r1 (si1, dss);
|
||||
db::Region r2 (si2, dss);
|
||||
|
||||
unsigned int l1001 = ly.get_layer (db::LayerProperties (1001, 0));
|
||||
unsigned int l1002 = ly.get_layer (db::LayerProperties (1002, 0));
|
||||
unsigned int l1011 = ly.get_layer (db::LayerProperties (1011, 0));
|
||||
unsigned int l1012 = ly.get_layer (db::LayerProperties (1012, 0));
|
||||
unsigned int l1021 = ly.get_layer (db::LayerProperties (1021, 0));
|
||||
unsigned int l1022 = ly.get_layer (db::LayerProperties (1022, 0));
|
||||
unsigned int l1031 = ly.get_layer (db::LayerProperties (1031, 0));
|
||||
unsigned int l1032 = ly.get_layer (db::LayerProperties (1032, 0));
|
||||
|
||||
db::Region (r1).peel (-1.0).insert_into (&ly, top_cell_index, l1001);
|
||||
db::Region (r2).peel (-1.0).insert_into (&ly, top_cell_index, l1002);
|
||||
db::Region (r1).peel (0.0).insert_into (&ly, top_cell_index, l1011);
|
||||
db::Region (r2).peel (0.0).insert_into (&ly, top_cell_index, l1012);
|
||||
db::Region (r1).peel (2.0).insert_into (&ly, top_cell_index, l1021);
|
||||
db::Region (r2).peel (2.0).insert_into (&ly, top_cell_index, l1022);
|
||||
db::Region (r1).peel (4.0).insert_into (&ly, top_cell_index, l1031);
|
||||
db::Region (r2).peel (4.0).insert_into (&ly, top_cell_index, l1032);
|
||||
|
||||
CHECKPOINT();
|
||||
db::compare_layouts (_this, ly, tl::testdata () + "/algo/deep_region_peel_au.gds");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -376,3 +376,111 @@ TEST(8_RestoreWithCellSelection3)
|
|||
db::compare_layouts (_this, ly, tl::testdata () + "/algo/dss_bug3_au.gds");
|
||||
}
|
||||
|
||||
TEST(9_sparse_array_limit)
|
||||
{
|
||||
db::Layout ly;
|
||||
|
||||
{
|
||||
std::string fn (tl::testdata ());
|
||||
fn += "/algo/dss_sparse_array.gds";
|
||||
tl::InputStream stream (fn);
|
||||
db::Reader reader (stream);
|
||||
reader.read (ly);
|
||||
}
|
||||
|
||||
unsigned int l2 = ly.get_layer (db::LayerProperties (2, 0));
|
||||
unsigned int l1 = ly.get_layer (db::LayerProperties (1, 0));
|
||||
unsigned int l12 = ly.get_layer (db::LayerProperties (12, 0));
|
||||
unsigned int l11 = ly.get_layer (db::LayerProperties (11, 0));
|
||||
|
||||
db::Cell &top_cell = ly.cell (*ly.begin_top_down ());
|
||||
|
||||
db::RecursiveShapeIterator in_it1 (ly, top_cell, l1);
|
||||
db::RecursiveShapeIterator in_it2 (ly, top_cell, l2);
|
||||
|
||||
{
|
||||
db::DeepShapeStore dss;
|
||||
EXPECT_EQ (dss.sparse_array_limit (), -1.0);
|
||||
|
||||
db::Region in_region1 (in_it1, dss);
|
||||
db::Region in_region2 (in_it2, dss);
|
||||
|
||||
const db::Layout &dss_ly = dss.layout (0);
|
||||
const db::Cell &dss_top_cell = dss_ly.cell (*dss_ly.begin_top_down ());
|
||||
size_t n_inst = 0;
|
||||
size_t n_total = 0;
|
||||
for (auto i = dss_top_cell.begin (); ! i.at_end (); ++i) {
|
||||
++n_inst;
|
||||
n_total += i->size ();
|
||||
}
|
||||
|
||||
// 2 arrays, 1 single inst
|
||||
EXPECT_EQ (n_inst, size_t (3));
|
||||
EXPECT_EQ (n_total, size_t (19));
|
||||
|
||||
in_region1.sized (1000).insert_into (&ly, top_cell.cell_index (), l11);
|
||||
in_region2.sized (1000).insert_into (&ly, top_cell.cell_index (), l12);
|
||||
|
||||
db::compare_layouts (_this, ly, tl::testdata () + "/algo/dss_sparse_array_au1.gds");
|
||||
}
|
||||
|
||||
ly.clear_layer (l11);
|
||||
ly.clear_layer (l12);
|
||||
|
||||
{
|
||||
db::DeepShapeStore dss;
|
||||
dss.set_sparse_array_limit (8.0);
|
||||
EXPECT_EQ (dss.sparse_array_limit (), 8.0);
|
||||
|
||||
db::Region in_region1 (in_it1, dss);
|
||||
db::Region in_region2 (in_it2, dss);
|
||||
|
||||
const db::Layout &dss_ly = dss.layout (0);
|
||||
const db::Cell &dss_top_cell = dss_ly.cell (*dss_ly.begin_top_down ());
|
||||
size_t n_inst = 0;
|
||||
size_t n_total = 0;
|
||||
for (auto i = dss_top_cell.begin (); ! i.at_end (); ++i) {
|
||||
++n_inst;
|
||||
n_total += i->size ();
|
||||
}
|
||||
|
||||
// 1 array, 1 single inst, 1 3x3 array resolved (=9)
|
||||
EXPECT_EQ (n_inst, size_t (11));
|
||||
EXPECT_EQ (n_total, size_t (19));
|
||||
|
||||
in_region1.sized (1000).insert_into (&ly, top_cell.cell_index (), l11);
|
||||
in_region2.sized (1000).insert_into (&ly, top_cell.cell_index (), l12);
|
||||
|
||||
db::compare_layouts (_this, ly, tl::testdata () + "/algo/dss_sparse_array_au1.gds");
|
||||
}
|
||||
|
||||
ly.clear_layer (l11);
|
||||
ly.clear_layer (l12);
|
||||
|
||||
{
|
||||
db::DeepShapeStore dss;
|
||||
dss.set_sparse_array_limit (1.1);
|
||||
|
||||
db::Region in_region1 (in_it1, dss);
|
||||
db::Region in_region2 (in_it2, dss);
|
||||
|
||||
const db::Layout &dss_ly = dss.layout (0);
|
||||
const db::Cell &dss_top_cell = dss_ly.cell (*dss_ly.begin_top_down ());
|
||||
size_t n_inst = 0;
|
||||
size_t n_total = 0;
|
||||
for (auto i = dss_top_cell.begin (); ! i.at_end (); ++i) {
|
||||
++n_inst;
|
||||
n_total += i->size ();
|
||||
}
|
||||
|
||||
// 2 3x3 arrays resolved, 1 single inst
|
||||
EXPECT_EQ (n_inst, size_t (19));
|
||||
EXPECT_EQ (n_total, size_t (19));
|
||||
|
||||
in_region1.sized (1000).insert_into (&ly, top_cell.cell_index (), l11);
|
||||
in_region2.sized (1000).insert_into (&ly, top_cell.cell_index (), l12);
|
||||
|
||||
db::compare_layouts (_this, ly, tl::testdata () + "/algo/dss_sparse_array_au1.gds");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -375,7 +375,7 @@ TEST(1_BasicExtraction)
|
|||
EXPECT_EQ (qnet_name (l2n.probe_net (*rmetal1, db::DPoint (5.3, 0.0))), "RINGO:VSS");
|
||||
|
||||
EXPECT_EQ (qnet_name (l2n.probe_net (*rmetal1, db::DPoint (2.6, 1.0))), "RINGO:$I39");
|
||||
EXPECT_EQ (qnet_name (l2n.probe_net (*rmetal1, db::DPoint (6.4, 1.0))), "RINGO:$I2");
|
||||
EXPECT_EQ (qnet_name (l2n.probe_net (*rmetal1, db::DPoint (6.4, 1.0))), "RINGO:$I12");
|
||||
|
||||
// test build_all_nets
|
||||
|
||||
|
|
@ -576,7 +576,7 @@ TEST(1_BasicExtraction)
|
|||
EXPECT_EQ (qnet_name (l2n.probe_net (*rmetal1, db::DPoint (5.3, 0.0))), "RINGO:VSS");
|
||||
|
||||
EXPECT_EQ (qnet_name (l2n.probe_net (*rmetal1, db::DPoint (2.6, 1.0))), "RINGO:$I39");
|
||||
EXPECT_EQ (qnet_name (l2n.probe_net (*rmetal1, db::DPoint (6.4, 1.0))), "RINGO:$I2");
|
||||
EXPECT_EQ (qnet_name (l2n.probe_net (*rmetal1, db::DPoint (6.4, 1.0))), "RINGO:$I12");
|
||||
|
||||
// use this opportunity to check joining of nets with cluster joining
|
||||
db::Circuit *top = l2n.netlist ()->circuit_by_name ("RINGO");
|
||||
|
|
@ -616,7 +616,7 @@ TEST(1_BasicExtraction)
|
|||
EXPECT_EQ (qnet_name (l2n.probe_net (*rmetal1, db::DPoint (5.3, 0.0))), "RINGO:VDD,VSS");
|
||||
|
||||
EXPECT_EQ (qnet_name (l2n.probe_net (*rmetal1, db::DPoint (2.6, 1.0))), "RINGO:$I39");
|
||||
EXPECT_EQ (qnet_name (l2n.probe_net (*rmetal1, db::DPoint (6.4, 1.0))), "RINGO:$I2");
|
||||
EXPECT_EQ (qnet_name (l2n.probe_net (*rmetal1, db::DPoint (6.4, 1.0))), "RINGO:$I12");
|
||||
|
||||
// compare the collected test data
|
||||
|
||||
|
|
|
|||
|
|
@ -2024,6 +2024,27 @@ See <a href="#enclosing">enclosing</a> for more details about the various ways t
|
|||
</tr>
|
||||
</table>
|
||||
</p>
|
||||
<a name="sparse_array_limit"/><h2>"sparse_array_limit" - Gets or sets the sparse array singularization limit</h2>
|
||||
<keyword name="sparse_array_limit"/>
|
||||
<p>Usage:</p>
|
||||
<ul>
|
||||
<li><tt>sparse_array_limit(limit)</tt></li>
|
||||
<li><tt>sparse_array_limit</tt></li>
|
||||
</ul>
|
||||
<p>
|
||||
In deep mode, array instances with a bad ratio of overall bounding box area
|
||||
vs. actually covered area, induce a performance penalty, because their bounding
|
||||
box is not longer a good approximation for their footprint.
|
||||
The "sparse array limit" defines the ratio of array instance bounding box area
|
||||
vs. sum of bounding box areas of the individual instances, above which the array
|
||||
is resolved into single instances.
|
||||
</p><p>
|
||||
Use this method without an argument to get the current value.
|
||||
</p><p>
|
||||
By default, this feature is off (the sparse array limit value is negative).
|
||||
If your design uses many arrays with a bad coverage, you can set the sparse
|
||||
array limit to a value of 10 for example.
|
||||
</p>
|
||||
<a name="squares"/><h2>"squares" - Selects all polygons which are squares</h2>
|
||||
<keyword name="squares"/>
|
||||
<p>Usage:</p>
|
||||
|
|
|
|||
|
|
@ -197,10 +197,11 @@ module DRC
|
|||
@total_timer = nil
|
||||
@drc_progress = nil
|
||||
|
||||
# initialize the defaults for max_area_ratio, max_vertex_count
|
||||
# initialize the defaults for max_area_ratio, max_vertex_count, sparse_array_limit
|
||||
dss = RBA::DeepShapeStore::new
|
||||
@max_area_ratio = dss.max_area_ratio
|
||||
@max_vertex_count = dss.max_vertex_count
|
||||
@sparse_array_limit = dss.sparse_array_limit
|
||||
@deep_reject_odd_polygons = dss.reject_odd_polygons
|
||||
dss._destroy
|
||||
|
||||
|
|
@ -1309,6 +1310,43 @@ module DRC
|
|||
self.max_vertex_count(count)
|
||||
end
|
||||
|
||||
# %DRC%
|
||||
# @name sparse_array_limit
|
||||
# @brief Gets or sets the sparse array singularization limit
|
||||
# @synopsis sparse_array_limit(limit)
|
||||
# @synopsis sparse_array_limit
|
||||
#
|
||||
# In deep mode, array instances with a bad ratio of overall bounding box area
|
||||
# vs. actually covered area, induce a performance penalty, because their bounding
|
||||
# box is not longer a good approximation for their footprint.
|
||||
# The "sparse array limit" defines the ratio of array instance bounding box area
|
||||
# vs. sum of bounding box areas of the individual instances, above which the array
|
||||
# is resolved into single instances.
|
||||
#
|
||||
# Use this method without an argument to get the current value.
|
||||
#
|
||||
# By default, this feature is off (the sparse array limit value is negative).
|
||||
# If your design uses many arrays with a bad coverage, you can set the sparse
|
||||
# array limit to a value of 10 for example.
|
||||
|
||||
def sparse_array_limit(sal = nil)
|
||||
if sal
|
||||
if @dss
|
||||
raise("sparse_array_limit must be set before the first 'input' statement in deep mode")
|
||||
end
|
||||
if sal.is_a?(1.0.class) || sal.is_a?(1.class)
|
||||
@sparse_array_limit = sal
|
||||
else
|
||||
raise("Argument is not numerical in sparse_array_limit")
|
||||
end
|
||||
end
|
||||
@sparse_array_limit
|
||||
end
|
||||
|
||||
def sparse_array_limit=(sal)
|
||||
self.sparse_array_limit(sal)
|
||||
end
|
||||
|
||||
# %DRC%
|
||||
# @name max_area_ratio
|
||||
# @brief Gets or sets the maximum bounding box to polygon area ratio for deep mode fragmentation
|
||||
|
|
@ -3305,6 +3343,7 @@ CODE
|
|||
@dss.reject_odd_polygons = @deep_reject_odd_polygons
|
||||
@dss.max_vertex_count = @max_vertex_count
|
||||
@dss.max_area_ratio = @max_area_ratio
|
||||
@dss.sparse_array_limit = @sparse_array_limit
|
||||
|
||||
r = cls.new(iter, @dss, RBA::ICplxTrans::new(sf.to_f))
|
||||
|
||||
|
|
|
|||
|
|
@ -2108,3 +2108,8 @@ TEST(147_MeasureNetsWithL2N)
|
|||
compare_text_files (output, au_output);
|
||||
}
|
||||
|
||||
TEST(148_sparse_array_limit)
|
||||
{
|
||||
run_test (_this, "148", true);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -154,7 +154,7 @@ TEST(16_private)
|
|||
TEST(17_private)
|
||||
{
|
||||
test_is_long_runner ();
|
||||
run_test (_this, "test_17.lylvs", "test_17b.cir.gz", "test_17.gds.gz", true, "test_17b_6.lvsdb");
|
||||
run_test (_this, "test_17.lylvs", "test_17b.cir.gz", "test_17.gds.gz", true, "test_17b_7.lvsdb");
|
||||
}
|
||||
|
||||
TEST(18_private)
|
||||
|
|
@ -172,7 +172,7 @@ TEST(19_private)
|
|||
TEST(20_private)
|
||||
{
|
||||
// test_is_long_runner ();
|
||||
run_test (_this, "test_20.lylvs", "test_20.cir.gz", "test_20.gds.gz", true, "test_20_5.lvsdb");
|
||||
run_test (_this, "test_20.lylvs", "test_20.cir.gz", "test_20.gds.gz", true, "test_20_6.lvsdb");
|
||||
}
|
||||
|
||||
TEST(21_private)
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -140,11 +140,11 @@ circuit(INV2
|
|||
rect(nsd (-1675 -925) (550 950))
|
||||
)
|
||||
net(5 name($5)
|
||||
rect(diff_cont (-110 2490) (220 220))
|
||||
rect(diff_cont (-220 180) (220 220))
|
||||
rect(diff_cont (-220 -220) (220 220))
|
||||
rect(diff_cont (-110 2890) (220 220))
|
||||
rect(diff_cont (-220 -620) (220 220))
|
||||
rect(metal1 (-290 -290) (360 760))
|
||||
rect(diff_cont (-220 -220) (220 220))
|
||||
rect(diff_cont (-220 180) (220 220))
|
||||
rect(metal1 (-290 -690) (360 760))
|
||||
rect(metal1 (-360 -760) (360 760))
|
||||
rect(via1 (-305 -705) (250 250))
|
||||
rect(via1 (-250 150) (250 250))
|
||||
|
|
@ -244,14 +244,14 @@ circuit(RINGO
|
|||
net(12 name($I39))
|
||||
net(13 name($I38))
|
||||
net(14 name($I19))
|
||||
net(15 name($I8))
|
||||
net(16 name($I7))
|
||||
net(17 name($I6))
|
||||
net(18 name($I5))
|
||||
net(19 name($I4))
|
||||
net(20 name($I3))
|
||||
net(21 name($I2))
|
||||
net(22 name($I1))
|
||||
net(15 name($I18))
|
||||
net(16 name($I17))
|
||||
net(17 name($I16))
|
||||
net(18 name($I15))
|
||||
net(19 name($I14))
|
||||
net(20 name($I13))
|
||||
net(21 name($I12))
|
||||
net(22 name($I11))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(FB))
|
||||
|
|
@ -274,61 +274,61 @@ circuit(RINGO
|
|||
pin(3 3)
|
||||
pin(4 4)
|
||||
)
|
||||
circuit(3 INV2 location(2640 0)
|
||||
pin(0 14)
|
||||
pin(1 12)
|
||||
pin(2 22)
|
||||
pin(3 3)
|
||||
pin(4 4)
|
||||
)
|
||||
circuit(4 INV2 location(5280 0)
|
||||
pin(0 22)
|
||||
pin(1 11)
|
||||
pin(2 21)
|
||||
pin(3 3)
|
||||
pin(4 4)
|
||||
)
|
||||
circuit(5 INV2 location(7920 0)
|
||||
pin(0 21)
|
||||
pin(1 10)
|
||||
pin(2 20)
|
||||
pin(3 3)
|
||||
pin(4 4)
|
||||
)
|
||||
circuit(6 INV2 location(10560 0)
|
||||
pin(0 20)
|
||||
pin(1 9)
|
||||
pin(2 19)
|
||||
pin(3 3)
|
||||
pin(4 4)
|
||||
)
|
||||
circuit(7 INV2 location(13200 0)
|
||||
pin(0 19)
|
||||
pin(1 8)
|
||||
pin(2 18)
|
||||
pin(3 3)
|
||||
pin(4 4)
|
||||
)
|
||||
circuit(8 INV2 location(15840 0)
|
||||
pin(0 18)
|
||||
pin(1 7)
|
||||
pin(2 17)
|
||||
pin(3 3)
|
||||
pin(4 4)
|
||||
)
|
||||
circuit(9 INV2 location(18480 0)
|
||||
pin(0 17)
|
||||
pin(1 6)
|
||||
pin(2 16)
|
||||
pin(3 3)
|
||||
pin(4 4)
|
||||
)
|
||||
circuit(10 INV2 location(21120 0)
|
||||
circuit(3 INV2 location(21120 0)
|
||||
pin(0 16)
|
||||
pin(1 5)
|
||||
pin(2 15)
|
||||
pin(3 3)
|
||||
pin(4 4)
|
||||
)
|
||||
circuit(4 INV2 location(18480 0)
|
||||
pin(0 17)
|
||||
pin(1 6)
|
||||
pin(2 16)
|
||||
pin(3 3)
|
||||
pin(4 4)
|
||||
)
|
||||
circuit(5 INV2 location(15840 0)
|
||||
pin(0 18)
|
||||
pin(1 7)
|
||||
pin(2 17)
|
||||
pin(3 3)
|
||||
pin(4 4)
|
||||
)
|
||||
circuit(6 INV2 location(13200 0)
|
||||
pin(0 19)
|
||||
pin(1 8)
|
||||
pin(2 18)
|
||||
pin(3 3)
|
||||
pin(4 4)
|
||||
)
|
||||
circuit(7 INV2 location(10560 0)
|
||||
pin(0 20)
|
||||
pin(1 9)
|
||||
pin(2 19)
|
||||
pin(3 3)
|
||||
pin(4 4)
|
||||
)
|
||||
circuit(8 INV2 location(7920 0)
|
||||
pin(0 21)
|
||||
pin(1 10)
|
||||
pin(2 20)
|
||||
pin(3 3)
|
||||
pin(4 4)
|
||||
)
|
||||
circuit(9 INV2 location(5280 0)
|
||||
pin(0 22)
|
||||
pin(1 11)
|
||||
pin(2 21)
|
||||
pin(3 3)
|
||||
pin(4 4)
|
||||
)
|
||||
circuit(10 INV2 location(2640 0)
|
||||
pin(0 14)
|
||||
pin(1 12)
|
||||
pin(2 22)
|
||||
pin(3 3)
|
||||
pin(4 4)
|
||||
)
|
||||
|
||||
)
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -169,11 +169,11 @@ circuit(INV2
|
|||
rect(nsd (-1515 -385) (550 950))
|
||||
)
|
||||
net(6 name(VDD)
|
||||
rect(diff_cont (-110 2490) (220 220))
|
||||
rect(diff_cont (-220 180) (220 220))
|
||||
rect(diff_cont (-220 -220) (220 220))
|
||||
rect(diff_cont (-110 2890) (220 220))
|
||||
rect(diff_cont (-220 -620) (220 220))
|
||||
rect(metal1 (-290 -290) (360 760))
|
||||
rect(diff_cont (-220 -220) (220 220))
|
||||
rect(diff_cont (-220 180) (220 220))
|
||||
rect(metal1 (-290 -690) (360 760))
|
||||
rect(metal1 (-360 -760) (360 760))
|
||||
rect(via1 (-305 -705) (250 250))
|
||||
rect(via1 (-250 150) (250 250))
|
||||
|
|
@ -345,9 +345,9 @@ circuit(RINGO
|
|||
net(7 name($I23))
|
||||
net(8 name($I22))
|
||||
net(9 name($I17))
|
||||
net(10 name($I11))
|
||||
net(11 name($I10))
|
||||
net(12 name($I9))
|
||||
net(10 name($I16))
|
||||
net(11 name($I15))
|
||||
net(12 name($I14))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(FB))
|
||||
|
|
@ -374,13 +374,13 @@ circuit(RINGO
|
|||
pin(5 9)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(3 INV2PAIR location(3580 -800)
|
||||
circuit(3 INV2PAIR location(14140 -800)
|
||||
pin(0 4)
|
||||
pin(1 7)
|
||||
pin(1 5)
|
||||
pin(2 3)
|
||||
pin(3 4)
|
||||
pin(4 9)
|
||||
pin(5 12)
|
||||
pin(4 11)
|
||||
pin(5 10)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(4 INV2PAIR location(8860 -800)
|
||||
|
|
@ -392,13 +392,13 @@ circuit(RINGO
|
|||
pin(5 11)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(5 INV2PAIR location(14140 -800)
|
||||
circuit(5 INV2PAIR location(3580 -800)
|
||||
pin(0 4)
|
||||
pin(1 5)
|
||||
pin(1 7)
|
||||
pin(2 3)
|
||||
pin(3 4)
|
||||
pin(4 11)
|
||||
pin(5 10)
|
||||
pin(4 9)
|
||||
pin(5 12)
|
||||
pin(6 3)
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -148,11 +148,11 @@ X(INV2
|
|||
R(nsd (-1515 -385) (550 950))
|
||||
)
|
||||
N(6 I(VDD)
|
||||
R(diff_cont (-110 2490) (220 220))
|
||||
R(diff_cont (-220 180) (220 220))
|
||||
R(diff_cont (-220 -220) (220 220))
|
||||
R(diff_cont (-110 2890) (220 220))
|
||||
R(diff_cont (-220 -620) (220 220))
|
||||
R(metal1 (-290 -290) (360 760))
|
||||
R(diff_cont (-220 -220) (220 220))
|
||||
R(diff_cont (-220 180) (220 220))
|
||||
R(metal1 (-290 -690) (360 760))
|
||||
R(metal1 (-360 -760) (360 760))
|
||||
R(via1 (-305 -705) (250 250))
|
||||
R(via1 (-250 150) (250 250))
|
||||
|
|
@ -306,9 +306,9 @@ X(RINGO
|
|||
N(7 I($I23))
|
||||
N(8 I($I22))
|
||||
N(9 I($I17))
|
||||
N(10 I($I11))
|
||||
N(11 I($I10))
|
||||
N(12 I($I9))
|
||||
N(10 I($I16))
|
||||
N(11 I($I15))
|
||||
N(12 I($I14))
|
||||
P(1 I(FB))
|
||||
P(2 I(OSC))
|
||||
P(3 I(VDD))
|
||||
|
|
@ -331,13 +331,13 @@ X(RINGO
|
|||
P(5 9)
|
||||
P(6 3)
|
||||
)
|
||||
X(3 INV2PAIR Y(3580 -800)
|
||||
X(3 INV2PAIR Y(14140 -800)
|
||||
P(0 4)
|
||||
P(1 7)
|
||||
P(1 5)
|
||||
P(2 3)
|
||||
P(3 4)
|
||||
P(4 9)
|
||||
P(5 12)
|
||||
P(4 11)
|
||||
P(5 10)
|
||||
P(6 3)
|
||||
)
|
||||
X(4 INV2PAIR Y(8860 -800)
|
||||
|
|
@ -349,13 +349,13 @@ X(RINGO
|
|||
P(5 11)
|
||||
P(6 3)
|
||||
)
|
||||
X(5 INV2PAIR Y(14140 -800)
|
||||
X(5 INV2PAIR Y(3580 -800)
|
||||
P(0 4)
|
||||
P(1 5)
|
||||
P(1 7)
|
||||
P(2 3)
|
||||
P(3 4)
|
||||
P(4 11)
|
||||
P(5 10)
|
||||
P(4 9)
|
||||
P(5 12)
|
||||
P(6 3)
|
||||
)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -121,11 +121,11 @@ X(INV2
|
|||
R(nsd (-1675 -925) (550 950))
|
||||
)
|
||||
N(5 I($5)
|
||||
R(diff_cont (-110 2490) (220 220))
|
||||
R(diff_cont (-220 180) (220 220))
|
||||
R(diff_cont (-220 -220) (220 220))
|
||||
R(diff_cont (-110 2890) (220 220))
|
||||
R(diff_cont (-220 -620) (220 220))
|
||||
R(metal1 (-290 -290) (360 760))
|
||||
R(diff_cont (-220 -220) (220 220))
|
||||
R(diff_cont (-220 180) (220 220))
|
||||
R(metal1 (-290 -690) (360 760))
|
||||
R(metal1 (-360 -760) (360 760))
|
||||
R(via1 (-305 -705) (250 250))
|
||||
R(via1 (-250 150) (250 250))
|
||||
|
|
@ -225,14 +225,14 @@ X(RINGO
|
|||
N(12 I($I39))
|
||||
N(13 I($I38))
|
||||
N(14 I($I19))
|
||||
N(15 I($I8))
|
||||
N(16 I($I7))
|
||||
N(17 I($I6))
|
||||
N(18 I($I5))
|
||||
N(19 I($I4))
|
||||
N(20 I($I3))
|
||||
N(21 I($I2))
|
||||
N(22 I($I1))
|
||||
N(15 I($I18))
|
||||
N(16 I($I17))
|
||||
N(17 I($I16))
|
||||
N(18 I($I15))
|
||||
N(19 I($I14))
|
||||
N(20 I($I13))
|
||||
N(21 I($I12))
|
||||
N(22 I($I11))
|
||||
P(1 I(FB))
|
||||
P(2 I(OSC))
|
||||
P(3 I(VSS))
|
||||
|
|
@ -254,60 +254,60 @@ X(RINGO
|
|||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(3 INV2 Y(2640 0)
|
||||
P(0 14)
|
||||
P(1 12)
|
||||
P(2 22)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(4 INV2 Y(5280 0)
|
||||
P(0 22)
|
||||
P(1 11)
|
||||
P(2 21)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(5 INV2 Y(7920 0)
|
||||
P(0 21)
|
||||
P(1 10)
|
||||
P(2 20)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(6 INV2 Y(10560 0)
|
||||
P(0 20)
|
||||
P(1 9)
|
||||
P(2 19)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(7 INV2 Y(13200 0)
|
||||
P(0 19)
|
||||
P(1 8)
|
||||
P(2 18)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(8 INV2 Y(15840 0)
|
||||
P(0 18)
|
||||
P(1 7)
|
||||
P(2 17)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(9 INV2 Y(18480 0)
|
||||
P(0 17)
|
||||
P(1 6)
|
||||
P(2 16)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(10 INV2 Y(21120 0)
|
||||
X(3 INV2 Y(21120 0)
|
||||
P(0 16)
|
||||
P(1 5)
|
||||
P(2 15)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(4 INV2 Y(18480 0)
|
||||
P(0 17)
|
||||
P(1 6)
|
||||
P(2 16)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(5 INV2 Y(15840 0)
|
||||
P(0 18)
|
||||
P(1 7)
|
||||
P(2 17)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(6 INV2 Y(13200 0)
|
||||
P(0 19)
|
||||
P(1 8)
|
||||
P(2 18)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(7 INV2 Y(10560 0)
|
||||
P(0 20)
|
||||
P(1 9)
|
||||
P(2 19)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(8 INV2 Y(7920 0)
|
||||
P(0 21)
|
||||
P(1 10)
|
||||
P(2 20)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(9 INV2 Y(5280 0)
|
||||
P(0 22)
|
||||
P(1 11)
|
||||
P(2 21)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(10 INV2 Y(2640 0)
|
||||
P(0 14)
|
||||
P(1 12)
|
||||
P(2 22)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -121,11 +121,11 @@ X(INV2
|
|||
R(nsd (-1675 -925) (550 950))
|
||||
)
|
||||
N(5 I($5)
|
||||
R(diff_cont (-110 2490) (220 220))
|
||||
R(diff_cont (-220 180) (220 220))
|
||||
R(diff_cont (-220 -220) (220 220))
|
||||
R(diff_cont (-110 2890) (220 220))
|
||||
R(diff_cont (-220 -620) (220 220))
|
||||
R(metal1 (-290 -290) (360 760))
|
||||
R(diff_cont (-220 -220) (220 220))
|
||||
R(diff_cont (-220 180) (220 220))
|
||||
R(metal1 (-290 -690) (360 760))
|
||||
R(metal1 (-360 -760) (360 760))
|
||||
R(via1 (-305 -705) (250 250))
|
||||
R(via1 (-250 150) (250 250))
|
||||
|
|
@ -216,14 +216,14 @@ X(RINGO
|
|||
N(12 I($I39))
|
||||
N(13 I($I38))
|
||||
N(14 I($I19))
|
||||
N(15 I($I8))
|
||||
N(16 I($I7))
|
||||
N(17 I($I6))
|
||||
N(18 I($I5))
|
||||
N(19 I($I4))
|
||||
N(20 I($I3))
|
||||
N(21 I($I2))
|
||||
N(22 I($I1))
|
||||
N(15 I($I18))
|
||||
N(16 I($I17))
|
||||
N(17 I($I16))
|
||||
N(18 I($I15))
|
||||
N(19 I($I14))
|
||||
N(20 I($I13))
|
||||
N(21 I($I12))
|
||||
N(22 I($I11))
|
||||
P(1 I(FB))
|
||||
P(2 I(OSC))
|
||||
P(3 I(VSS))
|
||||
|
|
@ -242,60 +242,60 @@ X(RINGO
|
|||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(3 INV2 Y(2640 0)
|
||||
P(0 14)
|
||||
P(1 12)
|
||||
P(2 22)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(4 INV2 Y(5280 0)
|
||||
P(0 22)
|
||||
P(1 11)
|
||||
P(2 21)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(5 INV2 Y(7920 0)
|
||||
P(0 21)
|
||||
P(1 10)
|
||||
P(2 20)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(6 INV2 Y(10560 0)
|
||||
P(0 20)
|
||||
P(1 9)
|
||||
P(2 19)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(7 INV2 Y(13200 0)
|
||||
P(0 19)
|
||||
P(1 8)
|
||||
P(2 18)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(8 INV2 Y(15840 0)
|
||||
P(0 18)
|
||||
P(1 7)
|
||||
P(2 17)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(9 INV2 Y(18480 0)
|
||||
P(0 17)
|
||||
P(1 6)
|
||||
P(2 16)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(10 INV2 Y(21120 0)
|
||||
X(3 INV2 Y(21120 0)
|
||||
P(0 16)
|
||||
P(1 5)
|
||||
P(2 15)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(4 INV2 Y(18480 0)
|
||||
P(0 17)
|
||||
P(1 6)
|
||||
P(2 16)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(5 INV2 Y(15840 0)
|
||||
P(0 18)
|
||||
P(1 7)
|
||||
P(2 17)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(6 INV2 Y(13200 0)
|
||||
P(0 19)
|
||||
P(1 8)
|
||||
P(2 18)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(7 INV2 Y(10560 0)
|
||||
P(0 20)
|
||||
P(1 9)
|
||||
P(2 19)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(8 INV2 Y(7920 0)
|
||||
P(0 21)
|
||||
P(1 10)
|
||||
P(2 20)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(9 INV2 Y(5280 0)
|
||||
P(0 22)
|
||||
P(1 11)
|
||||
P(2 21)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
X(10 INV2 Y(2640 0)
|
||||
P(0 14)
|
||||
P(1 12)
|
||||
P(2 22)
|
||||
P(3 3)
|
||||
P(4 4)
|
||||
)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -351,9 +351,9 @@ layout(
|
|||
net(7 name($I23))
|
||||
net(8 name($I22))
|
||||
net(9 name($I17))
|
||||
net(10 name($I11))
|
||||
net(11 name($I10))
|
||||
net(12 name($I9))
|
||||
net(10 name($I16))
|
||||
net(11 name($I15))
|
||||
net(12 name($I14))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(FB))
|
||||
|
|
@ -380,13 +380,13 @@ layout(
|
|||
pin(5 9)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(3 INV2PAIR location(3580 -800)
|
||||
circuit(3 INV2PAIR location(14140 -800)
|
||||
pin(0 4)
|
||||
pin(1 3)
|
||||
pin(2 4)
|
||||
pin(3 7)
|
||||
pin(4 9)
|
||||
pin(5 12)
|
||||
pin(3 5)
|
||||
pin(4 11)
|
||||
pin(5 10)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(4 INV2PAIR location(8860 -800)
|
||||
|
|
@ -398,13 +398,13 @@ layout(
|
|||
pin(5 11)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(5 INV2PAIR location(14140 -800)
|
||||
circuit(5 INV2PAIR location(3580 -800)
|
||||
pin(0 4)
|
||||
pin(1 3)
|
||||
pin(2 4)
|
||||
pin(3 5)
|
||||
pin(4 11)
|
||||
pin(5 10)
|
||||
pin(3 7)
|
||||
pin(4 9)
|
||||
pin(5 12)
|
||||
pin(6 3)
|
||||
)
|
||||
|
||||
|
|
@ -638,9 +638,9 @@ xref(
|
|||
pin(3 3 match)
|
||||
circuit(1 1 match)
|
||||
circuit(2 2 match)
|
||||
circuit(3 3 match)
|
||||
circuit(5 3 match)
|
||||
circuit(4 4 match)
|
||||
circuit(5 5 match)
|
||||
circuit(3 5 match)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -351,9 +351,9 @@ layout(
|
|||
net(7 name($I23))
|
||||
net(8 name($I22))
|
||||
net(9 name($I17))
|
||||
net(10 name($I11))
|
||||
net(11 name($I10))
|
||||
net(12 name($I9))
|
||||
net(10 name($I16))
|
||||
net(11 name($I15))
|
||||
net(12 name($I14))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(FB))
|
||||
|
|
@ -380,13 +380,13 @@ layout(
|
|||
pin(5 9)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(3 INV2PAIR location(3580 -800)
|
||||
circuit(3 INV2PAIR location(14140 -800)
|
||||
pin(0 4)
|
||||
pin(1 3)
|
||||
pin(2 4)
|
||||
pin(3 7)
|
||||
pin(4 9)
|
||||
pin(5 12)
|
||||
pin(3 5)
|
||||
pin(4 11)
|
||||
pin(5 10)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(4 INV2PAIR location(8860 -800)
|
||||
|
|
@ -398,13 +398,13 @@ layout(
|
|||
pin(5 11)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(5 INV2PAIR location(14140 -800)
|
||||
circuit(5 INV2PAIR location(3580 -800)
|
||||
pin(0 4)
|
||||
pin(1 3)
|
||||
pin(2 4)
|
||||
pin(3 5)
|
||||
pin(4 11)
|
||||
pin(5 10)
|
||||
pin(3 7)
|
||||
pin(4 9)
|
||||
pin(5 12)
|
||||
pin(6 3)
|
||||
)
|
||||
|
||||
|
|
@ -638,9 +638,9 @@ xref(
|
|||
pin(3 3 match)
|
||||
circuit(1 1 match)
|
||||
circuit(2 2 match)
|
||||
circuit(3 3 match)
|
||||
circuit(5 3 match)
|
||||
circuit(4 4 match)
|
||||
circuit(5 5 match)
|
||||
circuit(3 5 match)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -351,9 +351,9 @@ layout(
|
|||
net(7 name($I23))
|
||||
net(8 name($I22))
|
||||
net(9 name($I17))
|
||||
net(10 name($I11))
|
||||
net(11 name($I10))
|
||||
net(12 name($I9))
|
||||
net(10 name($I16))
|
||||
net(11 name($I15))
|
||||
net(12 name($I14))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(FB))
|
||||
|
|
@ -380,13 +380,13 @@ layout(
|
|||
pin(5 9)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(3 INV2PAIR location(3580 -800)
|
||||
circuit(3 INV2PAIR location(14140 -800)
|
||||
pin(0 4)
|
||||
pin(1 3)
|
||||
pin(2 4)
|
||||
pin(3 7)
|
||||
pin(4 9)
|
||||
pin(5 12)
|
||||
pin(3 5)
|
||||
pin(4 11)
|
||||
pin(5 10)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(4 INV2PAIR location(8860 -800)
|
||||
|
|
@ -398,13 +398,13 @@ layout(
|
|||
pin(5 11)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(5 INV2PAIR location(14140 -800)
|
||||
circuit(5 INV2PAIR location(3580 -800)
|
||||
pin(0 4)
|
||||
pin(1 3)
|
||||
pin(2 4)
|
||||
pin(3 5)
|
||||
pin(4 11)
|
||||
pin(5 10)
|
||||
pin(3 7)
|
||||
pin(4 9)
|
||||
pin(5 12)
|
||||
pin(6 3)
|
||||
)
|
||||
|
||||
|
|
@ -638,9 +638,9 @@ xref(
|
|||
pin(3 3 match)
|
||||
circuit(1 1 match)
|
||||
circuit(2 2 match)
|
||||
circuit(3 3 match)
|
||||
circuit(5 3 match)
|
||||
circuit(4 4 match)
|
||||
circuit(5 5 match)
|
||||
circuit(3 5 match)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -351,9 +351,9 @@ layout(
|
|||
net(7 name($I23))
|
||||
net(8 name($I22))
|
||||
net(9 name($I17))
|
||||
net(10 name($I11))
|
||||
net(11 name($I10))
|
||||
net(12 name($I9))
|
||||
net(10 name($I16))
|
||||
net(11 name($I15))
|
||||
net(12 name($I14))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(FB))
|
||||
|
|
@ -380,13 +380,13 @@ layout(
|
|||
pin(5 9)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(3 INV2PAIR location(3580 -800)
|
||||
circuit(3 INV2PAIR location(14140 -800)
|
||||
pin(0 4)
|
||||
pin(1 3)
|
||||
pin(2 4)
|
||||
pin(3 7)
|
||||
pin(4 9)
|
||||
pin(5 12)
|
||||
pin(3 5)
|
||||
pin(4 11)
|
||||
pin(5 10)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(4 INV2PAIR location(8860 -800)
|
||||
|
|
@ -398,13 +398,13 @@ layout(
|
|||
pin(5 11)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(5 INV2PAIR location(14140 -800)
|
||||
circuit(5 INV2PAIR location(3580 -800)
|
||||
pin(0 4)
|
||||
pin(1 3)
|
||||
pin(2 4)
|
||||
pin(3 5)
|
||||
pin(4 11)
|
||||
pin(5 10)
|
||||
pin(3 7)
|
||||
pin(4 9)
|
||||
pin(5 12)
|
||||
pin(6 3)
|
||||
)
|
||||
|
||||
|
|
@ -638,9 +638,9 @@ xref(
|
|||
pin(3 3 match)
|
||||
circuit(1 1 match)
|
||||
circuit(2 2 match)
|
||||
circuit(3 3 match)
|
||||
circuit(5 3 match)
|
||||
circuit(4 4 match)
|
||||
circuit(5 5 match)
|
||||
circuit(3 5 match)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -351,9 +351,9 @@ layout(
|
|||
net(7 name($I23))
|
||||
net(8 name($I22))
|
||||
net(9 name($I17))
|
||||
net(10 name($I11))
|
||||
net(11 name($I10))
|
||||
net(12 name($I9))
|
||||
net(10 name($I16))
|
||||
net(11 name($I15))
|
||||
net(12 name($I14))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(FB))
|
||||
|
|
@ -380,13 +380,13 @@ layout(
|
|||
pin(5 9)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(3 INV2PAIR location(3580 -800)
|
||||
circuit(3 INV2PAIR location(14140 -800)
|
||||
pin(0 4)
|
||||
pin(1 3)
|
||||
pin(2 4)
|
||||
pin(3 7)
|
||||
pin(4 9)
|
||||
pin(5 12)
|
||||
pin(3 5)
|
||||
pin(4 11)
|
||||
pin(5 10)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(4 INV2PAIR location(8860 -800)
|
||||
|
|
@ -398,13 +398,13 @@ layout(
|
|||
pin(5 11)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(5 INV2PAIR location(14140 -800)
|
||||
circuit(5 INV2PAIR location(3580 -800)
|
||||
pin(0 4)
|
||||
pin(1 3)
|
||||
pin(2 4)
|
||||
pin(3 5)
|
||||
pin(4 11)
|
||||
pin(5 10)
|
||||
pin(3 7)
|
||||
pin(4 9)
|
||||
pin(5 12)
|
||||
pin(6 3)
|
||||
)
|
||||
|
||||
|
|
@ -669,9 +669,9 @@ xref(
|
|||
circuit(() 2 mismatch)
|
||||
circuit(2 () mismatch)
|
||||
circuit(1 1 match)
|
||||
circuit(3 3 match)
|
||||
circuit(5 3 match)
|
||||
circuit(4 4 match)
|
||||
circuit(5 5 match)
|
||||
circuit(3 5 match)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -351,9 +351,9 @@ layout(
|
|||
net(7 name($I23))
|
||||
net(8 name($I22))
|
||||
net(9 name($I17))
|
||||
net(10 name($I11))
|
||||
net(11 name($I10))
|
||||
net(12 name($I9))
|
||||
net(10 name($I16))
|
||||
net(11 name($I15))
|
||||
net(12 name($I14))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(FB))
|
||||
|
|
@ -380,13 +380,13 @@ layout(
|
|||
pin(5 9)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(3 INV2PAIR location(3580 -800)
|
||||
circuit(3 INV2PAIR location(14140 -800)
|
||||
pin(0 4)
|
||||
pin(1 3)
|
||||
pin(2 4)
|
||||
pin(3 7)
|
||||
pin(4 9)
|
||||
pin(5 12)
|
||||
pin(3 5)
|
||||
pin(4 11)
|
||||
pin(5 10)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(4 INV2PAIR location(8860 -800)
|
||||
|
|
@ -398,13 +398,13 @@ layout(
|
|||
pin(5 11)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(5 INV2PAIR location(14140 -800)
|
||||
circuit(5 INV2PAIR location(3580 -800)
|
||||
pin(0 4)
|
||||
pin(1 3)
|
||||
pin(2 4)
|
||||
pin(3 5)
|
||||
pin(4 11)
|
||||
pin(5 10)
|
||||
pin(3 7)
|
||||
pin(4 9)
|
||||
pin(5 12)
|
||||
pin(6 3)
|
||||
)
|
||||
|
||||
|
|
@ -669,9 +669,9 @@ xref(
|
|||
circuit(() 2 mismatch)
|
||||
circuit(2 () mismatch)
|
||||
circuit(1 1 match)
|
||||
circuit(3 3 match)
|
||||
circuit(5 3 match)
|
||||
circuit(4 4 match)
|
||||
circuit(5 5 match)
|
||||
circuit(3 5 match)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -351,9 +351,9 @@ layout(
|
|||
net(7 name($I23))
|
||||
net(8 name($I22))
|
||||
net(9 name($I17))
|
||||
net(10 name($I11))
|
||||
net(11 name($I10))
|
||||
net(12 name($I9))
|
||||
net(10 name($I16))
|
||||
net(11 name($I15))
|
||||
net(12 name($I14))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(FB))
|
||||
|
|
@ -380,13 +380,13 @@ layout(
|
|||
pin(5 9)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(3 INV2PAIR location(3580 -800)
|
||||
circuit(3 INV2PAIR location(14140 -800)
|
||||
pin(0 4)
|
||||
pin(1 3)
|
||||
pin(2 4)
|
||||
pin(3 7)
|
||||
pin(4 9)
|
||||
pin(5 12)
|
||||
pin(3 5)
|
||||
pin(4 11)
|
||||
pin(5 10)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(4 INV2PAIR location(8860 -800)
|
||||
|
|
@ -398,13 +398,13 @@ layout(
|
|||
pin(5 11)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(5 INV2PAIR location(14140 -800)
|
||||
circuit(5 INV2PAIR location(3580 -800)
|
||||
pin(0 4)
|
||||
pin(1 3)
|
||||
pin(2 4)
|
||||
pin(3 5)
|
||||
pin(4 11)
|
||||
pin(5 10)
|
||||
pin(3 7)
|
||||
pin(4 9)
|
||||
pin(5 12)
|
||||
pin(6 3)
|
||||
)
|
||||
|
||||
|
|
@ -669,9 +669,9 @@ xref(
|
|||
circuit(() 2 mismatch)
|
||||
circuit(2 () mismatch)
|
||||
circuit(1 1 match)
|
||||
circuit(3 3 match)
|
||||
circuit(5 3 match)
|
||||
circuit(4 4 match)
|
||||
circuit(5 5 match)
|
||||
circuit(3 5 match)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -351,9 +351,9 @@ layout(
|
|||
net(7 name($I23))
|
||||
net(8 name($I22))
|
||||
net(9 name($I17))
|
||||
net(10 name($I11))
|
||||
net(11 name($I10))
|
||||
net(12 name($I9))
|
||||
net(10 name($I16))
|
||||
net(11 name($I15))
|
||||
net(12 name($I14))
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
pin(1 name(FB))
|
||||
|
|
@ -380,13 +380,13 @@ layout(
|
|||
pin(5 9)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(3 INV2PAIR location(3580 -800)
|
||||
circuit(3 INV2PAIR location(14140 -800)
|
||||
pin(0 4)
|
||||
pin(1 3)
|
||||
pin(2 4)
|
||||
pin(3 7)
|
||||
pin(4 9)
|
||||
pin(5 12)
|
||||
pin(3 5)
|
||||
pin(4 11)
|
||||
pin(5 10)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(4 INV2PAIR location(8860 -800)
|
||||
|
|
@ -398,13 +398,13 @@ layout(
|
|||
pin(5 11)
|
||||
pin(6 3)
|
||||
)
|
||||
circuit(5 INV2PAIR location(14140 -800)
|
||||
circuit(5 INV2PAIR location(3580 -800)
|
||||
pin(0 4)
|
||||
pin(1 3)
|
||||
pin(2 4)
|
||||
pin(3 5)
|
||||
pin(4 11)
|
||||
pin(5 10)
|
||||
pin(3 7)
|
||||
pin(4 9)
|
||||
pin(5 12)
|
||||
pin(6 3)
|
||||
)
|
||||
|
||||
|
|
@ -669,9 +669,9 @@ xref(
|
|||
circuit(() 2 mismatch)
|
||||
circuit(2 () mismatch)
|
||||
circuit(1 1 match)
|
||||
circuit(3 3 match)
|
||||
circuit(5 3 match)
|
||||
circuit(4 4 match)
|
||||
circuit(5 5 match)
|
||||
circuit(3 5 match)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,39 @@
|
|||
|
||||
# Breaking
|
||||
|
||||
source($drc_test_source, "TOP")
|
||||
target($drc_test_target)
|
||||
|
||||
sparse_array_limit(10.0)
|
||||
if sparse_array_limit != 10.0
|
||||
raise("sparse array limit is not 10.0!")
|
||||
end
|
||||
|
||||
deep
|
||||
|
||||
# can still set sparse_array_limit before the first input statement
|
||||
self.sparse_array_limit = 5.0
|
||||
if self.sparse_array_limit != 5.0
|
||||
raise("sparse array limit is not 5.0!")
|
||||
end
|
||||
|
||||
l1 = input(1, 0)
|
||||
l2 = input(2, 0)
|
||||
|
||||
error = false
|
||||
begin
|
||||
self.sparse_array_limit = 2.0
|
||||
rescue
|
||||
error = true
|
||||
end
|
||||
error || raise("sparse_array_limit must throw an exception after 'deep'")
|
||||
|
||||
if @dss.sparse_array_limit != 5.0
|
||||
raise("sparse array limit of DSS is not 5.0!")
|
||||
end
|
||||
|
||||
l1.output(1, 0)
|
||||
l2.output(2, 0)
|
||||
l1.sized(1.um).output(11, 0)
|
||||
l2.sized(1.um).output(12, 0)
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -144,8 +144,8 @@ layout(
|
|||
rect(l11 (-240 -790) (300 1700))
|
||||
rect(l11 (-1350 0) (2400 800))
|
||||
rect(l11 (-1150 -400) (0 0))
|
||||
rect(l2 (-275 -2150) (425 1500))
|
||||
rect(l2 (-400 -1500) (425 1500))
|
||||
rect(l2 (-250 -2150) (425 1500))
|
||||
rect(l2 (-450 -1500) (425 1500))
|
||||
)
|
||||
net(2 name(OUT)
|
||||
rect(l8 (1810 1770) (180 180))
|
||||
|
|
@ -199,9 +199,9 @@ layout(
|
|||
rect(l11 (-150 -150) (300 300))
|
||||
)
|
||||
net(7 name(SUBSTRATE))
|
||||
net(8 name($I3)
|
||||
rect(l6 (975 1660) (425 950))
|
||||
rect(l6 (-400 -950) (425 950))
|
||||
net(8 name($I6)
|
||||
rect(l6 (1000 1660) (425 950))
|
||||
rect(l6 (-450 -950) (425 950))
|
||||
)
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
|
|
@ -403,27 +403,27 @@ layout(
|
|||
rect(l13 (17740 -400) (400 400))
|
||||
)
|
||||
net(12 name(VDD)
|
||||
rect(l3 (500 4500) (1400 3500))
|
||||
rect(l3 (-1900 -3500) (600 3500))
|
||||
rect(l3 (0 4500) (600 3500))
|
||||
rect(l3 (23300 -3500) (1400 3500))
|
||||
rect(l3 (-100 -3500) (600 3500))
|
||||
rect(l8 (-24690 -1240) (180 180))
|
||||
rect(l3 (-25300 -3500) (1400 3500))
|
||||
rect(l8 (22610 -1240) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l11 (-21740 860) (0 0))
|
||||
rect(l11 (-2350 -450) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (1660 860) (0 0))
|
||||
rect(l11 (-2950 -450) (600 800))
|
||||
rect(l11 (23400 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l9 (-24850 -1500) (500 1500))
|
||||
rect(l9 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25200 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l9 (23100 -1100) (500 1500))
|
||||
rect(l9 (-23900 -1500) (500 1500))
|
||||
)
|
||||
net(13 name(OUT)
|
||||
rect(l11 (23440 3840) (320 320))
|
||||
|
|
@ -438,23 +438,23 @@ layout(
|
|||
rect(l13 (-200 -200) (400 400))
|
||||
)
|
||||
net(15 name(VSS)
|
||||
rect(l8 (1110 1610) (180 180))
|
||||
rect(l8 (24510 1610) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l11 (-21740 -390) (0 0))
|
||||
rect(l11 (-1900 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (23850 -750) (300 1400))
|
||||
rect(l11 (1660 -390) (0 0))
|
||||
rect(l11 (21500 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l10 (-24850 -800) (500 1500))
|
||||
rect(l10 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25800 -800) (600 800))
|
||||
rect(l11 (450 -750) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l10 (23100 -400) (500 1500))
|
||||
rect(l10 (-23900 -1500) (500 1500))
|
||||
)
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
|
|
|
|||
|
|
@ -403,27 +403,27 @@ layout(
|
|||
rect(l13 (17740 -400) (400 400))
|
||||
)
|
||||
net(12 name(VDD)
|
||||
rect(l3 (500 4500) (1400 3500))
|
||||
rect(l3 (-1900 -3500) (600 3500))
|
||||
rect(l3 (0 4500) (600 3500))
|
||||
rect(l3 (23300 -3500) (1400 3500))
|
||||
rect(l3 (-100 -3500) (600 3500))
|
||||
rect(l8 (-24690 -1240) (180 180))
|
||||
rect(l3 (-25300 -3500) (1400 3500))
|
||||
rect(l8 (22610 -1240) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l11 (-21740 860) (0 0))
|
||||
rect(l11 (-2350 -450) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (1660 860) (0 0))
|
||||
rect(l11 (-2950 -450) (600 800))
|
||||
rect(l11 (23400 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l9 (-24850 -1500) (500 1500))
|
||||
rect(l9 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25200 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l9 (23100 -1100) (500 1500))
|
||||
rect(l9 (-23900 -1500) (500 1500))
|
||||
)
|
||||
net(13 name(OUT)
|
||||
rect(l11 (23440 3840) (320 320))
|
||||
|
|
@ -438,23 +438,23 @@ layout(
|
|||
rect(l13 (-200 -200) (400 400))
|
||||
)
|
||||
net(15 name(VSS)
|
||||
rect(l8 (1110 1610) (180 180))
|
||||
rect(l8 (24510 1610) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l11 (-21740 -390) (0 0))
|
||||
rect(l11 (-1900 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (23850 -750) (300 1400))
|
||||
rect(l11 (1660 -390) (0 0))
|
||||
rect(l11 (21500 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l10 (-24850 -800) (500 1500))
|
||||
rect(l10 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25800 -800) (600 800))
|
||||
rect(l11 (450 -750) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l10 (23100 -400) (500 1500))
|
||||
rect(l10 (-23900 -1500) (500 1500))
|
||||
)
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
|
|
|
|||
|
|
@ -144,8 +144,8 @@ layout(
|
|||
rect(l11 (-240 -790) (300 1700))
|
||||
rect(l11 (-1350 0) (2400 800))
|
||||
rect(l11 (-1150 -400) (0 0))
|
||||
rect(l2 (-275 -2150) (425 1500))
|
||||
rect(l2 (-400 -1500) (425 1500))
|
||||
rect(l2 (-250 -2150) (425 1500))
|
||||
rect(l2 (-450 -1500) (425 1500))
|
||||
)
|
||||
net(2 name(OUT)
|
||||
rect(l8 (1810 1770) (180 180))
|
||||
|
|
@ -199,9 +199,9 @@ layout(
|
|||
rect(l11 (-150 -150) (300 300))
|
||||
)
|
||||
net(7 name(SUBSTRATE))
|
||||
net(8 name($I3)
|
||||
rect(l6 (975 1660) (425 950))
|
||||
rect(l6 (-400 -950) (425 950))
|
||||
net(8 name($I6)
|
||||
rect(l6 (1000 1660) (425 950))
|
||||
rect(l6 (-450 -950) (425 950))
|
||||
)
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
|
|
@ -490,9 +490,9 @@ layout(
|
|||
rect(l13 (17740 -400) (400 400))
|
||||
)
|
||||
net(12 name(VDD)
|
||||
rect(l3 (500 4500) (1400 3500))
|
||||
rect(l3 (-1900 -3500) (600 3500))
|
||||
rect(l3 (23300 -3500) (1400 3500))
|
||||
rect(l3 (0 4500) (600 3500))
|
||||
rect(l3 (-100 -3500) (1400 3500))
|
||||
rect(l3 (22000 -3500) (1400 3500))
|
||||
rect(l3 (-100 -3500) (600 3500))
|
||||
rect(l8 (-24690 -1240) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
|
|
@ -501,11 +501,11 @@ layout(
|
|||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l11 (-21740 860) (0 0))
|
||||
rect(l11 (-2350 -450) (1200 800))
|
||||
rect(l11 (-2950 -450) (600 800))
|
||||
rect(l11 (0 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (23400 -800) (1200 800))
|
||||
rect(l11 (22750 -400) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
|
|
@ -525,23 +525,23 @@ layout(
|
|||
rect(l13 (-200 -200) (400 400))
|
||||
)
|
||||
net(15 name(VSS)
|
||||
rect(l8 (1110 1610) (180 180))
|
||||
rect(l8 (24510 1610) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l11 (-21740 -390) (0 0))
|
||||
rect(l11 (-1900 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (23850 -750) (300 1400))
|
||||
rect(l11 (1660 -390) (0 0))
|
||||
rect(l11 (21500 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l10 (-24850 -800) (500 1500))
|
||||
rect(l10 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25800 -800) (600 800))
|
||||
rect(l11 (450 -750) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l10 (23100 -400) (500 1500))
|
||||
rect(l10 (-23900 -1500) (500 1500))
|
||||
)
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
|
|
|
|||
|
|
@ -490,9 +490,9 @@ layout(
|
|||
rect(l13 (17740 -400) (400 400))
|
||||
)
|
||||
net(12 name(VDD)
|
||||
rect(l3 (500 4500) (1400 3500))
|
||||
rect(l3 (-1900 -3500) (600 3500))
|
||||
rect(l3 (23300 -3500) (1400 3500))
|
||||
rect(l3 (0 4500) (600 3500))
|
||||
rect(l3 (-100 -3500) (1400 3500))
|
||||
rect(l3 (22000 -3500) (1400 3500))
|
||||
rect(l3 (-100 -3500) (600 3500))
|
||||
rect(l8 (-24690 -1240) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
|
|
@ -501,11 +501,11 @@ layout(
|
|||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l11 (-21740 860) (0 0))
|
||||
rect(l11 (-2350 -450) (1200 800))
|
||||
rect(l11 (-2950 -450) (600 800))
|
||||
rect(l11 (0 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (23400 -800) (1200 800))
|
||||
rect(l11 (22750 -400) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
|
|
@ -525,23 +525,23 @@ layout(
|
|||
rect(l13 (-200 -200) (400 400))
|
||||
)
|
||||
net(15 name(VSS)
|
||||
rect(l8 (1110 1610) (180 180))
|
||||
rect(l8 (24510 1610) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l11 (-21740 -390) (0 0))
|
||||
rect(l11 (-1900 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (23850 -750) (300 1400))
|
||||
rect(l11 (1660 -390) (0 0))
|
||||
rect(l11 (21500 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l10 (-24850 -800) (500 1500))
|
||||
rect(l10 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25800 -800) (600 800))
|
||||
rect(l11 (450 -750) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l10 (23100 -400) (500 1500))
|
||||
rect(l10 (-23900 -1500) (500 1500))
|
||||
)
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
|
|
|
|||
|
|
@ -16,24 +16,24 @@
|
|||
X$1 3 14 16 3 1 16 INVX1
|
||||
* cell instance $2 r0 *1 20.4,0
|
||||
X$2 3 1 16 3 13 16 INVX1
|
||||
* cell instance $8 r0 *1 4.2,0
|
||||
X$8 3 5 16 3 4 16 INVX1
|
||||
* cell instance $9 r0 *1 6,0
|
||||
X$9 3 6 16 3 5 16 INVX1
|
||||
* cell instance $10 r0 *1 7.8,0
|
||||
X$10 3 7 16 3 6 16 INVX1
|
||||
* cell instance $11 r0 *1 9.6,0
|
||||
X$11 3 8 16 3 7 16 INVX1
|
||||
* cell instance $12 r0 *1 11.4,0
|
||||
X$12 3 9 16 3 8 16 INVX1
|
||||
* cell instance $10 r0 *1 18.6,0
|
||||
X$10 3 13 16 3 12 16 INVX1
|
||||
* cell instance $11 r0 *1 16.8,0
|
||||
X$11 3 12 16 3 11 16 INVX1
|
||||
* cell instance $12 r0 *1 15,0
|
||||
X$12 3 11 16 3 10 16 INVX1
|
||||
* cell instance $13 r0 *1 13.2,0
|
||||
X$13 3 10 16 3 9 16 INVX1
|
||||
* cell instance $14 r0 *1 15,0
|
||||
X$14 3 11 16 3 10 16 INVX1
|
||||
* cell instance $15 r0 *1 16.8,0
|
||||
X$15 3 12 16 3 11 16 INVX1
|
||||
* cell instance $16 r0 *1 18.6,0
|
||||
X$16 3 13 16 3 12 16 INVX1
|
||||
* cell instance $14 r0 *1 11.4,0
|
||||
X$14 3 9 16 3 8 16 INVX1
|
||||
* cell instance $15 r0 *1 9.6,0
|
||||
X$15 3 8 16 3 7 16 INVX1
|
||||
* cell instance $16 r0 *1 7.8,0
|
||||
X$16 3 7 16 3 6 16 INVX1
|
||||
* cell instance $17 r0 *1 6,0
|
||||
X$17 3 6 16 3 5 16 INVX1
|
||||
* cell instance $18 r0 *1 4.2,0
|
||||
X$18 3 5 16 3 4 16 INVX1
|
||||
* device instance $1 r0 *1 2.65,5.8 PMOS
|
||||
M$1 3 2 4 3 PMOS L=0.25U W=1.5U AS=0.6375P AD=0.3375P PS=3.85U PD=1.95U
|
||||
* device instance $2 r0 *1 3.35,5.8 PMOS
|
||||
|
|
|
|||
|
|
@ -259,34 +259,34 @@ layout(
|
|||
)
|
||||
net(3 name(VDD)
|
||||
rect(l3 (1700 4500) (2600 3500))
|
||||
rect(l3 (-3800 -3500) (1400 3500))
|
||||
rect(l3 (-1900 -3500) (600 3500))
|
||||
rect(l3 (23300 -3500) (1400 3500))
|
||||
rect(l3 (19600 -3500) (1400 3500))
|
||||
rect(l3 (-100 -3500) (600 3500))
|
||||
rect(l8 (-22890 -2840) (180 180))
|
||||
rect(l3 (-25800 -3500) (600 3500))
|
||||
rect(l3 (-100 -3500) (1400 3500))
|
||||
rect(l8 (1010 -2840) (180 180))
|
||||
rect(l8 (-180 920) (180 180))
|
||||
rect(l8 (-180 -730) (180 180))
|
||||
rect(l8 (-1980 870) (180 180))
|
||||
rect(l8 (21420 870) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l11 (-21840 -1290) (300 1700))
|
||||
rect(l11 (1560 -1290) (300 1700))
|
||||
rect(l11 (-1350 0) (2400 800))
|
||||
rect(l11 (-1150 -400) (0 0))
|
||||
rect(l11 (-100 50) (0 0))
|
||||
rect(l11 (-2350 -450) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (-2950 -450) (600 800))
|
||||
rect(l11 (23400 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l2 (-23025 -2550) (450 1500))
|
||||
rect(l9 (-2275 -450) (500 1500))
|
||||
rect(l9 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25200 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l2 (1525 -2150) (450 1500))
|
||||
rect(l9 (21125 -450) (500 1500))
|
||||
rect(l9 (-23900 -1500) (500 1500))
|
||||
)
|
||||
net(4 name($4)
|
||||
rect(l8 (3610 1770) (180 180))
|
||||
|
|
@ -360,12 +360,12 @@ layout(
|
|||
rect(l11 (-1900 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (23850 -750) (300 1400))
|
||||
rect(l11 (23200 -350) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l6 (-23700 460) (425 950))
|
||||
rect(l11 (-25800 -800) (600 800))
|
||||
rect(l6 (1500 460) (425 950))
|
||||
rect(l10 (-1575 -2210) (500 1500))
|
||||
rect(l10 (22900 -1500) (500 1500))
|
||||
)
|
||||
|
|
@ -448,44 +448,28 @@ layout(
|
|||
pin(4 13)
|
||||
pin(5 16)
|
||||
)
|
||||
circuit(8 INVX1 location(4200 0)
|
||||
circuit(10 INVX1 location(18600 0)
|
||||
pin(0 3)
|
||||
pin(1 5)
|
||||
pin(1 13)
|
||||
pin(2 16)
|
||||
pin(3 3)
|
||||
pin(4 4)
|
||||
pin(4 12)
|
||||
pin(5 16)
|
||||
)
|
||||
circuit(9 INVX1 location(6000 0)
|
||||
circuit(11 INVX1 location(16800 0)
|
||||
pin(0 3)
|
||||
pin(1 6)
|
||||
pin(1 12)
|
||||
pin(2 16)
|
||||
pin(3 3)
|
||||
pin(4 5)
|
||||
pin(4 11)
|
||||
pin(5 16)
|
||||
)
|
||||
circuit(10 INVX1 location(7800 0)
|
||||
circuit(12 INVX1 location(15000 0)
|
||||
pin(0 3)
|
||||
pin(1 7)
|
||||
pin(1 11)
|
||||
pin(2 16)
|
||||
pin(3 3)
|
||||
pin(4 6)
|
||||
pin(5 16)
|
||||
)
|
||||
circuit(11 INVX1 location(9600 0)
|
||||
pin(0 3)
|
||||
pin(1 8)
|
||||
pin(2 16)
|
||||
pin(3 3)
|
||||
pin(4 7)
|
||||
pin(5 16)
|
||||
)
|
||||
circuit(12 INVX1 location(11400 0)
|
||||
pin(0 3)
|
||||
pin(1 9)
|
||||
pin(2 16)
|
||||
pin(3 3)
|
||||
pin(4 8)
|
||||
pin(4 10)
|
||||
pin(5 16)
|
||||
)
|
||||
circuit(13 INVX1 location(13200 0)
|
||||
|
|
@ -496,28 +480,44 @@ layout(
|
|||
pin(4 9)
|
||||
pin(5 16)
|
||||
)
|
||||
circuit(14 INVX1 location(15000 0)
|
||||
circuit(14 INVX1 location(11400 0)
|
||||
pin(0 3)
|
||||
pin(1 11)
|
||||
pin(1 9)
|
||||
pin(2 16)
|
||||
pin(3 3)
|
||||
pin(4 10)
|
||||
pin(4 8)
|
||||
pin(5 16)
|
||||
)
|
||||
circuit(15 INVX1 location(16800 0)
|
||||
circuit(15 INVX1 location(9600 0)
|
||||
pin(0 3)
|
||||
pin(1 12)
|
||||
pin(1 8)
|
||||
pin(2 16)
|
||||
pin(3 3)
|
||||
pin(4 11)
|
||||
pin(4 7)
|
||||
pin(5 16)
|
||||
)
|
||||
circuit(16 INVX1 location(18600 0)
|
||||
circuit(16 INVX1 location(7800 0)
|
||||
pin(0 3)
|
||||
pin(1 13)
|
||||
pin(1 7)
|
||||
pin(2 16)
|
||||
pin(3 3)
|
||||
pin(4 12)
|
||||
pin(4 6)
|
||||
pin(5 16)
|
||||
)
|
||||
circuit(17 INVX1 location(6000 0)
|
||||
pin(0 3)
|
||||
pin(1 6)
|
||||
pin(2 16)
|
||||
pin(3 3)
|
||||
pin(4 5)
|
||||
pin(5 16)
|
||||
)
|
||||
circuit(18 INVX1 location(4200 0)
|
||||
pin(0 3)
|
||||
pin(1 5)
|
||||
pin(2 16)
|
||||
pin(3 3)
|
||||
pin(4 4)
|
||||
pin(5 16)
|
||||
)
|
||||
|
||||
|
|
@ -801,15 +801,15 @@ xref(
|
|||
device(4 4 match)
|
||||
device(1 1 match)
|
||||
device(2 2 match)
|
||||
circuit(8 2 match)
|
||||
circuit(9 3 match)
|
||||
circuit(10 4 match)
|
||||
circuit(11 5 match)
|
||||
circuit(12 6 match)
|
||||
circuit(18 2 match)
|
||||
circuit(17 3 match)
|
||||
circuit(16 4 match)
|
||||
circuit(15 5 match)
|
||||
circuit(14 6 match)
|
||||
circuit(13 7 match)
|
||||
circuit(14 8 match)
|
||||
circuit(15 9 match)
|
||||
circuit(16 10 match)
|
||||
circuit(12 8 match)
|
||||
circuit(11 9 match)
|
||||
circuit(10 10 match)
|
||||
circuit(2 11 match)
|
||||
circuit(1 12 match)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -144,8 +144,8 @@ layout(
|
|||
rect(l11 (-240 -790) (300 1700))
|
||||
rect(l11 (-1350 0) (2400 800))
|
||||
rect(l11 (-1150 -400) (0 0))
|
||||
rect(l2 (-275 -2150) (425 1500))
|
||||
rect(l2 (-400 -1500) (425 1500))
|
||||
rect(l2 (-250 -2150) (425 1500))
|
||||
rect(l2 (-450 -1500) (425 1500))
|
||||
)
|
||||
net(2 name(OUT)
|
||||
rect(l8 (1810 1770) (180 180))
|
||||
|
|
@ -199,9 +199,9 @@ layout(
|
|||
rect(l11 (-150 -150) (300 300))
|
||||
)
|
||||
net(7 name(SUBSTRATE))
|
||||
net(8 name($I3)
|
||||
rect(l6 (975 1660) (425 950))
|
||||
rect(l6 (-400 -950) (425 950))
|
||||
net(8 name($I6)
|
||||
rect(l6 (1000 1660) (425 950))
|
||||
rect(l6 (-450 -950) (425 950))
|
||||
)
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
|
|
@ -403,27 +403,27 @@ layout(
|
|||
rect(l13 (17740 -400) (400 400))
|
||||
)
|
||||
net(12 name(VDD)
|
||||
rect(l3 (500 4500) (1400 3500))
|
||||
rect(l3 (-1900 -3500) (600 3500))
|
||||
rect(l3 (0 4500) (600 3500))
|
||||
rect(l3 (23300 -3500) (1400 3500))
|
||||
rect(l3 (-100 -3500) (600 3500))
|
||||
rect(l8 (-24690 -1240) (180 180))
|
||||
rect(l3 (-25300 -3500) (1400 3500))
|
||||
rect(l8 (22610 -1240) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l11 (-21740 860) (0 0))
|
||||
rect(l11 (-2350 -450) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (1660 860) (0 0))
|
||||
rect(l11 (-2950 -450) (600 800))
|
||||
rect(l11 (23400 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l9 (-24850 -1500) (500 1500))
|
||||
rect(l9 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25200 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l9 (23100 -1100) (500 1500))
|
||||
rect(l9 (-23900 -1500) (500 1500))
|
||||
)
|
||||
net(13 name(OUT)
|
||||
rect(l11 (23440 3840) (320 320))
|
||||
|
|
@ -438,23 +438,23 @@ layout(
|
|||
rect(l13 (-200 -200) (400 400))
|
||||
)
|
||||
net(15 name(VSS)
|
||||
rect(l8 (1110 1610) (180 180))
|
||||
rect(l8 (24510 1610) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l11 (-21740 -390) (0 0))
|
||||
rect(l11 (-1900 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (23850 -750) (300 1400))
|
||||
rect(l11 (1660 -390) (0 0))
|
||||
rect(l11 (21500 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l10 (-24850 -800) (500 1500))
|
||||
rect(l10 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25800 -800) (600 800))
|
||||
rect(l11 (450 -750) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l10 (23100 -400) (500 1500))
|
||||
rect(l10 (-23900 -1500) (500 1500))
|
||||
)
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
|
|
|
|||
|
|
@ -403,27 +403,27 @@ layout(
|
|||
rect(l13 (17740 -400) (400 400))
|
||||
)
|
||||
net(12 name(VDD)
|
||||
rect(l3 (500 4500) (1400 3500))
|
||||
rect(l3 (-1900 -3500) (600 3500))
|
||||
rect(l3 (0 4500) (600 3500))
|
||||
rect(l3 (23300 -3500) (1400 3500))
|
||||
rect(l3 (-100 -3500) (600 3500))
|
||||
rect(l8 (-24690 -1240) (180 180))
|
||||
rect(l3 (-25300 -3500) (1400 3500))
|
||||
rect(l8 (22610 -1240) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l11 (-21740 860) (0 0))
|
||||
rect(l11 (-2350 -450) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (1660 860) (0 0))
|
||||
rect(l11 (-2950 -450) (600 800))
|
||||
rect(l11 (23400 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l9 (-24850 -1500) (500 1500))
|
||||
rect(l9 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25200 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l9 (23100 -1100) (500 1500))
|
||||
rect(l9 (-23900 -1500) (500 1500))
|
||||
)
|
||||
net(13 name(OUT)
|
||||
rect(l11 (23440 3840) (320 320))
|
||||
|
|
@ -438,23 +438,23 @@ layout(
|
|||
rect(l13 (-200 -200) (400 400))
|
||||
)
|
||||
net(15 name(VSS)
|
||||
rect(l8 (1110 1610) (180 180))
|
||||
rect(l8 (24510 1610) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l11 (-21740 -390) (0 0))
|
||||
rect(l11 (-1900 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (23850 -750) (300 1400))
|
||||
rect(l11 (1660 -390) (0 0))
|
||||
rect(l11 (21500 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l10 (-24850 -800) (500 1500))
|
||||
rect(l10 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25800 -800) (600 800))
|
||||
rect(l11 (450 -750) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l10 (23100 -400) (500 1500))
|
||||
rect(l10 (-23900 -1500) (500 1500))
|
||||
)
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
|
|
|
|||
|
|
@ -116,9 +116,9 @@ layout(
|
|||
rect(l13 (17740 -400) (400 400))
|
||||
)
|
||||
net(6 name(VDD)
|
||||
rect(l3 (1100 4500) (1400 3500))
|
||||
rect(l3 (-1900 -3500) (600 3500))
|
||||
rect(l3 (23300 -3500) (1400 3500))
|
||||
rect(l3 (600 4500) (600 3500))
|
||||
rect(l3 (-100 -3500) (1400 3500))
|
||||
rect(l3 (22000 -3500) (1400 3500))
|
||||
rect(l3 (-100 -3500) (600 3500))
|
||||
rect(l8 (-24690 -1240) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
|
|
@ -127,11 +127,11 @@ layout(
|
|||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l11 (-22340 860) (0 0))
|
||||
rect(l11 (-1750 -450) (1200 800))
|
||||
rect(l11 (-2350 -450) (600 800))
|
||||
rect(l11 (0 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (23400 -800) (1200 800))
|
||||
rect(l11 (22750 -400) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
|
|
@ -151,23 +151,23 @@ layout(
|
|||
rect(l13 (-200 -200) (400 400))
|
||||
)
|
||||
net(9 name(VSS)
|
||||
rect(l8 (1710 1610) (180 180))
|
||||
rect(l8 (25110 1610) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l11 (-22340 -390) (0 0))
|
||||
rect(l11 (-1300 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (23850 -750) (300 1400))
|
||||
rect(l11 (1060 -390) (0 0))
|
||||
rect(l11 (22100 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l10 (-24850 -800) (500 1500))
|
||||
rect(l10 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25800 -800) (600 800))
|
||||
rect(l11 (450 -750) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l10 (23100 -400) (500 1500))
|
||||
rect(l10 (-23900 -1500) (500 1500))
|
||||
)
|
||||
net(10 name($I22)
|
||||
rect(l11 (7350 2950) (900 300))
|
||||
|
|
|
|||
|
|
@ -116,9 +116,9 @@ layout(
|
|||
rect(l13 (17740 -400) (400 400))
|
||||
)
|
||||
net(6 name(VDD)
|
||||
rect(l3 (1100 4500) (1400 3500))
|
||||
rect(l3 (-1900 -3500) (600 3500))
|
||||
rect(l3 (23300 -3500) (1400 3500))
|
||||
rect(l3 (600 4500) (600 3500))
|
||||
rect(l3 (-100 -3500) (1400 3500))
|
||||
rect(l3 (22000 -3500) (1400 3500))
|
||||
rect(l3 (-100 -3500) (600 3500))
|
||||
rect(l8 (-24690 -1240) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
|
|
@ -127,11 +127,11 @@ layout(
|
|||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l11 (-22340 860) (0 0))
|
||||
rect(l11 (-1750 -450) (1200 800))
|
||||
rect(l11 (-2350 -450) (600 800))
|
||||
rect(l11 (0 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (23400 -800) (1200 800))
|
||||
rect(l11 (22750 -400) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
|
|
@ -151,23 +151,23 @@ layout(
|
|||
rect(l13 (-200 -200) (400 400))
|
||||
)
|
||||
net(9 name(VSS)
|
||||
rect(l8 (1710 1610) (180 180))
|
||||
rect(l8 (25110 1610) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l11 (-22340 -390) (0 0))
|
||||
rect(l11 (-1300 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (23850 -750) (300 1400))
|
||||
rect(l11 (1060 -390) (0 0))
|
||||
rect(l11 (22100 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l10 (-24850 -800) (500 1500))
|
||||
rect(l10 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25800 -800) (600 800))
|
||||
rect(l11 (450 -750) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l10 (23100 -400) (500 1500))
|
||||
rect(l10 (-23900 -1500) (500 1500))
|
||||
)
|
||||
net(10 name($I22)
|
||||
rect(l11 (7350 2950) (900 300))
|
||||
|
|
|
|||
|
|
@ -144,8 +144,8 @@ layout(
|
|||
rect(l11 (-240 -790) (300 1700))
|
||||
rect(l11 (-1350 0) (2400 800))
|
||||
rect(l11 (-1150 -400) (0 0))
|
||||
rect(l2 (-275 -2150) (425 1500))
|
||||
rect(l2 (-400 -1500) (425 1500))
|
||||
rect(l2 (-250 -2150) (425 1500))
|
||||
rect(l2 (-450 -1500) (425 1500))
|
||||
)
|
||||
net(2 name(OUT)
|
||||
rect(l8 (1810 1770) (180 180))
|
||||
|
|
@ -199,9 +199,9 @@ layout(
|
|||
rect(l11 (-150 -150) (300 300))
|
||||
)
|
||||
net(7 name(SUBSTRATE))
|
||||
net(8 name($I3)
|
||||
rect(l6 (975 1660) (425 950))
|
||||
rect(l6 (-400 -950) (425 950))
|
||||
net(8 name($I6)
|
||||
rect(l6 (1000 1660) (425 950))
|
||||
rect(l6 (-450 -950) (425 950))
|
||||
)
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
|
|
@ -403,27 +403,27 @@ layout(
|
|||
rect(l13 (17740 -400) (400 400))
|
||||
)
|
||||
net(12 name(VDD)
|
||||
rect(l3 (500 4500) (1400 3500))
|
||||
rect(l3 (-1900 -3500) (600 3500))
|
||||
rect(l3 (0 4500) (600 3500))
|
||||
rect(l3 (23300 -3500) (1400 3500))
|
||||
rect(l3 (-100 -3500) (600 3500))
|
||||
rect(l8 (-24690 -1240) (180 180))
|
||||
rect(l3 (-25300 -3500) (1400 3500))
|
||||
rect(l8 (22610 -1240) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l11 (-21740 860) (0 0))
|
||||
rect(l11 (-2350 -450) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (1660 860) (0 0))
|
||||
rect(l11 (-2950 -450) (600 800))
|
||||
rect(l11 (23400 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l9 (-24850 -1500) (500 1500))
|
||||
rect(l9 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25200 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l9 (23100 -1100) (500 1500))
|
||||
rect(l9 (-23900 -1500) (500 1500))
|
||||
)
|
||||
net(13 name(OUT)
|
||||
rect(l11 (23440 3840) (320 320))
|
||||
|
|
@ -438,23 +438,23 @@ layout(
|
|||
rect(l13 (-200 -200) (400 400))
|
||||
)
|
||||
net(15 name(VSS)
|
||||
rect(l8 (1110 1610) (180 180))
|
||||
rect(l8 (24510 1610) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l11 (-21740 -390) (0 0))
|
||||
rect(l11 (-1900 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (23850 -750) (300 1400))
|
||||
rect(l11 (1660 -390) (0 0))
|
||||
rect(l11 (21500 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l10 (-24850 -800) (500 1500))
|
||||
rect(l10 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25800 -800) (600 800))
|
||||
rect(l11 (450 -750) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l10 (23100 -400) (500 1500))
|
||||
rect(l10 (-23900 -1500) (500 1500))
|
||||
)
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
|
|
|
|||
|
|
@ -403,27 +403,27 @@ layout(
|
|||
rect(l13 (17740 -400) (400 400))
|
||||
)
|
||||
net(12 name(VDD)
|
||||
rect(l3 (500 4500) (1400 3500))
|
||||
rect(l3 (-1900 -3500) (600 3500))
|
||||
rect(l3 (0 4500) (600 3500))
|
||||
rect(l3 (23300 -3500) (1400 3500))
|
||||
rect(l3 (-100 -3500) (600 3500))
|
||||
rect(l8 (-24690 -1240) (180 180))
|
||||
rect(l3 (-25300 -3500) (1400 3500))
|
||||
rect(l8 (22610 -1240) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l11 (-21740 860) (0 0))
|
||||
rect(l11 (-2350 -450) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (1660 860) (0 0))
|
||||
rect(l11 (-2950 -450) (600 800))
|
||||
rect(l11 (23400 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l9 (-24850 -1500) (500 1500))
|
||||
rect(l9 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25200 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l9 (23100 -1100) (500 1500))
|
||||
rect(l9 (-23900 -1500) (500 1500))
|
||||
)
|
||||
net(13 name(OUT)
|
||||
rect(l11 (23440 3840) (320 320))
|
||||
|
|
@ -438,23 +438,23 @@ layout(
|
|||
rect(l13 (-200 -200) (400 400))
|
||||
)
|
||||
net(15 name(VSS)
|
||||
rect(l8 (1110 1610) (180 180))
|
||||
rect(l8 (24510 1610) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l11 (-21740 -390) (0 0))
|
||||
rect(l11 (-1900 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (23850 -750) (300 1400))
|
||||
rect(l11 (1660 -390) (0 0))
|
||||
rect(l11 (21500 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l10 (-24850 -800) (500 1500))
|
||||
rect(l10 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25800 -800) (600 800))
|
||||
rect(l11 (450 -750) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l10 (23100 -400) (500 1500))
|
||||
rect(l10 (-23900 -1500) (500 1500))
|
||||
)
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
|
|
|
|||
|
|
@ -144,8 +144,8 @@ layout(
|
|||
rect(l11 (-240 -790) (300 1700))
|
||||
rect(l11 (-1350 0) (2400 800))
|
||||
rect(l11 (-1150 -400) (0 0))
|
||||
rect(l2 (-275 -2150) (425 1500))
|
||||
rect(l2 (-400 -1500) (425 1500))
|
||||
rect(l2 (-250 -2150) (425 1500))
|
||||
rect(l2 (-450 -1500) (425 1500))
|
||||
)
|
||||
net(2 name(OUT)
|
||||
rect(l8 (1810 1770) (180 180))
|
||||
|
|
@ -199,9 +199,9 @@ layout(
|
|||
rect(l11 (-150 -150) (300 300))
|
||||
)
|
||||
net(7 name(SUBSTRATE))
|
||||
net(8 name($I3)
|
||||
rect(l6 (975 1660) (425 950))
|
||||
rect(l6 (-400 -950) (425 950))
|
||||
net(8 name($I6)
|
||||
rect(l6 (1000 1660) (425 950))
|
||||
rect(l6 (-450 -950) (425 950))
|
||||
)
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
|
|
@ -403,27 +403,27 @@ layout(
|
|||
rect(l13 (17740 -400) (400 400))
|
||||
)
|
||||
net(12 name(VDD)
|
||||
rect(l3 (500 4500) (1400 3500))
|
||||
rect(l3 (-1900 -3500) (600 3500))
|
||||
rect(l3 (0 4500) (600 3500))
|
||||
rect(l3 (23300 -3500) (1400 3500))
|
||||
rect(l3 (-100 -3500) (600 3500))
|
||||
rect(l8 (-24690 -1240) (180 180))
|
||||
rect(l3 (-25300 -3500) (1400 3500))
|
||||
rect(l8 (22610 -1240) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l11 (-21740 860) (0 0))
|
||||
rect(l11 (-2350 -450) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (1660 860) (0 0))
|
||||
rect(l11 (-2950 -450) (600 800))
|
||||
rect(l11 (23400 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l9 (-24850 -1500) (500 1500))
|
||||
rect(l9 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25200 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l9 (23100 -1100) (500 1500))
|
||||
rect(l9 (-23900 -1500) (500 1500))
|
||||
)
|
||||
net(13 name(OUT)
|
||||
rect(l11 (23440 3840) (320 320))
|
||||
|
|
@ -438,23 +438,23 @@ layout(
|
|||
rect(l13 (-200 -200) (400 400))
|
||||
)
|
||||
net(15 name(VSS)
|
||||
rect(l8 (1110 1610) (180 180))
|
||||
rect(l8 (24510 1610) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l11 (-21740 -390) (0 0))
|
||||
rect(l11 (-1900 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (23850 -750) (300 1400))
|
||||
rect(l11 (1660 -390) (0 0))
|
||||
rect(l11 (21500 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l10 (-24850 -800) (500 1500))
|
||||
rect(l10 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25800 -800) (600 800))
|
||||
rect(l11 (450 -750) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l10 (23100 -400) (500 1500))
|
||||
rect(l10 (-23900 -1500) (500 1500))
|
||||
)
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
|
|
|
|||
|
|
@ -403,27 +403,27 @@ layout(
|
|||
rect(l13 (17740 -400) (400 400))
|
||||
)
|
||||
net(12 name(VDD)
|
||||
rect(l3 (500 4500) (1400 3500))
|
||||
rect(l3 (-1900 -3500) (600 3500))
|
||||
rect(l3 (0 4500) (600 3500))
|
||||
rect(l3 (23300 -3500) (1400 3500))
|
||||
rect(l3 (-100 -3500) (600 3500))
|
||||
rect(l8 (-24690 -1240) (180 180))
|
||||
rect(l3 (-25300 -3500) (1400 3500))
|
||||
rect(l8 (22610 -1240) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l11 (-21740 860) (0 0))
|
||||
rect(l11 (-2350 -450) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (1660 860) (0 0))
|
||||
rect(l11 (-2950 -450) (600 800))
|
||||
rect(l11 (23400 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l9 (-24850 -1500) (500 1500))
|
||||
rect(l9 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25200 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l9 (23100 -1100) (500 1500))
|
||||
rect(l9 (-23900 -1500) (500 1500))
|
||||
)
|
||||
net(13 name(OUT)
|
||||
rect(l11 (23440 3840) (320 320))
|
||||
|
|
@ -438,23 +438,23 @@ layout(
|
|||
rect(l13 (-200 -200) (400 400))
|
||||
)
|
||||
net(15 name(VSS)
|
||||
rect(l8 (1110 1610) (180 180))
|
||||
rect(l8 (24510 1610) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l11 (-21740 -390) (0 0))
|
||||
rect(l11 (-1900 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (23850 -750) (300 1400))
|
||||
rect(l11 (1660 -390) (0 0))
|
||||
rect(l11 (21500 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l10 (-24850 -800) (500 1500))
|
||||
rect(l10 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25800 -800) (600 800))
|
||||
rect(l11 (450 -750) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l10 (23100 -400) (500 1500))
|
||||
rect(l10 (-23900 -1500) (500 1500))
|
||||
)
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
|
|
|
|||
|
|
@ -407,27 +407,27 @@ layout(
|
|||
rect(l15 (17740 -400) (400 400))
|
||||
)
|
||||
net(12 name(VDD)
|
||||
rect(l4 (500 4500) (1400 3500))
|
||||
rect(l4 (-1900 -3500) (600 3500))
|
||||
rect(l4 (0 4500) (600 3500))
|
||||
rect(l4 (23300 -3500) (1400 3500))
|
||||
rect(l4 (-100 -3500) (600 3500))
|
||||
rect(l10 (-24690 -1240) (180 180))
|
||||
rect(l4 (-25300 -3500) (1400 3500))
|
||||
rect(l10 (22610 -1240) (180 180))
|
||||
rect(l10 (-180 370) (180 180))
|
||||
rect(l10 (-180 -1280) (180 180))
|
||||
rect(l10 (23220 370) (180 180))
|
||||
rect(l10 (-23580 370) (180 180))
|
||||
rect(l10 (-180 370) (180 180))
|
||||
rect(l10 (-180 -1280) (180 180))
|
||||
rect(l13 (-21740 860) (0 0))
|
||||
rect(l13 (-2350 -450) (1200 800))
|
||||
rect(l13 (-750 -1450) (300 1400))
|
||||
rect(l13 (-100 -350) (0 0))
|
||||
rect(l13 (-1250 -400) (600 800))
|
||||
rect(l13 (1660 860) (0 0))
|
||||
rect(l13 (-2950 -450) (600 800))
|
||||
rect(l13 (23400 -800) (1200 800))
|
||||
rect(l13 (-750 -1450) (300 1400))
|
||||
rect(l13 (-100 -350) (0 0))
|
||||
rect(l13 (550 -400) (600 800))
|
||||
rect(l11 (-24850 -1500) (500 1500))
|
||||
rect(l11 (22900 -1500) (500 1500))
|
||||
rect(l13 (-25200 -800) (1200 800))
|
||||
rect(l13 (-750 -1450) (300 1400))
|
||||
rect(l13 (-100 -350) (0 0))
|
||||
rect(l11 (23100 -1100) (500 1500))
|
||||
rect(l11 (-23900 -1500) (500 1500))
|
||||
)
|
||||
net(13 name(OUT)
|
||||
rect(l13 (23440 3840) (320 320))
|
||||
|
|
@ -442,23 +442,23 @@ layout(
|
|||
rect(l15 (-200 -200) (400 400))
|
||||
)
|
||||
net(15 name(VSS)
|
||||
rect(l10 (1110 1610) (180 180))
|
||||
rect(l10 (24510 1610) (180 180))
|
||||
rect(l10 (-180 -1280) (180 180))
|
||||
rect(l10 (-180 370) (180 180))
|
||||
rect(l10 (23220 370) (180 180))
|
||||
rect(l10 (-23580 370) (180 180))
|
||||
rect(l10 (-180 -1280) (180 180))
|
||||
rect(l10 (-180 370) (180 180))
|
||||
rect(l13 (-21740 -390) (0 0))
|
||||
rect(l13 (-1900 -400) (300 1400))
|
||||
rect(l13 (-750 -1450) (1200 800))
|
||||
rect(l13 (-550 -400) (0 0))
|
||||
rect(l13 (-1250 -400) (600 800))
|
||||
rect(l13 (23850 -750) (300 1400))
|
||||
rect(l13 (1660 -390) (0 0))
|
||||
rect(l13 (21500 -400) (300 1400))
|
||||
rect(l13 (-750 -1450) (1200 800))
|
||||
rect(l13 (-550 -400) (0 0))
|
||||
rect(l13 (550 -400) (600 800))
|
||||
rect(l12 (-24850 -800) (500 1500))
|
||||
rect(l12 (22900 -1500) (500 1500))
|
||||
rect(l13 (-25800 -800) (600 800))
|
||||
rect(l13 (450 -750) (300 1400))
|
||||
rect(l13 (-750 -1450) (1200 800))
|
||||
rect(l13 (-550 -400) (0 0))
|
||||
rect(l12 (23100 -400) (500 1500))
|
||||
rect(l12 (-23900 -1500) (500 1500))
|
||||
)
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
|
|
|
|||
|
|
@ -407,27 +407,27 @@ layout(
|
|||
rect(l15 (17740 -400) (400 400))
|
||||
)
|
||||
net(12 name(VDD)
|
||||
rect(l4 (500 4500) (1400 3500))
|
||||
rect(l4 (-1900 -3500) (600 3500))
|
||||
rect(l4 (0 4500) (600 3500))
|
||||
rect(l4 (23300 -3500) (1400 3500))
|
||||
rect(l4 (-100 -3500) (600 3500))
|
||||
rect(l10 (-24690 -1240) (180 180))
|
||||
rect(l4 (-25300 -3500) (1400 3500))
|
||||
rect(l10 (22610 -1240) (180 180))
|
||||
rect(l10 (-180 370) (180 180))
|
||||
rect(l10 (-180 -1280) (180 180))
|
||||
rect(l10 (23220 370) (180 180))
|
||||
rect(l10 (-23580 370) (180 180))
|
||||
rect(l10 (-180 370) (180 180))
|
||||
rect(l10 (-180 -1280) (180 180))
|
||||
rect(l13 (-21740 860) (0 0))
|
||||
rect(l13 (-2350 -450) (1200 800))
|
||||
rect(l13 (-750 -1450) (300 1400))
|
||||
rect(l13 (-100 -350) (0 0))
|
||||
rect(l13 (-1250 -400) (600 800))
|
||||
rect(l13 (1660 860) (0 0))
|
||||
rect(l13 (-2950 -450) (600 800))
|
||||
rect(l13 (23400 -800) (1200 800))
|
||||
rect(l13 (-750 -1450) (300 1400))
|
||||
rect(l13 (-100 -350) (0 0))
|
||||
rect(l13 (550 -400) (600 800))
|
||||
rect(l11 (-24850 -1500) (500 1500))
|
||||
rect(l11 (22900 -1500) (500 1500))
|
||||
rect(l13 (-25200 -800) (1200 800))
|
||||
rect(l13 (-750 -1450) (300 1400))
|
||||
rect(l13 (-100 -350) (0 0))
|
||||
rect(l11 (23100 -1100) (500 1500))
|
||||
rect(l11 (-23900 -1500) (500 1500))
|
||||
)
|
||||
net(13 name(OUT)
|
||||
rect(l13 (23440 3840) (320 320))
|
||||
|
|
@ -442,23 +442,23 @@ layout(
|
|||
rect(l15 (-200 -200) (400 400))
|
||||
)
|
||||
net(15 name(VSS)
|
||||
rect(l10 (1110 1610) (180 180))
|
||||
rect(l10 (24510 1610) (180 180))
|
||||
rect(l10 (-180 -1280) (180 180))
|
||||
rect(l10 (-180 370) (180 180))
|
||||
rect(l10 (23220 370) (180 180))
|
||||
rect(l10 (-23580 370) (180 180))
|
||||
rect(l10 (-180 -1280) (180 180))
|
||||
rect(l10 (-180 370) (180 180))
|
||||
rect(l13 (-21740 -390) (0 0))
|
||||
rect(l13 (-1900 -400) (300 1400))
|
||||
rect(l13 (-750 -1450) (1200 800))
|
||||
rect(l13 (-550 -400) (0 0))
|
||||
rect(l13 (-1250 -400) (600 800))
|
||||
rect(l13 (23850 -750) (300 1400))
|
||||
rect(l13 (1660 -390) (0 0))
|
||||
rect(l13 (21500 -400) (300 1400))
|
||||
rect(l13 (-750 -1450) (1200 800))
|
||||
rect(l13 (-550 -400) (0 0))
|
||||
rect(l13 (550 -400) (600 800))
|
||||
rect(l12 (-24850 -800) (500 1500))
|
||||
rect(l12 (22900 -1500) (500 1500))
|
||||
rect(l13 (-25800 -800) (600 800))
|
||||
rect(l13 (450 -750) (300 1400))
|
||||
rect(l13 (-750 -1450) (1200 800))
|
||||
rect(l13 (-550 -400) (0 0))
|
||||
rect(l12 (23100 -400) (500 1500))
|
||||
rect(l12 (-23900 -1500) (500 1500))
|
||||
)
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
|
|
|
|||
|
|
@ -413,27 +413,27 @@ layout(
|
|||
rect(l15 (17740 -400) (400 400))
|
||||
)
|
||||
net(12 name(VDD)
|
||||
rect(l4 (500 4500) (1400 3500))
|
||||
rect(l4 (-1900 -3500) (600 3500))
|
||||
rect(l4 (0 4500) (600 3500))
|
||||
rect(l4 (23300 -3500) (1400 3500))
|
||||
rect(l4 (-100 -3500) (600 3500))
|
||||
rect(l10 (-24690 -1240) (180 180))
|
||||
rect(l4 (-25300 -3500) (1400 3500))
|
||||
rect(l10 (22610 -1240) (180 180))
|
||||
rect(l10 (-180 370) (180 180))
|
||||
rect(l10 (-180 -1280) (180 180))
|
||||
rect(l10 (23220 370) (180 180))
|
||||
rect(l10 (-23580 370) (180 180))
|
||||
rect(l10 (-180 370) (180 180))
|
||||
rect(l10 (-180 -1280) (180 180))
|
||||
rect(l13 (-21740 860) (0 0))
|
||||
rect(l13 (-2350 -450) (1200 800))
|
||||
rect(l13 (-750 -1450) (300 1400))
|
||||
rect(l13 (-100 -350) (0 0))
|
||||
rect(l13 (-1250 -400) (600 800))
|
||||
rect(l13 (1660 860) (0 0))
|
||||
rect(l13 (-2950 -450) (600 800))
|
||||
rect(l13 (23400 -800) (1200 800))
|
||||
rect(l13 (-750 -1450) (300 1400))
|
||||
rect(l13 (-100 -350) (0 0))
|
||||
rect(l13 (550 -400) (600 800))
|
||||
rect(l11 (-24850 -1500) (500 1500))
|
||||
rect(l11 (22900 -1500) (500 1500))
|
||||
rect(l13 (-25200 -800) (1200 800))
|
||||
rect(l13 (-750 -1450) (300 1400))
|
||||
rect(l13 (-100 -350) (0 0))
|
||||
rect(l11 (23100 -1100) (500 1500))
|
||||
rect(l11 (-23900 -1500) (500 1500))
|
||||
)
|
||||
net(13 name(OUT)
|
||||
rect(l13 (23440 3840) (320 320))
|
||||
|
|
@ -448,23 +448,23 @@ layout(
|
|||
rect(l15 (-200 -200) (400 400))
|
||||
)
|
||||
net(15 name(VSS)
|
||||
rect(l10 (1110 1610) (180 180))
|
||||
rect(l10 (24510 1610) (180 180))
|
||||
rect(l10 (-180 -1280) (180 180))
|
||||
rect(l10 (-180 370) (180 180))
|
||||
rect(l10 (23220 370) (180 180))
|
||||
rect(l10 (-23580 370) (180 180))
|
||||
rect(l10 (-180 -1280) (180 180))
|
||||
rect(l10 (-180 370) (180 180))
|
||||
rect(l13 (-21740 -390) (0 0))
|
||||
rect(l13 (-1900 -400) (300 1400))
|
||||
rect(l13 (-750 -1450) (1200 800))
|
||||
rect(l13 (-550 -400) (0 0))
|
||||
rect(l13 (-1250 -400) (600 800))
|
||||
rect(l13 (23850 -750) (300 1400))
|
||||
rect(l13 (1660 -390) (0 0))
|
||||
rect(l13 (21500 -400) (300 1400))
|
||||
rect(l13 (-750 -1450) (1200 800))
|
||||
rect(l13 (-550 -400) (0 0))
|
||||
rect(l13 (550 -400) (600 800))
|
||||
rect(l12 (-24850 -800) (500 1500))
|
||||
rect(l12 (22900 -1500) (500 1500))
|
||||
rect(l13 (-25800 -800) (600 800))
|
||||
rect(l13 (450 -750) (300 1400))
|
||||
rect(l13 (-750 -1450) (1200 800))
|
||||
rect(l13 (-550 -400) (0 0))
|
||||
rect(l12 (23100 -400) (500 1500))
|
||||
rect(l12 (-23900 -1500) (500 1500))
|
||||
)
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
|
|
|
|||
|
|
@ -413,27 +413,27 @@ layout(
|
|||
rect(l15 (17740 -400) (400 400))
|
||||
)
|
||||
net(12 name(VDD)
|
||||
rect(l4 (500 4500) (1400 3500))
|
||||
rect(l4 (-1900 -3500) (600 3500))
|
||||
rect(l4 (0 4500) (600 3500))
|
||||
rect(l4 (23300 -3500) (1400 3500))
|
||||
rect(l4 (-100 -3500) (600 3500))
|
||||
rect(l10 (-24690 -1240) (180 180))
|
||||
rect(l4 (-25300 -3500) (1400 3500))
|
||||
rect(l10 (22610 -1240) (180 180))
|
||||
rect(l10 (-180 370) (180 180))
|
||||
rect(l10 (-180 -1280) (180 180))
|
||||
rect(l10 (23220 370) (180 180))
|
||||
rect(l10 (-23580 370) (180 180))
|
||||
rect(l10 (-180 370) (180 180))
|
||||
rect(l10 (-180 -1280) (180 180))
|
||||
rect(l13 (-21740 860) (0 0))
|
||||
rect(l13 (-2350 -450) (1200 800))
|
||||
rect(l13 (-750 -1450) (300 1400))
|
||||
rect(l13 (-100 -350) (0 0))
|
||||
rect(l13 (-1250 -400) (600 800))
|
||||
rect(l13 (1660 860) (0 0))
|
||||
rect(l13 (-2950 -450) (600 800))
|
||||
rect(l13 (23400 -800) (1200 800))
|
||||
rect(l13 (-750 -1450) (300 1400))
|
||||
rect(l13 (-100 -350) (0 0))
|
||||
rect(l13 (550 -400) (600 800))
|
||||
rect(l11 (-24850 -1500) (500 1500))
|
||||
rect(l11 (22900 -1500) (500 1500))
|
||||
rect(l13 (-25200 -800) (1200 800))
|
||||
rect(l13 (-750 -1450) (300 1400))
|
||||
rect(l13 (-100 -350) (0 0))
|
||||
rect(l11 (23100 -1100) (500 1500))
|
||||
rect(l11 (-23900 -1500) (500 1500))
|
||||
)
|
||||
net(13 name(OUT)
|
||||
rect(l13 (23440 3840) (320 320))
|
||||
|
|
@ -448,23 +448,23 @@ layout(
|
|||
rect(l15 (-200 -200) (400 400))
|
||||
)
|
||||
net(15 name(VSS)
|
||||
rect(l10 (1110 1610) (180 180))
|
||||
rect(l10 (24510 1610) (180 180))
|
||||
rect(l10 (-180 -1280) (180 180))
|
||||
rect(l10 (-180 370) (180 180))
|
||||
rect(l10 (23220 370) (180 180))
|
||||
rect(l10 (-23580 370) (180 180))
|
||||
rect(l10 (-180 -1280) (180 180))
|
||||
rect(l10 (-180 370) (180 180))
|
||||
rect(l13 (-21740 -390) (0 0))
|
||||
rect(l13 (-1900 -400) (300 1400))
|
||||
rect(l13 (-750 -1450) (1200 800))
|
||||
rect(l13 (-550 -400) (0 0))
|
||||
rect(l13 (-1250 -400) (600 800))
|
||||
rect(l13 (23850 -750) (300 1400))
|
||||
rect(l13 (1660 -390) (0 0))
|
||||
rect(l13 (21500 -400) (300 1400))
|
||||
rect(l13 (-750 -1450) (1200 800))
|
||||
rect(l13 (-550 -400) (0 0))
|
||||
rect(l13 (550 -400) (600 800))
|
||||
rect(l12 (-24850 -800) (500 1500))
|
||||
rect(l12 (22900 -1500) (500 1500))
|
||||
rect(l13 (-25800 -800) (600 800))
|
||||
rect(l13 (450 -750) (300 1400))
|
||||
rect(l13 (-750 -1450) (1200 800))
|
||||
rect(l13 (-550 -400) (0 0))
|
||||
rect(l12 (23100 -400) (500 1500))
|
||||
rect(l12 (-23900 -1500) (500 1500))
|
||||
)
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
|
|
|
|||
|
|
@ -144,8 +144,8 @@ layout(
|
|||
rect(l11 (-240 -790) (300 1700))
|
||||
rect(l11 (-1350 0) (2400 800))
|
||||
rect(l11 (-1150 -400) (0 0))
|
||||
rect(l2 (-275 -2150) (425 1500))
|
||||
rect(l2 (-400 -1500) (425 1500))
|
||||
rect(l2 (-250 -2150) (425 1500))
|
||||
rect(l2 (-450 -1500) (425 1500))
|
||||
)
|
||||
net(2 name(OUT)
|
||||
rect(l8 (1810 1770) (180 180))
|
||||
|
|
@ -199,9 +199,9 @@ layout(
|
|||
rect(l11 (-150 -150) (300 300))
|
||||
)
|
||||
net(7 name(SUBSTRATE))
|
||||
net(8 name($I3)
|
||||
rect(l6 (975 1660) (425 950))
|
||||
rect(l6 (-400 -950) (425 950))
|
||||
net(8 name($I6)
|
||||
rect(l6 (1000 1660) (425 950))
|
||||
rect(l6 (-450 -950) (425 950))
|
||||
)
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
|
|
@ -410,33 +410,33 @@ layout(
|
|||
rect(l13 (17740 -400) (400 400))
|
||||
)
|
||||
net(13 name(VDD)
|
||||
rect(l3 (500 4500) (1400 3500))
|
||||
rect(l3 (-1900 -3500) (600 3500))
|
||||
rect(l3 (27000 4500) (600 3500))
|
||||
rect(l3 (-1200 -3500) (600 3500))
|
||||
rect(l3 (-1200 -3500) (600 3500))
|
||||
rect(l3 (-26400 -3500) (600 3500))
|
||||
rect(l3 (23300 -3500) (1400 3500))
|
||||
rect(l3 (-100 -3500) (600 3500))
|
||||
rect(l3 (0 -3500) (600 3500))
|
||||
rect(l3 (0 -3500) (600 3500))
|
||||
rect(l3 (0 -3500) (600 3500))
|
||||
rect(l8 (-26490 -1240) (180 180))
|
||||
rect(l3 (-25300 -3500) (1400 3500))
|
||||
rect(l8 (22610 -1240) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l11 (-21740 860) (0 0))
|
||||
rect(l11 (-2350 -450) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (1660 860) (0 0))
|
||||
rect(l11 (24050 -450) (600 800))
|
||||
rect(l11 (-1200 -800) (600 800))
|
||||
rect(l11 (-1200 -800) (600 800))
|
||||
rect(l11 (-26400 -800) (600 800))
|
||||
rect(l11 (23400 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l11 (0 -800) (600 800))
|
||||
rect(l11 (0 -800) (600 800))
|
||||
rect(l11 (0 -800) (600 800))
|
||||
rect(l9 (-26650 -1500) (500 1500))
|
||||
rect(l9 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25200 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l9 (23100 -1100) (500 1500))
|
||||
rect(l9 (-23900 -1500) (500 1500))
|
||||
)
|
||||
net(14 name(OUT)
|
||||
rect(l11 (23440 3840) (320 320))
|
||||
|
|
@ -455,30 +455,30 @@ layout(
|
|||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (520 -730) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-25780 -890) (180 180))
|
||||
rect(l8 (-2380 -890) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l11 (1260 -40) (300 1360))
|
||||
rect(l11 (24660 -40) (300 1360))
|
||||
rect(l11 (400 -1360) (300 1360))
|
||||
rect(l11 (-24000 -1710) (0 0))
|
||||
rect(l11 (-1900 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (23850 -750) (300 1400))
|
||||
rect(l11 (21500 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l11 (0 -800) (600 800))
|
||||
rect(l11 (0 -800) (600 800))
|
||||
rect(l11 (0 -800) (600 800))
|
||||
rect(l6 (-1700 400) (425 950))
|
||||
rect(l11 (1200 -800) (600 800))
|
||||
rect(l11 (-1200 -800) (600 800))
|
||||
rect(l11 (-1200 -800) (600 800))
|
||||
rect(l11 (-26400 -800) (600 800))
|
||||
rect(l11 (450 -750) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l6 (24650 800) (425 950))
|
||||
rect(l6 (250 -950) (425 950))
|
||||
rect(l10 (-26050 -2150) (500 1500))
|
||||
rect(l10 (22900 -1500) (500 1500))
|
||||
rect(l10 (-2650 -2150) (500 1500))
|
||||
rect(l10 (-23900 -1500) (500 1500))
|
||||
)
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
|
|
|
|||
|
|
@ -410,33 +410,33 @@ layout(
|
|||
rect(l13 (17740 -400) (400 400))
|
||||
)
|
||||
net(13 name(VDD)
|
||||
rect(l3 (500 4500) (1400 3500))
|
||||
rect(l3 (-1900 -3500) (600 3500))
|
||||
rect(l3 (27000 4500) (600 3500))
|
||||
rect(l3 (-1200 -3500) (600 3500))
|
||||
rect(l3 (-1200 -3500) (600 3500))
|
||||
rect(l3 (-26400 -3500) (600 3500))
|
||||
rect(l3 (23300 -3500) (1400 3500))
|
||||
rect(l3 (-100 -3500) (600 3500))
|
||||
rect(l3 (0 -3500) (600 3500))
|
||||
rect(l3 (0 -3500) (600 3500))
|
||||
rect(l3 (0 -3500) (600 3500))
|
||||
rect(l8 (-26490 -1240) (180 180))
|
||||
rect(l3 (-25300 -3500) (1400 3500))
|
||||
rect(l8 (22610 -1240) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l11 (-21740 860) (0 0))
|
||||
rect(l11 (-2350 -450) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (1660 860) (0 0))
|
||||
rect(l11 (24050 -450) (600 800))
|
||||
rect(l11 (-1200 -800) (600 800))
|
||||
rect(l11 (-1200 -800) (600 800))
|
||||
rect(l11 (-26400 -800) (600 800))
|
||||
rect(l11 (23400 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l11 (0 -800) (600 800))
|
||||
rect(l11 (0 -800) (600 800))
|
||||
rect(l11 (0 -800) (600 800))
|
||||
rect(l9 (-26650 -1500) (500 1500))
|
||||
rect(l9 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25200 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l9 (23100 -1100) (500 1500))
|
||||
rect(l9 (-23900 -1500) (500 1500))
|
||||
)
|
||||
net(14 name(OUT)
|
||||
rect(l11 (23440 3840) (320 320))
|
||||
|
|
@ -455,30 +455,30 @@ layout(
|
|||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (520 -730) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-25780 -890) (180 180))
|
||||
rect(l8 (-2380 -890) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l11 (1260 -40) (300 1360))
|
||||
rect(l11 (24660 -40) (300 1360))
|
||||
rect(l11 (400 -1360) (300 1360))
|
||||
rect(l11 (-24000 -1710) (0 0))
|
||||
rect(l11 (-1900 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (23850 -750) (300 1400))
|
||||
rect(l11 (21500 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l11 (0 -800) (600 800))
|
||||
rect(l11 (0 -800) (600 800))
|
||||
rect(l11 (0 -800) (600 800))
|
||||
rect(l6 (-1025 400) (425 950))
|
||||
rect(l11 (1200 -800) (600 800))
|
||||
rect(l11 (-1200 -800) (600 800))
|
||||
rect(l11 (-1200 -800) (600 800))
|
||||
rect(l11 (-26400 -800) (600 800))
|
||||
rect(l11 (450 -750) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l6 (25325 800) (425 950))
|
||||
rect(l6 (-1100 -950) (425 950))
|
||||
rect(l10 (-25375 -2150) (500 1500))
|
||||
rect(l10 (22900 -1500) (500 1500))
|
||||
rect(l10 (-1975 -2150) (500 1500))
|
||||
rect(l10 (-23900 -1500) (500 1500))
|
||||
)
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
|
|
|
|||
|
|
@ -147,8 +147,8 @@ layout(
|
|||
rect(l11 (-240 -790) (300 1700))
|
||||
rect(l11 (-1350 0) (2400 800))
|
||||
rect(l11 (-1150 -400) (0 0))
|
||||
rect(l2 (-275 -2150) (425 1500))
|
||||
rect(l2 (-400 -1500) (425 1500))
|
||||
rect(l2 (-250 -2150) (425 1500))
|
||||
rect(l2 (-450 -1500) (425 1500))
|
||||
)
|
||||
net(2 name(OUT)
|
||||
rect(l8 (1810 1770) (180 180))
|
||||
|
|
@ -202,9 +202,9 @@ layout(
|
|||
rect(l11 (-150 -150) (300 300))
|
||||
)
|
||||
net(7 name(SUBSTRATE))
|
||||
net(8 name($I3)
|
||||
rect(l6 (975 1660) (425 950))
|
||||
rect(l6 (-400 -950) (425 950))
|
||||
net(8 name($I6)
|
||||
rect(l6 (1000 1660) (425 950))
|
||||
rect(l6 (-450 -950) (425 950))
|
||||
)
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
|
|
@ -407,9 +407,9 @@ layout(
|
|||
)
|
||||
net(12 name(VDD)
|
||||
rect(l3 (22600 4500) (1400 3500))
|
||||
rect(l3 (2400 -3500) (1400 3500))
|
||||
rect(l3 (-100 -3500) (600 3500))
|
||||
rect(l3 (-27800 -3500) (1400 3500))
|
||||
rect(l3 (3700 -3500) (600 3500))
|
||||
rect(l3 (-1900 -3500) (1400 3500))
|
||||
rect(l3 (-27300 -3500) (1400 3500))
|
||||
rect(l3 (-1900 -3500) (600 3500))
|
||||
rect(l8 (22610 -1240) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
|
|
@ -426,11 +426,11 @@ layout(
|
|||
rect(l11 (19750 -450) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (3150 -400) (1200 800))
|
||||
rect(l11 (4350 -400) (600 800))
|
||||
rect(l11 (-1800 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l11 (-27700 -800) (1200 800))
|
||||
rect(l11 (-26550 -400) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
|
|
|
|||
|
|
@ -407,9 +407,9 @@ layout(
|
|||
)
|
||||
net(12 name(VDD)
|
||||
rect(l3 (22600 4500) (1400 3500))
|
||||
rect(l3 (2400 -3500) (1400 3500))
|
||||
rect(l3 (-100 -3500) (600 3500))
|
||||
rect(l3 (-27800 -3500) (1400 3500))
|
||||
rect(l3 (3700 -3500) (600 3500))
|
||||
rect(l3 (-1900 -3500) (1400 3500))
|
||||
rect(l3 (-27300 -3500) (1400 3500))
|
||||
rect(l3 (-1900 -3500) (600 3500))
|
||||
rect(l8 (22610 -1240) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
|
|
@ -426,11 +426,11 @@ layout(
|
|||
rect(l11 (19750 -450) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (3150 -400) (1200 800))
|
||||
rect(l11 (4350 -400) (600 800))
|
||||
rect(l11 (-1800 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l11 (-27700 -800) (1200 800))
|
||||
rect(l11 (-26550 -400) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
|
|
|
|||
|
|
@ -24,8 +24,8 @@ M$2 OUT IN VSS SUBSTRATE NMOS L=0.25U W=0.95U AS=0.40375P AD=0.40375P PS=2.75U
|
|||
.SUBCKT ND2X1 VDD OUT VSS \$4 B A SUBSTRATE
|
||||
M$1 VDD A OUT \$4 PMOS L=0.25U W=1.5U AS=0.6375P AD=0.3375P PS=3.85U PD=1.95U
|
||||
M$2 OUT B VDD \$4 PMOS L=0.25U W=1.5U AS=0.3375P AD=0.6375P PS=1.95U PD=3.85U
|
||||
M$3 \$I3 A VSS SUBSTRATE NMOS L=0.25U W=0.95U AS=0.40375P AD=0.21375P PS=2.75U
|
||||
M$3 \$I6 A VSS SUBSTRATE NMOS L=0.25U W=0.95U AS=0.40375P AD=0.21375P PS=2.75U
|
||||
+ PD=1.4U
|
||||
M$4 OUT B \$I3 SUBSTRATE NMOS L=0.25U W=0.95U AS=0.21375P AD=0.40375P PS=1.4U
|
||||
M$4 OUT B \$I6 SUBSTRATE NMOS L=0.25U W=0.95U AS=0.21375P AD=0.40375P PS=1.4U
|
||||
+ PD=2.75U
|
||||
.ENDS ND2X1
|
||||
|
|
|
|||
|
|
@ -121,8 +121,8 @@ J(
|
|||
R(l11 (-240 -790) (300 1700))
|
||||
R(l11 (-1350 0) (2400 800))
|
||||
R(l11 (-1150 -400) (0 0))
|
||||
R(l2 (-275 -2150) (425 1500))
|
||||
R(l2 (-400 -1500) (425 1500))
|
||||
R(l2 (-250 -2150) (425 1500))
|
||||
R(l2 (-450 -1500) (425 1500))
|
||||
)
|
||||
N(2 I(OUT)
|
||||
R(l8 (1810 1770) (180 180))
|
||||
|
|
@ -176,9 +176,9 @@ J(
|
|||
R(l11 (-150 -150) (300 300))
|
||||
)
|
||||
N(7 I(SUBSTRATE))
|
||||
N(8 I($I3)
|
||||
R(l6 (975 1660) (425 950))
|
||||
R(l6 (-400 -950) (425 950))
|
||||
N(8 I($I6)
|
||||
R(l6 (1000 1660) (425 950))
|
||||
R(l6 (-450 -950) (425 950))
|
||||
)
|
||||
P(1 I(VDD))
|
||||
P(2 I(OUT))
|
||||
|
|
@ -362,27 +362,27 @@ J(
|
|||
R(l13 (17740 -400) (400 400))
|
||||
)
|
||||
N(12 I(VDD)
|
||||
R(l3 (500 4500) (1400 3500))
|
||||
R(l3 (-1900 -3500) (600 3500))
|
||||
R(l3 (0 4500) (600 3500))
|
||||
R(l3 (23300 -3500) (1400 3500))
|
||||
R(l3 (-100 -3500) (600 3500))
|
||||
R(l8 (-24690 -1240) (180 180))
|
||||
R(l3 (-25300 -3500) (1400 3500))
|
||||
R(l8 (22610 -1240) (180 180))
|
||||
R(l8 (-180 370) (180 180))
|
||||
R(l8 (-180 -1280) (180 180))
|
||||
R(l8 (23220 370) (180 180))
|
||||
R(l8 (-23580 370) (180 180))
|
||||
R(l8 (-180 370) (180 180))
|
||||
R(l8 (-180 -1280) (180 180))
|
||||
R(l11 (-21740 860) (0 0))
|
||||
R(l11 (-2350 -450) (1200 800))
|
||||
R(l11 (-750 -1450) (300 1400))
|
||||
R(l11 (-100 -350) (0 0))
|
||||
R(l11 (-1250 -400) (600 800))
|
||||
R(l11 (1660 860) (0 0))
|
||||
R(l11 (-2950 -450) (600 800))
|
||||
R(l11 (23400 -800) (1200 800))
|
||||
R(l11 (-750 -1450) (300 1400))
|
||||
R(l11 (-100 -350) (0 0))
|
||||
R(l11 (550 -400) (600 800))
|
||||
R(l9 (-24850 -1500) (500 1500))
|
||||
R(l9 (22900 -1500) (500 1500))
|
||||
R(l11 (-25200 -800) (1200 800))
|
||||
R(l11 (-750 -1450) (300 1400))
|
||||
R(l11 (-100 -350) (0 0))
|
||||
R(l9 (23100 -1100) (500 1500))
|
||||
R(l9 (-23900 -1500) (500 1500))
|
||||
)
|
||||
N(13 I(OUT)
|
||||
R(l11 (23440 3840) (320 320))
|
||||
|
|
@ -397,23 +397,23 @@ J(
|
|||
R(l13 (-200 -200) (400 400))
|
||||
)
|
||||
N(15 I(VSS)
|
||||
R(l8 (1110 1610) (180 180))
|
||||
R(l8 (24510 1610) (180 180))
|
||||
R(l8 (-180 -1280) (180 180))
|
||||
R(l8 (-180 370) (180 180))
|
||||
R(l8 (23220 370) (180 180))
|
||||
R(l8 (-23580 370) (180 180))
|
||||
R(l8 (-180 -1280) (180 180))
|
||||
R(l8 (-180 370) (180 180))
|
||||
R(l11 (-21740 -390) (0 0))
|
||||
R(l11 (-1900 -400) (300 1400))
|
||||
R(l11 (-750 -1450) (1200 800))
|
||||
R(l11 (-550 -400) (0 0))
|
||||
R(l11 (-1250 -400) (600 800))
|
||||
R(l11 (23850 -750) (300 1400))
|
||||
R(l11 (1660 -390) (0 0))
|
||||
R(l11 (21500 -400) (300 1400))
|
||||
R(l11 (-750 -1450) (1200 800))
|
||||
R(l11 (-550 -400) (0 0))
|
||||
R(l11 (550 -400) (600 800))
|
||||
R(l10 (-24850 -800) (500 1500))
|
||||
R(l10 (22900 -1500) (500 1500))
|
||||
R(l11 (-25800 -800) (600 800))
|
||||
R(l11 (450 -750) (300 1400))
|
||||
R(l11 (-750 -1450) (1200 800))
|
||||
R(l11 (-550 -400) (0 0))
|
||||
R(l10 (23100 -400) (500 1500))
|
||||
R(l10 (-23900 -1500) (500 1500))
|
||||
)
|
||||
P(11 I(FB))
|
||||
P(12 I(VDD))
|
||||
|
|
|
|||
|
|
@ -362,27 +362,27 @@ J(
|
|||
R(l13 (17740 -400) (400 400))
|
||||
)
|
||||
N(12 I(VDD)
|
||||
R(l3 (500 4500) (1400 3500))
|
||||
R(l3 (-1900 -3500) (600 3500))
|
||||
R(l3 (0 4500) (600 3500))
|
||||
R(l3 (23300 -3500) (1400 3500))
|
||||
R(l3 (-100 -3500) (600 3500))
|
||||
R(l8 (-24690 -1240) (180 180))
|
||||
R(l3 (-25300 -3500) (1400 3500))
|
||||
R(l8 (22610 -1240) (180 180))
|
||||
R(l8 (-180 370) (180 180))
|
||||
R(l8 (-180 -1280) (180 180))
|
||||
R(l8 (23220 370) (180 180))
|
||||
R(l8 (-23580 370) (180 180))
|
||||
R(l8 (-180 370) (180 180))
|
||||
R(l8 (-180 -1280) (180 180))
|
||||
R(l11 (-21740 860) (0 0))
|
||||
R(l11 (-2350 -450) (1200 800))
|
||||
R(l11 (-750 -1450) (300 1400))
|
||||
R(l11 (-100 -350) (0 0))
|
||||
R(l11 (-1250 -400) (600 800))
|
||||
R(l11 (1660 860) (0 0))
|
||||
R(l11 (-2950 -450) (600 800))
|
||||
R(l11 (23400 -800) (1200 800))
|
||||
R(l11 (-750 -1450) (300 1400))
|
||||
R(l11 (-100 -350) (0 0))
|
||||
R(l11 (550 -400) (600 800))
|
||||
R(l9 (-24850 -1500) (500 1500))
|
||||
R(l9 (22900 -1500) (500 1500))
|
||||
R(l11 (-25200 -800) (1200 800))
|
||||
R(l11 (-750 -1450) (300 1400))
|
||||
R(l11 (-100 -350) (0 0))
|
||||
R(l9 (23100 -1100) (500 1500))
|
||||
R(l9 (-23900 -1500) (500 1500))
|
||||
)
|
||||
N(13 I(OUT)
|
||||
R(l11 (23440 3840) (320 320))
|
||||
|
|
@ -397,23 +397,23 @@ J(
|
|||
R(l13 (-200 -200) (400 400))
|
||||
)
|
||||
N(15 I(VSS)
|
||||
R(l8 (1110 1610) (180 180))
|
||||
R(l8 (24510 1610) (180 180))
|
||||
R(l8 (-180 -1280) (180 180))
|
||||
R(l8 (-180 370) (180 180))
|
||||
R(l8 (23220 370) (180 180))
|
||||
R(l8 (-23580 370) (180 180))
|
||||
R(l8 (-180 -1280) (180 180))
|
||||
R(l8 (-180 370) (180 180))
|
||||
R(l11 (-21740 -390) (0 0))
|
||||
R(l11 (-1900 -400) (300 1400))
|
||||
R(l11 (-750 -1450) (1200 800))
|
||||
R(l11 (-550 -400) (0 0))
|
||||
R(l11 (-1250 -400) (600 800))
|
||||
R(l11 (23850 -750) (300 1400))
|
||||
R(l11 (1660 -390) (0 0))
|
||||
R(l11 (21500 -400) (300 1400))
|
||||
R(l11 (-750 -1450) (1200 800))
|
||||
R(l11 (-550 -400) (0 0))
|
||||
R(l11 (550 -400) (600 800))
|
||||
R(l10 (-24850 -800) (500 1500))
|
||||
R(l10 (22900 -1500) (500 1500))
|
||||
R(l11 (-25800 -800) (600 800))
|
||||
R(l11 (450 -750) (300 1400))
|
||||
R(l11 (-750 -1450) (1200 800))
|
||||
R(l11 (-550 -400) (0 0))
|
||||
R(l10 (23100 -400) (500 1500))
|
||||
R(l10 (-23900 -1500) (500 1500))
|
||||
)
|
||||
P(11 I(FB))
|
||||
P(12 I(VDD))
|
||||
|
|
|
|||
|
|
@ -25,8 +25,8 @@ X$2 VSS IN OUT SUBSTRATE NMOS PARAMS: L=0.25 W=0.95 AS=0.40375 AD=0.40375
|
|||
.SUBCKT ND2X1 VDD OUT VSS \$4 B A SUBSTRATE
|
||||
X$1 OUT A VDD \$4 PMOS PARAMS: L=0.25 W=1.5 AS=0.6375 AD=0.3375 PS=3.85 PD=1.95
|
||||
X$2 VDD B OUT \$4 PMOS PARAMS: L=0.25 W=1.5 AS=0.3375 AD=0.6375 PS=1.95 PD=3.85
|
||||
X$3 VSS A \$I3 SUBSTRATE NMOS PARAMS: L=0.25 W=0.95 AS=0.40375 AD=0.21375
|
||||
X$3 VSS A \$I6 SUBSTRATE NMOS PARAMS: L=0.25 W=0.95 AS=0.40375 AD=0.21375
|
||||
+ PS=2.75 PD=1.4
|
||||
X$4 \$I3 B OUT SUBSTRATE NMOS PARAMS: L=0.25 W=0.95 AS=0.21375 AD=0.40375
|
||||
X$4 \$I6 B OUT SUBSTRATE NMOS PARAMS: L=0.25 W=0.95 AS=0.21375 AD=0.40375
|
||||
+ PS=1.4 PD=2.75
|
||||
.ENDS ND2X1
|
||||
|
|
|
|||
|
|
@ -120,8 +120,8 @@ X(ND2X1
|
|||
R(l11 (-240 -790) (300 1700))
|
||||
R(l11 (-1350 0) (2400 800))
|
||||
R(l11 (-1150 -400) (0 0))
|
||||
R(l2 (-275 -2150) (425 1500))
|
||||
R(l2 (-400 -1500) (425 1500))
|
||||
R(l2 (-250 -2150) (425 1500))
|
||||
R(l2 (-450 -1500) (425 1500))
|
||||
)
|
||||
N(2 I(OUT)
|
||||
R(l8 (1810 1770) (180 180))
|
||||
|
|
@ -175,9 +175,9 @@ X(ND2X1
|
|||
R(l11 (-150 -150) (300 300))
|
||||
)
|
||||
N(7 I(SUBSTRATE))
|
||||
N(8 I($I3)
|
||||
R(l6 (975 1660) (425 950))
|
||||
R(l6 (-400 -950) (425 950))
|
||||
N(8 I($I6)
|
||||
R(l6 (1000 1660) (425 950))
|
||||
R(l6 (-450 -950) (425 950))
|
||||
)
|
||||
P(1 I(VDD))
|
||||
P(2 I(OUT))
|
||||
|
|
@ -361,27 +361,27 @@ X(RINGO
|
|||
R(l13 (17740 -400) (400 400))
|
||||
)
|
||||
N(12 I(VDD)
|
||||
R(l3 (500 4500) (1400 3500))
|
||||
R(l3 (-1900 -3500) (600 3500))
|
||||
R(l3 (0 4500) (600 3500))
|
||||
R(l3 (23300 -3500) (1400 3500))
|
||||
R(l3 (-100 -3500) (600 3500))
|
||||
R(l8 (-24690 -1240) (180 180))
|
||||
R(l3 (-25300 -3500) (1400 3500))
|
||||
R(l8 (22610 -1240) (180 180))
|
||||
R(l8 (-180 370) (180 180))
|
||||
R(l8 (-180 -1280) (180 180))
|
||||
R(l8 (23220 370) (180 180))
|
||||
R(l8 (-23580 370) (180 180))
|
||||
R(l8 (-180 370) (180 180))
|
||||
R(l8 (-180 -1280) (180 180))
|
||||
R(l11 (-21740 860) (0 0))
|
||||
R(l11 (-2350 -450) (1200 800))
|
||||
R(l11 (-750 -1450) (300 1400))
|
||||
R(l11 (-100 -350) (0 0))
|
||||
R(l11 (-1250 -400) (600 800))
|
||||
R(l11 (1660 860) (0 0))
|
||||
R(l11 (-2950 -450) (600 800))
|
||||
R(l11 (23400 -800) (1200 800))
|
||||
R(l11 (-750 -1450) (300 1400))
|
||||
R(l11 (-100 -350) (0 0))
|
||||
R(l11 (550 -400) (600 800))
|
||||
R(l9 (-24850 -1500) (500 1500))
|
||||
R(l9 (22900 -1500) (500 1500))
|
||||
R(l11 (-25200 -800) (1200 800))
|
||||
R(l11 (-750 -1450) (300 1400))
|
||||
R(l11 (-100 -350) (0 0))
|
||||
R(l9 (23100 -1100) (500 1500))
|
||||
R(l9 (-23900 -1500) (500 1500))
|
||||
)
|
||||
N(13 I(OUT)
|
||||
R(l11 (23440 3840) (320 320))
|
||||
|
|
@ -396,23 +396,23 @@ X(RINGO
|
|||
R(l13 (-200 -200) (400 400))
|
||||
)
|
||||
N(15 I(VSS)
|
||||
R(l8 (1110 1610) (180 180))
|
||||
R(l8 (24510 1610) (180 180))
|
||||
R(l8 (-180 -1280) (180 180))
|
||||
R(l8 (-180 370) (180 180))
|
||||
R(l8 (23220 370) (180 180))
|
||||
R(l8 (-23580 370) (180 180))
|
||||
R(l8 (-180 -1280) (180 180))
|
||||
R(l8 (-180 370) (180 180))
|
||||
R(l11 (-21740 -390) (0 0))
|
||||
R(l11 (-1900 -400) (300 1400))
|
||||
R(l11 (-750 -1450) (1200 800))
|
||||
R(l11 (-550 -400) (0 0))
|
||||
R(l11 (-1250 -400) (600 800))
|
||||
R(l11 (23850 -750) (300 1400))
|
||||
R(l11 (1660 -390) (0 0))
|
||||
R(l11 (21500 -400) (300 1400))
|
||||
R(l11 (-750 -1450) (1200 800))
|
||||
R(l11 (-550 -400) (0 0))
|
||||
R(l11 (550 -400) (600 800))
|
||||
R(l10 (-24850 -800) (500 1500))
|
||||
R(l10 (22900 -1500) (500 1500))
|
||||
R(l11 (-25800 -800) (600 800))
|
||||
R(l11 (450 -750) (300 1400))
|
||||
R(l11 (-750 -1450) (1200 800))
|
||||
R(l11 (-550 -400) (0 0))
|
||||
R(l10 (23100 -400) (500 1500))
|
||||
R(l10 (-23900 -1500) (500 1500))
|
||||
)
|
||||
P(11 I(FB))
|
||||
P(12 I(VDD))
|
||||
|
|
|
|||
|
|
@ -361,27 +361,27 @@ X(RINGO
|
|||
R(l13 (17740 -400) (400 400))
|
||||
)
|
||||
N(12 I(VDD)
|
||||
R(l3 (500 4500) (1400 3500))
|
||||
R(l3 (-1900 -3500) (600 3500))
|
||||
R(l3 (0 4500) (600 3500))
|
||||
R(l3 (23300 -3500) (1400 3500))
|
||||
R(l3 (-100 -3500) (600 3500))
|
||||
R(l8 (-24690 -1240) (180 180))
|
||||
R(l3 (-25300 -3500) (1400 3500))
|
||||
R(l8 (22610 -1240) (180 180))
|
||||
R(l8 (-180 370) (180 180))
|
||||
R(l8 (-180 -1280) (180 180))
|
||||
R(l8 (23220 370) (180 180))
|
||||
R(l8 (-23580 370) (180 180))
|
||||
R(l8 (-180 370) (180 180))
|
||||
R(l8 (-180 -1280) (180 180))
|
||||
R(l11 (-21740 860) (0 0))
|
||||
R(l11 (-2350 -450) (1200 800))
|
||||
R(l11 (-750 -1450) (300 1400))
|
||||
R(l11 (-100 -350) (0 0))
|
||||
R(l11 (-1250 -400) (600 800))
|
||||
R(l11 (1660 860) (0 0))
|
||||
R(l11 (-2950 -450) (600 800))
|
||||
R(l11 (23400 -800) (1200 800))
|
||||
R(l11 (-750 -1450) (300 1400))
|
||||
R(l11 (-100 -350) (0 0))
|
||||
R(l11 (550 -400) (600 800))
|
||||
R(l9 (-24850 -1500) (500 1500))
|
||||
R(l9 (22900 -1500) (500 1500))
|
||||
R(l11 (-25200 -800) (1200 800))
|
||||
R(l11 (-750 -1450) (300 1400))
|
||||
R(l11 (-100 -350) (0 0))
|
||||
R(l9 (23100 -1100) (500 1500))
|
||||
R(l9 (-23900 -1500) (500 1500))
|
||||
)
|
||||
N(13 I(OUT)
|
||||
R(l11 (23440 3840) (320 320))
|
||||
|
|
@ -396,23 +396,23 @@ X(RINGO
|
|||
R(l13 (-200 -200) (400 400))
|
||||
)
|
||||
N(15 I(VSS)
|
||||
R(l8 (1110 1610) (180 180))
|
||||
R(l8 (24510 1610) (180 180))
|
||||
R(l8 (-180 -1280) (180 180))
|
||||
R(l8 (-180 370) (180 180))
|
||||
R(l8 (23220 370) (180 180))
|
||||
R(l8 (-23580 370) (180 180))
|
||||
R(l8 (-180 -1280) (180 180))
|
||||
R(l8 (-180 370) (180 180))
|
||||
R(l11 (-21740 -390) (0 0))
|
||||
R(l11 (-1900 -400) (300 1400))
|
||||
R(l11 (-750 -1450) (1200 800))
|
||||
R(l11 (-550 -400) (0 0))
|
||||
R(l11 (-1250 -400) (600 800))
|
||||
R(l11 (23850 -750) (300 1400))
|
||||
R(l11 (1660 -390) (0 0))
|
||||
R(l11 (21500 -400) (300 1400))
|
||||
R(l11 (-750 -1450) (1200 800))
|
||||
R(l11 (-550 -400) (0 0))
|
||||
R(l11 (550 -400) (600 800))
|
||||
R(l10 (-24850 -800) (500 1500))
|
||||
R(l10 (22900 -1500) (500 1500))
|
||||
R(l11 (-25800 -800) (600 800))
|
||||
R(l11 (450 -750) (300 1400))
|
||||
R(l11 (-750 -1450) (1200 800))
|
||||
R(l11 (-550 -400) (0 0))
|
||||
R(l10 (23100 -400) (500 1500))
|
||||
R(l10 (-23900 -1500) (500 1500))
|
||||
)
|
||||
P(11 I(FB))
|
||||
P(12 I(VDD))
|
||||
|
|
|
|||
|
|
@ -144,8 +144,8 @@ layout(
|
|||
rect(l11 (-240 -790) (300 1700))
|
||||
rect(l11 (-1350 0) (2400 800))
|
||||
rect(l11 (-1150 -400) (0 0))
|
||||
rect(l2 (-275 -2150) (425 1500))
|
||||
rect(l2 (-400 -1500) (425 1500))
|
||||
rect(l2 (-250 -2150) (425 1500))
|
||||
rect(l2 (-450 -1500) (425 1500))
|
||||
)
|
||||
net(2 name(OUT)
|
||||
rect(l8 (1810 1770) (180 180))
|
||||
|
|
@ -199,9 +199,9 @@ layout(
|
|||
rect(l11 (-150 -150) (300 300))
|
||||
)
|
||||
net(7 name(SUBSTRATE))
|
||||
net(8 name($I3)
|
||||
rect(l6 (975 1660) (425 950))
|
||||
rect(l6 (-400 -950) (425 950))
|
||||
net(8 name($I6)
|
||||
rect(l6 (1000 1660) (425 950))
|
||||
rect(l6 (-450 -950) (425 950))
|
||||
)
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
|
|
@ -403,27 +403,27 @@ layout(
|
|||
rect(l13 (17740 -400) (400 400))
|
||||
)
|
||||
net(12 name(VDD)
|
||||
rect(l3 (500 4500) (1400 3500))
|
||||
rect(l3 (-1900 -3500) (600 3500))
|
||||
rect(l3 (0 4500) (600 3500))
|
||||
rect(l3 (23300 -3500) (1400 3500))
|
||||
rect(l3 (-100 -3500) (600 3500))
|
||||
rect(l8 (-24690 -1240) (180 180))
|
||||
rect(l3 (-25300 -3500) (1400 3500))
|
||||
rect(l8 (22610 -1240) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l11 (-21740 860) (0 0))
|
||||
rect(l11 (-2350 -450) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (1660 860) (0 0))
|
||||
rect(l11 (-2950 -450) (600 800))
|
||||
rect(l11 (23400 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l9 (-24850 -1500) (500 1500))
|
||||
rect(l9 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25200 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l9 (23100 -1100) (500 1500))
|
||||
rect(l9 (-23900 -1500) (500 1500))
|
||||
)
|
||||
net(13 name(OUT)
|
||||
rect(l11 (23440 3840) (320 320))
|
||||
|
|
@ -438,23 +438,23 @@ layout(
|
|||
rect(l13 (-200 -200) (400 400))
|
||||
)
|
||||
net(15 name(VSS)
|
||||
rect(l8 (1110 1610) (180 180))
|
||||
rect(l8 (24510 1610) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l11 (-21740 -390) (0 0))
|
||||
rect(l11 (-1900 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (23850 -750) (300 1400))
|
||||
rect(l11 (1660 -390) (0 0))
|
||||
rect(l11 (21500 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l10 (-24850 -800) (500 1500))
|
||||
rect(l10 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25800 -800) (600 800))
|
||||
rect(l11 (450 -750) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l10 (23100 -400) (500 1500))
|
||||
rect(l10 (-23900 -1500) (500 1500))
|
||||
)
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
|
|
|
|||
|
|
@ -403,27 +403,27 @@ layout(
|
|||
rect(l13 (17740 -400) (400 400))
|
||||
)
|
||||
net(12 name(VDD)
|
||||
rect(l3 (500 4500) (1400 3500))
|
||||
rect(l3 (-1900 -3500) (600 3500))
|
||||
rect(l3 (0 4500) (600 3500))
|
||||
rect(l3 (23300 -3500) (1400 3500))
|
||||
rect(l3 (-100 -3500) (600 3500))
|
||||
rect(l8 (-24690 -1240) (180 180))
|
||||
rect(l3 (-25300 -3500) (1400 3500))
|
||||
rect(l8 (22610 -1240) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l11 (-21740 860) (0 0))
|
||||
rect(l11 (-2350 -450) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (1660 860) (0 0))
|
||||
rect(l11 (-2950 -450) (600 800))
|
||||
rect(l11 (23400 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l9 (-24850 -1500) (500 1500))
|
||||
rect(l9 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25200 -800) (1200 800))
|
||||
rect(l11 (-750 -1450) (300 1400))
|
||||
rect(l11 (-100 -350) (0 0))
|
||||
rect(l9 (23100 -1100) (500 1500))
|
||||
rect(l9 (-23900 -1500) (500 1500))
|
||||
)
|
||||
net(13 name(OUT)
|
||||
rect(l11 (23440 3840) (320 320))
|
||||
|
|
@ -438,23 +438,23 @@ layout(
|
|||
rect(l13 (-200 -200) (400 400))
|
||||
)
|
||||
net(15 name(VSS)
|
||||
rect(l8 (1110 1610) (180 180))
|
||||
rect(l8 (24510 1610) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l8 (23220 370) (180 180))
|
||||
rect(l8 (-23580 370) (180 180))
|
||||
rect(l8 (-180 -1280) (180 180))
|
||||
rect(l8 (-180 370) (180 180))
|
||||
rect(l11 (-21740 -390) (0 0))
|
||||
rect(l11 (-1900 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (-1250 -400) (600 800))
|
||||
rect(l11 (23850 -750) (300 1400))
|
||||
rect(l11 (1660 -390) (0 0))
|
||||
rect(l11 (21500 -400) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l11 (550 -400) (600 800))
|
||||
rect(l10 (-24850 -800) (500 1500))
|
||||
rect(l10 (22900 -1500) (500 1500))
|
||||
rect(l11 (-25800 -800) (600 800))
|
||||
rect(l11 (450 -750) (300 1400))
|
||||
rect(l11 (-750 -1450) (1200 800))
|
||||
rect(l11 (-550 -400) (0 0))
|
||||
rect(l10 (23100 -400) (500 1500))
|
||||
rect(l10 (-23900 -1500) (500 1500))
|
||||
)
|
||||
|
||||
# Outgoing pins and their connections to nets
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue