* ./hurricane/src/hurricane :
- Change: In Technology::getViaBetween(Layer*,Layer*) if the two layers are identicals, return the layer instead of NULL (mostly for mono- metallic VIAs). * ./hurricane/src/hviewer : - Bug: In CellWidget::redrawSelection(), correct calculation of the selected Instances abutment box. We must apply the occurrence path transformation to the instance transformation and not the other way around. - Bug: In SelectorLess(), Instance must be *inferior* to Components as they are drawed after in CellWidget::redrawSelection().
This commit is contained in:
parent
54219843d6
commit
cc98bd541d
|
@ -240,6 +240,8 @@ Interval& Interval::translate(const DbU::Unit& dv)
|
||||||
string Interval::_getString() const
|
string Interval::_getString() const
|
||||||
// ********************************
|
// ********************************
|
||||||
{
|
{
|
||||||
|
if ( isEmpty() )
|
||||||
|
return "<" + _TName("Interval") + " (empty) " + DbU::getValueString(_vMin) + " " + DbU::getValueString(_vMax) + ">";
|
||||||
return "<" + _TName("Interval") + " " + DbU::getValueString(_vMin) + " " + DbU::getValueString(_vMax) + ">";
|
return "<" + _TName("Interval") + " " + DbU::getValueString(_vMin) + " " + DbU::getValueString(_vMax) + ">";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -261,6 +261,7 @@ ViaLayers Technology::getViaLayers() const
|
||||||
Layer* Technology::getViaBetween ( const Layer* metal1, const Layer* metal2 ) const
|
Layer* Technology::getViaBetween ( const Layer* metal1, const Layer* metal2 ) const
|
||||||
{
|
{
|
||||||
if ( !metal1 || !metal2 ) return NULL;
|
if ( !metal1 || !metal2 ) return NULL;
|
||||||
|
if ( metal1 == metal2 ) return const_cast<Layer*>(metal1);
|
||||||
if ( metal1->above(metal2) ) swap ( metal1, metal2 );
|
if ( metal1->above(metal2) ) swap ( metal1, metal2 );
|
||||||
|
|
||||||
Layer* cutLayer = getCutBelow ( metal2 );
|
Layer* cutLayer = getCutBelow ( metal2 );
|
||||||
|
|
|
@ -744,9 +744,7 @@ namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
bool CellWidget::DrawingQuery::hasMasterCellCallback () const
|
bool CellWidget::DrawingQuery::hasMasterCellCallback () const
|
||||||
{
|
{ return true; }
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void CellWidget::DrawingQuery::masterCellCallback ()
|
void CellWidget::DrawingQuery::masterCellCallback ()
|
||||||
|
@ -1466,25 +1464,16 @@ namespace Hurricane {
|
||||||
_drawingPlanes.setPen ( Graphics::getPen (basicLayer->getName()) );
|
_drawingPlanes.setPen ( Graphics::getPen (basicLayer->getName()) );
|
||||||
_drawingPlanes.setBrush ( Graphics::getBrush(basicLayer->getName()) );
|
_drawingPlanes.setBrush ( Graphics::getBrush(basicLayer->getName()) );
|
||||||
|
|
||||||
iselector = _selectors.begin ();
|
iselector = _selectors.begin();
|
||||||
for ( ; iselector != _selectors.end() ; iselector++ ) {
|
for ( ; iselector != _selectors.end() ; iselector++ ) {
|
||||||
Occurrence occurrence = (*iselector)->getOccurrence();
|
Occurrence occurrence = (*iselector)->getOccurrence();
|
||||||
Transformation transformation = occurrence.getPath().getTransformation();
|
|
||||||
|
|
||||||
Instance* instance = dynamic_cast<Instance*>(occurrence.getEntity());
|
|
||||||
if ( instance ) {
|
|
||||||
_drawingPlanes.setPen ( Graphics::getPen ("boundaries",getDarkening()) );
|
|
||||||
_drawingPlanes.setBrush ( Graphics::getBrush("boundaries",getDarkening()) );
|
|
||||||
|
|
||||||
_drawingQuery.drawMasterCell ( instance->getMasterCell(), instance->getTransformation().getTransformation(transformation) );
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
Component* component = dynamic_cast<Component*>(occurrence.getEntity());
|
Component* component = dynamic_cast<Component*>(occurrence.getEntity());
|
||||||
|
|
||||||
if ( !component ) break;
|
if ( !component ) break;
|
||||||
if ( !component->getLayer() ) continue;
|
if ( !component->getLayer() ) continue;
|
||||||
if ( !component->getLayer()->contains(*basicLayer) ) continue;
|
if ( !component->getLayer()->contains(*basicLayer) ) continue;
|
||||||
|
|
||||||
|
Transformation transformation = occurrence.getPath().getTransformation();
|
||||||
_drawingQuery.drawGo ( dynamic_cast<Go*>(occurrence.getEntity())
|
_drawingQuery.drawGo ( dynamic_cast<Go*>(occurrence.getEntity())
|
||||||
, *basicLayer
|
, *basicLayer
|
||||||
, redrawBox
|
, redrawBox
|
||||||
|
@ -1493,27 +1482,40 @@ namespace Hurricane {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_drawingPlanes.setPen ( Graphics::getPen ("boundaries") );
|
||||||
|
_drawingPlanes.setBrush ( Graphics::getBrush("boundaries") );
|
||||||
|
|
||||||
|
for ( ; iselector != _selectors.end() ; iselector++ ) {
|
||||||
|
Occurrence occurrence = (*iselector)->getOccurrence();
|
||||||
|
Instance* instance = dynamic_cast<Instance*>(occurrence.getEntity());
|
||||||
|
if ( instance ) {
|
||||||
|
Transformation transformation
|
||||||
|
= occurrence.getPath().getTransformation().getTransformation(instance->getTransformation());
|
||||||
|
_drawingQuery.drawMasterCell ( instance->getMasterCell(), transformation );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_drawingPlanes.setPen ( Graphics::getPen ("rubber") );
|
_drawingPlanes.setPen ( Graphics::getPen ("rubber") );
|
||||||
_drawingPlanes.setBrush ( Graphics::getBrush("rubber") );
|
_drawingPlanes.setBrush ( Graphics::getBrush("rubber") );
|
||||||
|
|
||||||
for ( ; iselector != _selectors.end() ; iselector++ ) {
|
for ( ; iselector != _selectors.end() ; iselector++ ) {
|
||||||
Occurrence occurrence = (*iselector)->getOccurrence();
|
Occurrence occurrence = (*iselector)->getOccurrence();
|
||||||
Transformation transformation = occurrence.getPath().getTransformation();
|
|
||||||
|
|
||||||
Rubber* rubber = dynamic_cast<Rubber*>(occurrence.getEntity());
|
Rubber* rubber = dynamic_cast<Rubber*>(occurrence.getEntity());
|
||||||
|
|
||||||
if ( !rubber ) break;
|
if ( !rubber ) break;
|
||||||
|
|
||||||
|
Transformation transformation = occurrence.getPath().getTransformation();
|
||||||
_drawingQuery.drawRubber ( rubber, redrawBox, transformation );
|
_drawingQuery.drawRubber ( rubber, redrawBox, transformation );
|
||||||
}
|
}
|
||||||
|
|
||||||
Name extensionName = "";
|
Name extensionName = "";
|
||||||
for ( ; iselector != _selectors.end() ; iselector++ ) {
|
for ( ; iselector != _selectors.end() ; iselector++ ) {
|
||||||
Occurrence occurrence = (*iselector)->getOccurrence();
|
Occurrence occurrence = (*iselector)->getOccurrence();
|
||||||
Transformation transformation = occurrence.getPath().getTransformation();
|
|
||||||
|
|
||||||
ExtensionGo* eGo = dynamic_cast<ExtensionGo*>(occurrence.getEntity());
|
ExtensionGo* eGo = dynamic_cast<ExtensionGo*>(occurrence.getEntity());
|
||||||
|
|
||||||
if ( !eGo ) break;
|
if ( !eGo ) break;
|
||||||
|
|
||||||
|
Transformation transformation = occurrence.getPath().getTransformation();
|
||||||
if ( eGo->getName() != extensionName ) {
|
if ( eGo->getName() != extensionName ) {
|
||||||
extensionName = eGo->getName();
|
extensionName = eGo->getName();
|
||||||
_drawingQuery.setDrawExtensionGo ( extensionName );
|
_drawingQuery.setDrawExtensionGo ( extensionName );
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
#include <csignal>
|
#include <csignal>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include "hurricane/Error.h"
|
#include "hurricane/Exception.h"
|
||||||
#include "hurricane/viewer/ExceptionWidget.h"
|
#include "hurricane/viewer/ExceptionWidget.h"
|
||||||
#include "hurricane/viewer/HApplication.h"
|
#include "hurricane/viewer/HApplication.h"
|
||||||
|
|
||||||
|
@ -75,9 +75,9 @@ namespace Hurricane {
|
||||||
try {
|
try {
|
||||||
return QApplication::notify ( object, event );
|
return QApplication::notify ( object, event );
|
||||||
}
|
}
|
||||||
catch ( Error& e ) {
|
catch ( Exception& e ) {
|
||||||
ExceptionWidget* ew = new ExceptionWidget ();
|
ExceptionWidget* ew = new ExceptionWidget ();
|
||||||
ew->setMessage ( e.getReason().c_str() );
|
ew->setMessage ( e.what().c_str() );
|
||||||
if ( ew->exec() == QDialog::Rejected )
|
if ( ew->exec() == QDialog::Rejected )
|
||||||
kill ( getpid(), SIGSEGV );
|
kill ( getpid(), SIGSEGV );
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,6 +51,12 @@ namespace Hurricane {
|
||||||
const Entity* lhsEntity = lhs->getOccurrence().getEntity();
|
const Entity* lhsEntity = lhs->getOccurrence().getEntity();
|
||||||
const Entity* rhsEntity = rhs->getOccurrence().getEntity();
|
const Entity* rhsEntity = rhs->getOccurrence().getEntity();
|
||||||
|
|
||||||
|
const Component* lhsComponent = dynamic_cast<const Component*> ( lhsEntity );
|
||||||
|
const Component* rhsComponent = dynamic_cast<const Component*> ( rhsEntity );
|
||||||
|
if ( lhsComponent && rhsComponent ) return lhs < rhs; // lhs & rhs are Components.
|
||||||
|
if ( lhsComponent && !rhsComponent ) return true; // lhs only is an Component.
|
||||||
|
if ( !lhsComponent && rhsComponent ) return false; // rhs only is an Component.
|
||||||
|
|
||||||
const Instance* lhsInstance = dynamic_cast<const Instance*> ( lhsEntity );
|
const Instance* lhsInstance = dynamic_cast<const Instance*> ( lhsEntity );
|
||||||
const Instance* rhsInstance = dynamic_cast<const Instance*> ( rhsEntity );
|
const Instance* rhsInstance = dynamic_cast<const Instance*> ( rhsEntity );
|
||||||
//cerr << "Instance LHS: " << (void*)lhsInstance << " RHS: " << (void*)rhsInstance << endl;
|
//cerr << "Instance LHS: " << (void*)lhsInstance << " RHS: " << (void*)rhsInstance << endl;
|
||||||
|
@ -59,12 +65,6 @@ namespace Hurricane {
|
||||||
if ( lhsInstance && !rhsInstance ) return true; // lhs only is an Instance.
|
if ( lhsInstance && !rhsInstance ) return true; // lhs only is an Instance.
|
||||||
if ( !lhsInstance && rhsInstance ) return false; // rhs only is an Instance.
|
if ( !lhsInstance && rhsInstance ) return false; // rhs only is an Instance.
|
||||||
|
|
||||||
const Component* lhsComponent = dynamic_cast<const Component*> ( lhsEntity );
|
|
||||||
const Component* rhsComponent = dynamic_cast<const Component*> ( rhsEntity );
|
|
||||||
if ( lhsComponent && rhsComponent ) return lhs < rhs; // lhs & rhs are Components.
|
|
||||||
if ( lhsComponent && !rhsComponent ) return true; // lhs only is an Component.
|
|
||||||
if ( !lhsComponent && rhsComponent ) return false; // rhs only is an Component.
|
|
||||||
|
|
||||||
const Rubber* lhsRubber = dynamic_cast<const Rubber*> ( lhsEntity );
|
const Rubber* lhsRubber = dynamic_cast<const Rubber*> ( lhsEntity );
|
||||||
const Rubber* rhsRubber = dynamic_cast<const Rubber*> ( rhsEntity );
|
const Rubber* rhsRubber = dynamic_cast<const Rubber*> ( rhsEntity );
|
||||||
if ( lhsRubber && rhsRubber ) return lhs < rhs; // lhs & rhs are Rubbers.
|
if ( lhsRubber && rhsRubber ) return lhs < rhs; // lhs & rhs are Rubbers.
|
||||||
|
|
Loading…
Reference in New Issue