mirror of https://github.com/KLayout/klayout.git
Re-run feature for DRC too.
This commit is contained in:
parent
441f946f43
commit
db9ea27324
|
|
@ -763,10 +763,17 @@ module DRC
|
|||
name = filename && File::basename(filename)
|
||||
name ||= "DRC"
|
||||
|
||||
lv = RBA::LayoutView::current
|
||||
if lv
|
||||
@output_rdb_index = lv.create_rdb(name)
|
||||
@output_rdb = lv.rdb(@output_rdb_index)
|
||||
@output_rdb_index = nil
|
||||
|
||||
view = RBA::LayoutView::current
|
||||
if view
|
||||
if self._rdb_index
|
||||
@output_rdb = RBA::ReportDatabase::new("") # reuse existing name
|
||||
@output_rdb_index = view.replace_rdb(self._rdb_index, @output_rdb)
|
||||
else
|
||||
@output_rdb = RBA::ReportDatabase::new(name)
|
||||
@output_rdb_index = view.add_rdb(@output_rdb)
|
||||
end
|
||||
else
|
||||
@output_rdb = RBA::ReportDatabase::new(name)
|
||||
end
|
||||
|
|
|
|||
|
|
@ -407,6 +407,7 @@ module DRC
|
|||
@l2n = RBA::LayoutToNetlist::new(layout.top_cell.name, layout.dbu)
|
||||
end
|
||||
|
||||
@l2n.name = "DRC"
|
||||
@l2n.generator = @engine._generator
|
||||
|
||||
end
|
||||
|
|
|
|||
|
|
@ -17,37 +17,39 @@
|
|||
<text>
|
||||
module DRC
|
||||
|
||||
def DRC.execute_drc(_macro)
|
||||
def DRC.execute_drc(macro, generator, rdb_index = nil)
|
||||
|
||||
_timer = RBA::Timer::new
|
||||
_timer.start
|
||||
_drc = DRCEngine::new
|
||||
timer = RBA::Timer::new
|
||||
timer.start
|
||||
drc = DRCEngine::new
|
||||
drc._rdb_index = rdb_index
|
||||
drc._generator = generator
|
||||
|
||||
begin
|
||||
|
||||
# Set a debugger scope so that our errors end up with the debugger set to the DRC's line
|
||||
RBA::MacroExecutionContext::set_debugger_scope(_macro.path)
|
||||
RBA::MacroExecutionContext::set_debugger_scope(macro.path)
|
||||
# No verbosity set in drc engine - we cannot use the engine's logger
|
||||
RBA::Logger::verbosity >= 10 && RBA::Logger::info("Running #{_macro.path}")
|
||||
_drc.instance_eval(_macro.text, _macro.path)
|
||||
RBA::Logger::verbosity >= 10 && RBA::Logger::info("Running #{macro.path}")
|
||||
drc.instance_eval(macro.text, macro.path)
|
||||
# Remove the debugger scope
|
||||
RBA::MacroExecutionContext::remove_debugger_scope
|
||||
|
||||
rescue => ex
|
||||
|
||||
_drc.error("In #{_macro.path}: #{ex.to_s}")
|
||||
drc.error("In #{macro.path}: #{ex.to_s}")
|
||||
RBA::MacroExecutionContext::ignore_next_exception
|
||||
raise ex
|
||||
|
||||
ensure
|
||||
|
||||
# cleans up and creates layout and report views
|
||||
_drc._finish
|
||||
drc._finish
|
||||
|
||||
end
|
||||
|
||||
_timer.stop
|
||||
_drc.info("Total run time: #{'%.3f'%(_timer.sys+_timer.user)}s")
|
||||
timer.stop
|
||||
drc.info("Total run time: #{'%.3f'%(timer.sys+timer.user)}s")
|
||||
|
||||
end
|
||||
|
||||
|
|
@ -55,7 +57,9 @@ module DRC
|
|||
class DRCInterpreter < RBA::MacroInterpreter
|
||||
|
||||
# Constructor
|
||||
def initialize
|
||||
def initialize(recipe)
|
||||
|
||||
@recipe = recipe
|
||||
|
||||
# Make the DSL use ruby syntax highlighting
|
||||
self.syntax_scheme = "ruby"
|
||||
|
|
@ -74,8 +78,7 @@ module DRC
|
|||
|
||||
# Implements the execute method
|
||||
def execute(macro)
|
||||
$0 = macro.path
|
||||
DRC::execute_drc(macro)
|
||||
DRC::execute_drc(macro, @recipe.generator("script" => macro.path))
|
||||
end
|
||||
|
||||
end
|
||||
|
|
@ -84,7 +87,9 @@ module DRC
|
|||
class DRCPlainTextInterpreter < RBA::MacroInterpreter
|
||||
|
||||
# Constructor
|
||||
def initialize
|
||||
def initialize(recipe)
|
||||
|
||||
@recipe = recipe
|
||||
|
||||
# Make the DSL use ruby syntax highlighting
|
||||
self.syntax_scheme = "ruby"
|
||||
|
|
@ -100,14 +105,40 @@ module DRC
|
|||
|
||||
# Implements the execute method
|
||||
def execute(macro)
|
||||
DRC::execute_drc(macro)
|
||||
DRC::execute_drc(macro, @recipe.generator("script" => macro.path))
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
# A recipe implementation allowing the LVS run to be redone
|
||||
class DRCRecipe < RBA::Recipe
|
||||
|
||||
def initialize
|
||||
super("drc", "DRC recipe")
|
||||
end
|
||||
|
||||
def execute(params)
|
||||
|
||||
script = params["script"]
|
||||
if ! script
|
||||
return
|
||||
end
|
||||
|
||||
macro = RBA::Macro::macro_by_path(script)
|
||||
macro || raise("Can't find DRC script #{script} - unable to re-run")
|
||||
|
||||
DRC::execute_drc(macro, self.generator("script" => script), params["rdb_index"])
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
# Register the recipe
|
||||
drc_recipe = DRCRecipe::new
|
||||
|
||||
# Register the new interpreters
|
||||
DRCInterpreter::new
|
||||
DRCPlainTextInterpreter::new
|
||||
DRCInterpreter::new(drc_recipe)
|
||||
DRCPlainTextInterpreter::new(drc_recipe)
|
||||
|
||||
end
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
<ui version="4.0" >
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MarkerBrowserDialog</class>
|
||||
<widget class="QDialog" name="MarkerBrowserDialog" >
|
||||
<property name="geometry" >
|
||||
<widget class="QDialog" name="MarkerBrowserDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
|
|
@ -9,40 +10,75 @@
|
|||
<height>553</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle" >
|
||||
<property name="windowTitle">
|
||||
<string>Marker Database Browser</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" >
|
||||
<property name="margin" >
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="spacing" >
|
||||
<layout class="QVBoxLayout">
|
||||
<property name="spacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QFrame" name="frame_3" >
|
||||
<property name="frameShape" >
|
||||
<widget class="QFrame" name="frame_3">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="frameShadow" >
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
<layout class="QGridLayout" >
|
||||
<property name="margin" >
|
||||
<layout class="QGridLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="spacing" >
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="spacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<item row="0" column="2" >
|
||||
<item row="0" column="3">
|
||||
<widget class="QToolButton" name="file_menu">
|
||||
<property name="text">
|
||||
<string>File ... </string>
|
||||
</property>
|
||||
<property name="popupMode">
|
||||
<enum>QToolButton::InstantPopup</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string> ... on layout </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<spacer>
|
||||
<property name="orientation" >
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType" >
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Fixed</enum>
|
||||
</property>
|
||||
<property name="sizeHint" >
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>20</height>
|
||||
|
|
@ -50,152 +86,133 @@
|
|||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="0" column="1" >
|
||||
<widget class="QComboBox" name="rdb_cb" >
|
||||
<property name="sizePolicy" >
|
||||
<sizepolicy>
|
||||
<hsizetype>7</hsizetype>
|
||||
<vsizetype>0</vsizetype>
|
||||
<item row="0" column="1">
|
||||
<widget class="QComboBox" name="rdb_cb">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>1</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="sizeAdjustPolicy" >
|
||||
<property name="sizeAdjustPolicy">
|
||||
<enum>QComboBox::AdjustToContentsOnFirstShow</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0" >
|
||||
<widget class="QLabel" name="label_3" >
|
||||
<property name="text" >
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Database </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" >
|
||||
<widget class="QLabel" name="label" >
|
||||
<property name="text" >
|
||||
<string> ... on layout </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1" >
|
||||
<widget class="QComboBox" name="layout_cb" >
|
||||
<property name="sizePolicy" >
|
||||
<sizepolicy>
|
||||
<hsizetype>7</hsizetype>
|
||||
<vsizetype>0</vsizetype>
|
||||
<item row="1" column="1">
|
||||
<widget class="QComboBox" name="layout_cb">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>1</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="sizeAdjustPolicy" >
|
||||
<property name="sizeAdjustPolicy">
|
||||
<enum>QComboBox::AdjustToContentsOnFirstShow</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="3" >
|
||||
<widget class="QToolButton" name="file_menu" >
|
||||
<property name="text" >
|
||||
<string>File ... </string>
|
||||
</property>
|
||||
<property name="popupMode" >
|
||||
<enum>QToolButton::InstantPopup</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0" colspan="4" >
|
||||
<spacer>
|
||||
<property name="orientation" >
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeType" >
|
||||
<enum>QSizePolicy::Fixed</enum>
|
||||
</property>
|
||||
<property name="sizeHint" >
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>10</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="Line" name="line" >
|
||||
<property name="orientation" >
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QFrame" name="frame_4" >
|
||||
<property name="frameShape" >
|
||||
<widget class="QFrame" name="frame_4">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="frameShadow" >
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" >
|
||||
<property name="margin" >
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="spacing" >
|
||||
<layout class="QHBoxLayout">
|
||||
<property name="spacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QStackedWidget" name="central_stack" >
|
||||
<property name="currentIndex" >
|
||||
<widget class="QStackedWidget" name="central_stack">
|
||||
<property name="currentIndex">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="page" >
|
||||
<layout class="QVBoxLayout" >
|
||||
<property name="margin" >
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="spacing" >
|
||||
<widget class="QWidget" name="page">
|
||||
<layout class="QVBoxLayout">
|
||||
<property name="spacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="rdb::MarkerBrowserPage" name="browser_frame" >
|
||||
<property name="sizePolicy" >
|
||||
<sizepolicy>
|
||||
<hsizetype>13</hsizetype>
|
||||
<vsizetype>13</vsizetype>
|
||||
<widget class="rdb::MarkerBrowserPage" name="browser_frame">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Ignored" vsizetype="Ignored">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="frameShape" >
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="frameShadow" >
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="page_2" >
|
||||
<layout class="QVBoxLayout" >
|
||||
<property name="margin" >
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="spacing" >
|
||||
<widget class="QWidget" name="page_2">
|
||||
<layout class="QVBoxLayout">
|
||||
<property name="spacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_2" >
|
||||
<property name="text" >
|
||||
<string>Choose "Open" from the "File ..." menu
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Choose "Open" from the "File ..." menu
|
||||
to load a marker database</string>
|
||||
</property>
|
||||
<property name="alignment" >
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
<property name="wordWrap" >
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
|
|
@ -208,40 +225,49 @@ to load a marker database</string>
|
|||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="Line" name="line_2" >
|
||||
<property name="orientation" >
|
||||
<widget class="Line" name="line_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QFrame" name="frame_2" >
|
||||
<property name="frameShape" >
|
||||
<widget class="QFrame" name="frame_2">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="frameShadow" >
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" >
|
||||
<property name="margin" >
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="spacing" >
|
||||
<layout class="QHBoxLayout">
|
||||
<property name="spacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QPushButton" name="configure_pb" >
|
||||
<property name="text" >
|
||||
<widget class="QPushButton" name="configure_pb">
|
||||
<property name="text">
|
||||
<string>Configure</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer>
|
||||
<property name="orientation" >
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" >
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
|
|
@ -250,8 +276,8 @@ to load a marker database</string>
|
|||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButton_2" >
|
||||
<property name="text" >
|
||||
<widget class="QPushButton" name="pushButton_2">
|
||||
<property name="text">
|
||||
<string>Close</string>
|
||||
</property>
|
||||
</widget>
|
||||
|
|
@ -266,6 +292,7 @@ to load a marker database</string>
|
|||
<class>rdb::MarkerBrowserPage</class>
|
||||
<extends>QFrame</extends>
|
||||
<header>rdbMarkerBrowserPage.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<tabstops>
|
||||
|
|
@ -282,11 +309,11 @@ to load a marker database</string>
|
|||
<receiver>MarkerBrowserDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel" >
|
||||
<hint type="sourcelabel">
|
||||
<x>837</x>
|
||||
<y>441</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel" >
|
||||
<hint type="destinationlabel">
|
||||
<x>881</x>
|
||||
<y>387</y>
|
||||
</hint>
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@
|
|||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QHBoxLayout">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="spacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
|
|
@ -29,6 +29,73 @@
|
|||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QFrame" name="frame_5">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item row="0" column="0" rowspan="3">
|
||||
<widget class="QToolButton" name="rerun_button">
|
||||
<property name="text">
|
||||
<string>...</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../lay/lay/layResources.qrc">
|
||||
<normaloff>:/run.png</normaloff>:/run.png</iconset>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>F5</string>
|
||||
</property>
|
||||
<property name="autoRaise">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>11</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="Line" name="line_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QSplitter" name="splitter_2">
|
||||
<property name="orientation">
|
||||
|
|
@ -63,69 +130,6 @@
|
|||
<property name="spacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<item row="2" column="1">
|
||||
<widget class="QToolButton" name="dir_down_pb">
|
||||
<property name="text">
|
||||
<string>...</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../lay/lay/layResources.qrc">
|
||||
<normaloff>:/down.png</normaloff>:/down.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QToolButton" name="dir_up_pb">
|
||||
<property name="text">
|
||||
<string>...</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../lay/lay/layResources.qrc">
|
||||
<normaloff>:/up.png</normaloff>:/up.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" colspan="4">
|
||||
<widget class="QTreeView" name="directory_tree">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="baseSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>4</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="contextMenuPolicy">
|
||||
<enum>Qt::ActionsContextMenu</enum>
|
||||
</property>
|
||||
<property name="selectionMode">
|
||||
<enum>QAbstractItemView::ExtendedSelection</enum>
|
||||
</property>
|
||||
<property name="selectionBehavior">
|
||||
<enum>QAbstractItemView::SelectRows</enum>
|
||||
</property>
|
||||
<property name="uniformRowHeights">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="sortingEnabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="allColumnsShowFocus">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0" colspan="4">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Directory</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="2" colspan="2">
|
||||
<widget class="QFrame" name="frame_2">
|
||||
<property name="sizePolicy">
|
||||
|
|
@ -237,6 +241,69 @@
|
|||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QToolButton" name="dir_down_pb">
|
||||
<property name="text">
|
||||
<string>...</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../lay/lay/layResources.qrc">
|
||||
<normaloff>:/down.png</normaloff>:/down.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QToolButton" name="dir_up_pb">
|
||||
<property name="text">
|
||||
<string>...</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../lay/lay/layResources.qrc">
|
||||
<normaloff>:/up.png</normaloff>:/up.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" colspan="4">
|
||||
<widget class="QTreeView" name="directory_tree">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="baseSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>4</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="contextMenuPolicy">
|
||||
<enum>Qt::ActionsContextMenu</enum>
|
||||
</property>
|
||||
<property name="selectionMode">
|
||||
<enum>QAbstractItemView::ExtendedSelection</enum>
|
||||
</property>
|
||||
<property name="selectionBehavior">
|
||||
<enum>QAbstractItemView::SelectRows</enum>
|
||||
</property>
|
||||
<property name="uniformRowHeights">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="sortingEnabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="allColumnsShowFocus">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0" colspan="4">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Directory</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QSplitter" name="splitter">
|
||||
|
|
|
|||
|
|
@ -1448,7 +1448,7 @@ Class<lay::LayoutView> decl_LayoutView (QT_EXTERNAL_BASE (QWidget) "lay", "Layou
|
|||
"@return The \\ReportDatabase object or nil if the index is not valid"
|
||||
) +
|
||||
gsi::method ("add_rdb", &lay::LayoutView::add_rdb, gsi::arg ("db"),
|
||||
"@brief Adds the given database to the view\n"
|
||||
"@brief Adds the given report database to the view\n"
|
||||
"\n"
|
||||
"This method will add an existing database to the view. It will then appear in the marker database browser.\n"
|
||||
"A similar method is \\create_rdb which will create a new database within the view.\n"
|
||||
|
|
@ -1457,6 +1457,15 @@ Class<lay::LayoutView> decl_LayoutView (QT_EXTERNAL_BASE (QWidget) "lay", "Layou
|
|||
"\n"
|
||||
"This method has been added in version 0.26."
|
||||
) +
|
||||
gsi::method ("replace_rdb", &lay::LayoutView::replace_rdb, gsi::arg ("db_index"), gsi::arg ("db"),
|
||||
"@brief Replaces the report database with the given index\n"
|
||||
"\n"
|
||||
"If the index is not valid, the database will be added to the view (see \\add_rdb).\n"
|
||||
"\n"
|
||||
"@return The index of the database within the view (see \\rdb)\n"
|
||||
"\n"
|
||||
"This method has been added in version 0.26."
|
||||
) +
|
||||
gsi::method_ext ("create_rdb", &create_rdb, gsi::arg ("name"),
|
||||
"@brief Creates a new report database and returns the index of the new database\n"
|
||||
"@param name The name of the new report database\n"
|
||||
|
|
@ -1496,7 +1505,7 @@ Class<lay::LayoutView> decl_LayoutView (QT_EXTERNAL_BASE (QWidget) "lay", "Layou
|
|||
"This method has been added in version 0.26."
|
||||
) +
|
||||
gsi::method ("add_l2ndb", &lay::LayoutView::add_l2ndb, gsi::arg ("db"),
|
||||
"@brief Adds the given database to the view\n"
|
||||
"@brief Adds the given netlist database to the view\n"
|
||||
"\n"
|
||||
"This method will add an existing database to the view. It will then appear in the netlist database browser.\n"
|
||||
"A similar method is \\create_l2ndb which will create a new database within the view.\n"
|
||||
|
|
@ -1506,7 +1515,7 @@ Class<lay::LayoutView> decl_LayoutView (QT_EXTERNAL_BASE (QWidget) "lay", "Layou
|
|||
"This method has been added in version 0.26."
|
||||
) +
|
||||
gsi::method ("replace_l2ndb", &lay::LayoutView::replace_l2ndb, gsi::arg ("db_index"), gsi::arg ("db"),
|
||||
"@brief Replaces the database with the given index\n"
|
||||
"@brief Replaces the netlist database with the given index\n"
|
||||
"\n"
|
||||
"If the index is not valid, the database will be added to the view (see \\add_lvsdb).\n"
|
||||
"\n"
|
||||
|
|
|
|||
|
|
@ -7210,21 +7210,16 @@ LayoutView::add_l2ndb (db::LayoutToNetlist *l2ndb)
|
|||
unsigned int
|
||||
LayoutView::replace_l2ndb (unsigned int db_index, db::LayoutToNetlist *l2ndb)
|
||||
{
|
||||
tl_assert (l2ndb != 0);
|
||||
|
||||
if (db_index < m_l2ndbs.size ()) {
|
||||
|
||||
// keep the name as it is used for reference in the browser for example
|
||||
std::string n = m_l2ndbs [db_index]->name ();
|
||||
l2ndb->set_name (n);
|
||||
|
||||
delete m_l2ndbs [db_index];
|
||||
m_l2ndbs.erase (m_l2ndbs.begin () + db_index);
|
||||
|
||||
// keep old name if possible
|
||||
if (l2ndb->name ().empty ()) {
|
||||
l2ndb->set_name (n);
|
||||
} else {
|
||||
make_unique_name (l2ndb, m_l2ndbs.begin (), m_l2ndbs.end ());
|
||||
}
|
||||
|
||||
m_l2ndbs.insert (m_l2ndbs.begin () + db_index, l2ndb);
|
||||
m_l2ndbs [db_index] = l2ndb;
|
||||
|
||||
// Mark this object as owned by us (for GSI)
|
||||
l2ndb->keep ();
|
||||
|
|
@ -7280,7 +7275,7 @@ LayoutView::remove_l2ndb (unsigned int index)
|
|||
unsigned int
|
||||
LayoutView::add_rdb (rdb::Database *rdb)
|
||||
{
|
||||
make_unique_name (rdb, m_l2ndbs.begin (), m_l2ndbs.end ());
|
||||
make_unique_name (rdb, m_rdbs.begin (), m_rdbs.end ());
|
||||
m_rdbs.push_back (rdb);
|
||||
|
||||
// Mark this object as owned by us (for GSI)
|
||||
|
|
@ -7291,6 +7286,32 @@ LayoutView::add_rdb (rdb::Database *rdb)
|
|||
return (unsigned int)(m_rdbs.size () - 1);
|
||||
}
|
||||
|
||||
unsigned int
|
||||
LayoutView::replace_rdb (unsigned int db_index, rdb::Database *rdb)
|
||||
{
|
||||
tl_assert (rdb != 0);
|
||||
|
||||
if (db_index < m_rdbs.size ()) {
|
||||
|
||||
// keep name because it's used for reference in the browser for example
|
||||
std::string n = m_rdbs [db_index]->name ();
|
||||
rdb->set_name (n);
|
||||
|
||||
delete m_rdbs [db_index];
|
||||
m_rdbs [db_index] = rdb;
|
||||
|
||||
// Mark this object as owned by us (for GSI)
|
||||
rdb->keep ();
|
||||
|
||||
rdb_list_changed_event ();
|
||||
|
||||
return db_index;
|
||||
|
||||
} else {
|
||||
return add_rdb (rdb);
|
||||
}
|
||||
}
|
||||
|
||||
rdb::Database *
|
||||
LayoutView::get_rdb (int index)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -2285,6 +2285,17 @@ public:
|
|||
*/
|
||||
unsigned int add_rdb (rdb::Database *rdb);
|
||||
|
||||
/**
|
||||
* @brief Replaces a marker database
|
||||
*
|
||||
* The layout view will become owner of the database.
|
||||
* If the index is not valid, the database will be added and the new index will be returned.
|
||||
*
|
||||
* @param db_index The index of the database to replace
|
||||
* @param rdb The database to add
|
||||
*/
|
||||
unsigned int replace_rdb (unsigned int db_index, rdb::Database *rdb);
|
||||
|
||||
/**
|
||||
* @brief Get the marker database by index
|
||||
*
|
||||
|
|
|
|||
|
|
@ -613,6 +613,7 @@ NetlistBrowserPage::rerun_macro ()
|
|||
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
NetlistBrowserPage::info_button_pressed ()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -671,6 +671,7 @@ MarkerBrowserDialog::update_content ()
|
|||
m_reload_action->setEnabled (rdb != 0);
|
||||
|
||||
browser_frame->enable_updates (false); // Avoid building the internal lists several times ...
|
||||
browser_frame->set_rdb (0); // force update
|
||||
browser_frame->set_rdb (rdb);
|
||||
browser_frame->set_max_marker_count (m_max_marker_count);
|
||||
browser_frame->set_marker_style (m_marker_color, m_marker_line_width, m_marker_vertex_size, m_marker_halo, m_marker_dither_pattern);
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@
|
|||
|
||||
#include "dbLayoutUtils.h"
|
||||
|
||||
#include "tlRecipe.h"
|
||||
#include "layLayoutView.h"
|
||||
#include "layMarker.h"
|
||||
|
||||
|
|
@ -1463,7 +1464,8 @@ MarkerBrowserPage::MarkerBrowserPage (QWidget * /*parent*/)
|
|||
m_marker_list_sort_order (Qt::DescendingOrder),
|
||||
m_directory_tree_sorted_section (-1),
|
||||
m_directory_tree_sort_order (Qt::DescendingOrder),
|
||||
mp_plugin_root (0)
|
||||
mp_plugin_root (0),
|
||||
dm_rerun_macro (this, &MarkerBrowserPage::rerun_macro)
|
||||
{
|
||||
Ui::MarkerBrowserPage::setupUi (this);
|
||||
|
||||
|
|
@ -1514,6 +1516,7 @@ MarkerBrowserPage::MarkerBrowserPage (QWidget * /*parent*/)
|
|||
connect (info_text, SIGNAL (anchorClicked (const QUrl &)), this, SLOT (info_anchor_clicked (const QUrl &)));
|
||||
connect (cat_filter, SIGNAL (textEdited (const QString &)), this, SLOT (filter_changed ()));
|
||||
connect (cell_filter, SIGNAL (textEdited (const QString &)), this, SLOT (filter_changed ()));
|
||||
connect (rerun_button, SIGNAL (pressed ()), this, SLOT (rerun_button_pressed ()));
|
||||
|
||||
m_show_all_action = new QAction (QObject::tr ("Show All"), this);
|
||||
m_show_all_action->setCheckable (true);
|
||||
|
|
@ -1678,6 +1681,17 @@ MarkerBrowserPage::set_rdb (rdb::Database *database)
|
|||
|
||||
mp_database = database;
|
||||
|
||||
rerun_button->setEnabled (mp_database && ! mp_database->generator ().empty ());
|
||||
if (rerun_button->isEnabled ()) {
|
||||
QString shortcut;
|
||||
if (! rerun_button->shortcut ().isEmpty ()) {
|
||||
shortcut = QString::fromUtf8 (" (%1)").arg (rerun_button->shortcut ().toString ());
|
||||
}
|
||||
rerun_button->setToolTip (tl::to_qstring (tl::to_string (tr ("Run ")) + mp_database->generator ()) + shortcut);
|
||||
} else {
|
||||
rerun_button->setToolTip (QString ());
|
||||
}
|
||||
|
||||
QAbstractItemModel *tree_model = directory_tree->model ();
|
||||
|
||||
MarkerBrowserTreeViewModel *new_model = new MarkerBrowserTreeViewModel ();
|
||||
|
|
@ -2643,6 +2657,32 @@ MarkerBrowserPage::flag_button_clicked ()
|
|||
list_model->mark_data_changed ();
|
||||
}
|
||||
|
||||
void
|
||||
MarkerBrowserPage::rerun_button_pressed ()
|
||||
{
|
||||
// NOTE: we use deferred execution, because otherwise the button won't get repainted properly
|
||||
dm_rerun_macro ();
|
||||
}
|
||||
|
||||
void
|
||||
MarkerBrowserPage::rerun_macro ()
|
||||
{
|
||||
if (! mp_database->generator ().empty ()) {
|
||||
|
||||
std::map<std::string, tl::Variant> add_pars;
|
||||
|
||||
for (unsigned int i = 0; i < mp_view->num_rdbs (); ++i) {
|
||||
if (mp_view->get_rdb (i) == mp_database) {
|
||||
add_pars["rdb_index"] = tl::Variant (int (i));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
tl::Recipe::make (mp_database->generator (), add_pars);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
MarkerBrowserPage::flag_menu_selected ()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@
|
|||
|
||||
#include "ui_MarkerBrowserPage.h"
|
||||
#include "rdbMarkerBrowser.h"
|
||||
#include "tlDeferredExecution.h"
|
||||
#include "dbBox.h"
|
||||
|
||||
#include <QFrame>
|
||||
|
|
@ -155,6 +156,7 @@ public slots:
|
|||
void dir_down_clicked ();
|
||||
void list_up_clicked ();
|
||||
void list_down_clicked ();
|
||||
void rerun_button_pressed ();
|
||||
void flag_button_clicked ();
|
||||
void flag_menu_selected ();
|
||||
void important_button_clicked ();
|
||||
|
|
@ -205,6 +207,7 @@ private:
|
|||
int m_directory_tree_sorted_section;
|
||||
Qt::SortOrder m_directory_tree_sort_order;
|
||||
lay::PluginRoot *mp_plugin_root;
|
||||
tl::DeferredMethod<MarkerBrowserPage> dm_rerun_macro;
|
||||
|
||||
void release_markers ();
|
||||
void update_marker_list (int selection_mode);
|
||||
|
|
@ -214,6 +217,7 @@ private:
|
|||
void mark_visited (bool visited);
|
||||
void do_update_markers ();
|
||||
void update_info_text ();
|
||||
void rerun_macro ();
|
||||
};
|
||||
|
||||
} // namespace rdb
|
||||
|
|
|
|||
|
|
@ -61,6 +61,7 @@ module LVS
|
|||
@lvs = RBA::LayoutVsSchematic::new(cell.name, layout.dbu)
|
||||
end
|
||||
|
||||
@lvs.name = "LVS"
|
||||
@lvs.generator = @engine._generator
|
||||
|
||||
@l2n = @lvs
|
||||
|
|
|
|||
Loading…
Reference in New Issue