* ./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:
Jean-Paul Chaput 2009-07-25 15:10:46 +00:00
parent 54219843d6
commit cc98bd541d
5 changed files with 38 additions and 33 deletions

View File

@ -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) + ">";
} }

View File

@ -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 );

View File

@ -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(); Component* component = dynamic_cast<Component*>(occurrence.getEntity());
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());
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 );

View File

@ -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 );
} }

View File

@ -48,8 +48,14 @@ namespace Hurricane {
bool SelectorLess::operator () ( const Selector* lhs, const Selector* rhs ) const bool SelectorLess::operator () ( const Selector* lhs, const Selector* rhs ) const
{ {
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 );
@ -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.