Re-run feature for DRC too.

This commit is contained in:
Matthias Koefferlein 2019-08-25 23:47:55 +02:00
parent 441f946f43
commit db9ea27324
13 changed files with 450 additions and 229 deletions

View File

@ -763,10 +763,17 @@ module DRC
name = filename && File::basename(filename) name = filename && File::basename(filename)
name ||= "DRC" name ||= "DRC"
lv = RBA::LayoutView::current @output_rdb_index = nil
if lv
@output_rdb_index = lv.create_rdb(name) view = RBA::LayoutView::current
@output_rdb = lv.rdb(@output_rdb_index) 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 else
@output_rdb = RBA::ReportDatabase::new(name) @output_rdb = RBA::ReportDatabase::new(name)
end end

View File

@ -407,6 +407,7 @@ module DRC
@l2n = RBA::LayoutToNetlist::new(layout.top_cell.name, layout.dbu) @l2n = RBA::LayoutToNetlist::new(layout.top_cell.name, layout.dbu)
end end
@l2n.name = "DRC"
@l2n.generator = @engine._generator @l2n.generator = @engine._generator
end end

View File

@ -17,37 +17,39 @@
<text> <text>
module DRC module DRC
def DRC.execute_drc(_macro) def DRC.execute_drc(macro, generator, rdb_index = nil)
_timer = RBA::Timer::new timer = RBA::Timer::new
_timer.start timer.start
_drc = DRCEngine::new drc = DRCEngine::new
drc._rdb_index = rdb_index
drc._generator = generator
begin begin
# Set a debugger scope so that our errors end up with the debugger set to the DRC's line # 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 # No verbosity set in drc engine - we cannot use the engine's logger
RBA::Logger::verbosity &gt;= 10 &amp;&amp; RBA::Logger::info("Running #{_macro.path}") RBA::Logger::verbosity &gt;= 10 &amp;&amp; RBA::Logger::info("Running #{macro.path}")
_drc.instance_eval(_macro.text, _macro.path) drc.instance_eval(macro.text, macro.path)
# Remove the debugger scope # Remove the debugger scope
RBA::MacroExecutionContext::remove_debugger_scope RBA::MacroExecutionContext::remove_debugger_scope
rescue =&gt; ex rescue =&gt; ex
_drc.error("In #{_macro.path}: #{ex.to_s}") drc.error("In #{macro.path}: #{ex.to_s}")
RBA::MacroExecutionContext::ignore_next_exception RBA::MacroExecutionContext::ignore_next_exception
raise ex raise ex
ensure ensure
# cleans up and creates layout and report views # cleans up and creates layout and report views
_drc._finish drc._finish
end end
_timer.stop timer.stop
_drc.info("Total run time: #{'%.3f'%(_timer.sys+_timer.user)}s") drc.info("Total run time: #{'%.3f'%(timer.sys+timer.user)}s")
end end
@ -55,7 +57,9 @@ module DRC
class DRCInterpreter &lt; RBA::MacroInterpreter class DRCInterpreter &lt; RBA::MacroInterpreter
# Constructor # Constructor
def initialize def initialize(recipe)
@recipe = recipe
# Make the DSL use ruby syntax highlighting # Make the DSL use ruby syntax highlighting
self.syntax_scheme = "ruby" self.syntax_scheme = "ruby"
@ -74,8 +78,7 @@ module DRC
# Implements the execute method # Implements the execute method
def execute(macro) def execute(macro)
$0 = macro.path DRC::execute_drc(macro, @recipe.generator("script" => macro.path))
DRC::execute_drc(macro)
end end
end end
@ -84,7 +87,9 @@ module DRC
class DRCPlainTextInterpreter &lt; RBA::MacroInterpreter class DRCPlainTextInterpreter &lt; RBA::MacroInterpreter
# Constructor # Constructor
def initialize def initialize(recipe)
@recipe = recipe
# Make the DSL use ruby syntax highlighting # Make the DSL use ruby syntax highlighting
self.syntax_scheme = "ruby" self.syntax_scheme = "ruby"
@ -100,14 +105,40 @@ module DRC
# Implements the execute method # Implements the execute method
def execute(macro) def execute(macro)
DRC::execute_drc(macro) DRC::execute_drc(macro, @recipe.generator("script" => macro.path))
end end
end end
# A recipe implementation allowing the LVS run to be redone
class DRCRecipe &lt; 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 # Register the new interpreters
DRCInterpreter::new DRCInterpreter::new(drc_recipe)
DRCPlainTextInterpreter::new DRCPlainTextInterpreter::new(drc_recipe)
end end
</text> </text>

View File

@ -1,7 +1,8 @@
<ui version="4.0" > <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MarkerBrowserDialog</class> <class>MarkerBrowserDialog</class>
<widget class="QDialog" name="MarkerBrowserDialog" > <widget class="QDialog" name="MarkerBrowserDialog">
<property name="geometry" > <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
@ -9,40 +10,75 @@
<height>553</height> <height>553</height>
</rect> </rect>
</property> </property>
<property name="windowTitle" > <property name="windowTitle">
<string>Marker Database Browser</string> <string>Marker Database Browser</string>
</property> </property>
<layout class="QVBoxLayout" > <layout class="QVBoxLayout">
<property name="margin" > <property name="spacing">
<number>9</number>
</property>
<property name="spacing" >
<number>6</number> <number>6</number>
</property> </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> <item>
<widget class="QFrame" name="frame_3" > <widget class="QFrame" name="frame_3">
<property name="frameShape" > <property name="frameShape">
<enum>QFrame::NoFrame</enum> <enum>QFrame::NoFrame</enum>
</property> </property>
<property name="frameShadow" > <property name="frameShadow">
<enum>QFrame::Raised</enum> <enum>QFrame::Raised</enum>
</property> </property>
<layout class="QGridLayout" > <layout class="QGridLayout">
<property name="margin" > <property name="leftMargin">
<number>0</number> <number>0</number>
</property> </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> <number>6</number>
</property> </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> <spacer>
<property name="orientation" > <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
<property name="sizeType" > <property name="sizeType">
<enum>QSizePolicy::Fixed</enum> <enum>QSizePolicy::Fixed</enum>
</property> </property>
<property name="sizeHint" > <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>20</height> <height>20</height>
@ -50,152 +86,133 @@
</property> </property>
</spacer> </spacer>
</item> </item>
<item row="0" column="1" > <item row="0" column="1">
<widget class="QComboBox" name="rdb_cb" > <widget class="QComboBox" name="rdb_cb">
<property name="sizePolicy" > <property name="sizePolicy">
<sizepolicy> <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<hsizetype>7</hsizetype>
<vsizetype>0</vsizetype>
<horstretch>1</horstretch> <horstretch>1</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="sizeAdjustPolicy" > <property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContentsOnFirstShow</enum> <enum>QComboBox::AdjustToContentsOnFirstShow</enum>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="0" > <item row="0" column="0">
<widget class="QLabel" name="label_3" > <widget class="QLabel" name="label_3">
<property name="text" > <property name="text">
<string>Database </string> <string>Database </string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0" > <item row="1" column="1">
<widget class="QLabel" name="label" > <widget class="QComboBox" name="layout_cb">
<property name="text" > <property name="sizePolicy">
<string> ... on layout </string> <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
</property>
</widget>
</item>
<item row="1" column="1" >
<widget class="QComboBox" name="layout_cb" >
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>7</hsizetype>
<vsizetype>0</vsizetype>
<horstretch>1</horstretch> <horstretch>1</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="sizeAdjustPolicy" > <property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContentsOnFirstShow</enum> <enum>QComboBox::AdjustToContentsOnFirstShow</enum>
</property> </property>
</widget> </widget>
</item> </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> </layout>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="Line" name="line" > <widget class="QFrame" name="frame_4">
<property name="orientation" > <property name="frameShape">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QFrame" name="frame_4" >
<property name="frameShape" >
<enum>QFrame::NoFrame</enum> <enum>QFrame::NoFrame</enum>
</property> </property>
<property name="frameShadow" > <property name="frameShadow">
<enum>QFrame::Raised</enum> <enum>QFrame::Raised</enum>
</property> </property>
<layout class="QHBoxLayout" > <layout class="QHBoxLayout">
<property name="margin" > <property name="spacing">
<number>0</number>
</property>
<property name="spacing" >
<number>6</number> <number>6</number>
</property> </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> <item>
<widget class="QStackedWidget" name="central_stack" > <widget class="QStackedWidget" name="central_stack">
<property name="currentIndex" > <property name="currentIndex">
<number>1</number> <number>1</number>
</property> </property>
<widget class="QWidget" name="page" > <widget class="QWidget" name="page">
<layout class="QVBoxLayout" > <layout class="QVBoxLayout">
<property name="margin" > <property name="spacing">
<number>0</number>
</property>
<property name="spacing" >
<number>6</number> <number>6</number>
</property> </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> <item>
<widget class="rdb::MarkerBrowserPage" name="browser_frame" > <widget class="rdb::MarkerBrowserPage" name="browser_frame">
<property name="sizePolicy" > <property name="sizePolicy">
<sizepolicy> <sizepolicy hsizetype="Ignored" vsizetype="Ignored">
<hsizetype>13</hsizetype>
<vsizetype>13</vsizetype>
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="frameShape" > <property name="frameShape">
<enum>QFrame::NoFrame</enum> <enum>QFrame::NoFrame</enum>
</property> </property>
<property name="frameShadow" > <property name="frameShadow">
<enum>QFrame::Raised</enum> <enum>QFrame::Raised</enum>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</widget> </widget>
<widget class="QWidget" name="page_2" > <widget class="QWidget" name="page_2">
<layout class="QVBoxLayout" > <layout class="QVBoxLayout">
<property name="margin" > <property name="spacing">
<number>0</number>
</property>
<property name="spacing" >
<number>6</number> <number>6</number>
</property> </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> <item>
<widget class="QLabel" name="label_2" > <widget class="QLabel" name="label_2">
<property name="text" > <property name="text">
<string>Choose "Open" from the "File ..." menu <string>Choose &quot;Open&quot; from the &quot;File ...&quot; menu
to load a marker database</string> to load a marker database</string>
</property> </property>
<property name="alignment" > <property name="alignment">
<set>Qt::AlignCenter</set> <set>Qt::AlignCenter</set>
</property> </property>
<property name="wordWrap" > <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
</property> </property>
</widget> </widget>
@ -208,40 +225,49 @@ to load a marker database</string>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="Line" name="line_2" > <widget class="Line" name="line_2">
<property name="orientation" > <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QFrame" name="frame_2" > <widget class="QFrame" name="frame_2">
<property name="frameShape" > <property name="frameShape">
<enum>QFrame::NoFrame</enum> <enum>QFrame::NoFrame</enum>
</property> </property>
<property name="frameShadow" > <property name="frameShadow">
<enum>QFrame::Raised</enum> <enum>QFrame::Raised</enum>
</property> </property>
<layout class="QHBoxLayout" > <layout class="QHBoxLayout">
<property name="margin" > <property name="spacing">
<number>0</number>
</property>
<property name="spacing" >
<number>6</number> <number>6</number>
</property> </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> <item>
<widget class="QPushButton" name="configure_pb" > <widget class="QPushButton" name="configure_pb">
<property name="text" > <property name="text">
<string>Configure</string> <string>Configure</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<spacer> <spacer>
<property name="orientation" > <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
<property name="sizeHint" > <property name="sizeHint" stdset="0">
<size> <size>
<width>40</width> <width>40</width>
<height>20</height> <height>20</height>
@ -250,8 +276,8 @@ to load a marker database</string>
</spacer> </spacer>
</item> </item>
<item> <item>
<widget class="QPushButton" name="pushButton_2" > <widget class="QPushButton" name="pushButton_2">
<property name="text" > <property name="text">
<string>Close</string> <string>Close</string>
</property> </property>
</widget> </widget>
@ -266,6 +292,7 @@ to load a marker database</string>
<class>rdb::MarkerBrowserPage</class> <class>rdb::MarkerBrowserPage</class>
<extends>QFrame</extends> <extends>QFrame</extends>
<header>rdbMarkerBrowserPage.h</header> <header>rdbMarkerBrowserPage.h</header>
<container>1</container>
</customwidget> </customwidget>
</customwidgets> </customwidgets>
<tabstops> <tabstops>
@ -282,11 +309,11 @@ to load a marker database</string>
<receiver>MarkerBrowserDialog</receiver> <receiver>MarkerBrowserDialog</receiver>
<slot>accept()</slot> <slot>accept()</slot>
<hints> <hints>
<hint type="sourcelabel" > <hint type="sourcelabel">
<x>837</x> <x>837</x>
<y>441</y> <y>441</y>
</hint> </hint>
<hint type="destinationlabel" > <hint type="destinationlabel">
<x>881</x> <x>881</x>
<y>387</y> <y>387</y>
</hint> </hint>

View File

@ -13,7 +13,7 @@
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QHBoxLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing"> <property name="spacing">
<number>6</number> <number>6</number>
</property> </property>
@ -29,6 +29,73 @@
<property name="bottomMargin"> <property name="bottomMargin">
<number>0</number> <number>0</number>
</property> </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> <item>
<widget class="QSplitter" name="splitter_2"> <widget class="QSplitter" name="splitter_2">
<property name="orientation"> <property name="orientation">
@ -63,69 +130,6 @@
<property name="spacing"> <property name="spacing">
<number>6</number> <number>6</number>
</property> </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"> <item row="2" column="2" colspan="2">
<widget class="QFrame" name="frame_2"> <widget class="QFrame" name="frame_2">
<property name="sizePolicy"> <property name="sizePolicy">
@ -237,6 +241,69 @@
</layout> </layout>
</widget> </widget>
</item> </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> </layout>
</widget> </widget>
<widget class="QSplitter" name="splitter"> <widget class="QSplitter" name="splitter">

View File

@ -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" "@return The \\ReportDatabase object or nil if the index is not valid"
) + ) +
gsi::method ("add_rdb", &lay::LayoutView::add_rdb, gsi::arg ("db"), 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" "\n"
"This method will add an existing database to the view. It will then appear in the marker database browser.\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" "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" "\n"
"This method has been added in version 0.26." "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"), 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" "@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" "@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." "This method has been added in version 0.26."
) + ) +
gsi::method ("add_l2ndb", &lay::LayoutView::add_l2ndb, gsi::arg ("db"), 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" "\n"
"This method will add an existing database to the view. It will then appear in the netlist database browser.\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" "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." "This method has been added in version 0.26."
) + ) +
gsi::method ("replace_l2ndb", &lay::LayoutView::replace_l2ndb, gsi::arg ("db_index"), gsi::arg ("db"), 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" "\n"
"If the index is not valid, the database will be added to the view (see \\add_lvsdb).\n" "If the index is not valid, the database will be added to the view (see \\add_lvsdb).\n"
"\n" "\n"

View File

@ -7210,21 +7210,16 @@ LayoutView::add_l2ndb (db::LayoutToNetlist *l2ndb)
unsigned int unsigned int
LayoutView::replace_l2ndb (unsigned int db_index, db::LayoutToNetlist *l2ndb) LayoutView::replace_l2ndb (unsigned int db_index, db::LayoutToNetlist *l2ndb)
{ {
tl_assert (l2ndb != 0);
if (db_index < m_l2ndbs.size ()) { 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 (); std::string n = m_l2ndbs [db_index]->name ();
l2ndb->set_name (n);
delete m_l2ndbs [db_index]; delete m_l2ndbs [db_index];
m_l2ndbs.erase (m_l2ndbs.begin () + db_index); m_l2ndbs [db_index] = l2ndb;
// 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);
// Mark this object as owned by us (for GSI) // Mark this object as owned by us (for GSI)
l2ndb->keep (); l2ndb->keep ();
@ -7280,7 +7275,7 @@ LayoutView::remove_l2ndb (unsigned int index)
unsigned int unsigned int
LayoutView::add_rdb (rdb::Database *rdb) 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); m_rdbs.push_back (rdb);
// Mark this object as owned by us (for GSI) // 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); 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 * rdb::Database *
LayoutView::get_rdb (int index) LayoutView::get_rdb (int index)
{ {

View File

@ -2285,6 +2285,17 @@ public:
*/ */
unsigned int add_rdb (rdb::Database *rdb); 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 * @brief Get the marker database by index
* *

View File

@ -613,6 +613,7 @@ NetlistBrowserPage::rerun_macro ()
} }
} }
void void
NetlistBrowserPage::info_button_pressed () NetlistBrowserPage::info_button_pressed ()
{ {

View File

@ -671,6 +671,7 @@ MarkerBrowserDialog::update_content ()
m_reload_action->setEnabled (rdb != 0); m_reload_action->setEnabled (rdb != 0);
browser_frame->enable_updates (false); // Avoid building the internal lists several times ... 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_rdb (rdb);
browser_frame->set_max_marker_count (m_max_marker_count); 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); browser_frame->set_marker_style (m_marker_color, m_marker_line_width, m_marker_vertex_size, m_marker_halo, m_marker_dither_pattern);

View File

@ -26,6 +26,7 @@
#include "dbLayoutUtils.h" #include "dbLayoutUtils.h"
#include "tlRecipe.h"
#include "layLayoutView.h" #include "layLayoutView.h"
#include "layMarker.h" #include "layMarker.h"
@ -1463,7 +1464,8 @@ MarkerBrowserPage::MarkerBrowserPage (QWidget * /*parent*/)
m_marker_list_sort_order (Qt::DescendingOrder), m_marker_list_sort_order (Qt::DescendingOrder),
m_directory_tree_sorted_section (-1), m_directory_tree_sorted_section (-1),
m_directory_tree_sort_order (Qt::DescendingOrder), 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); 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 (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 (cat_filter, SIGNAL (textEdited (const QString &)), this, SLOT (filter_changed ()));
connect (cell_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 = new QAction (QObject::tr ("Show All"), this);
m_show_all_action->setCheckable (true); m_show_all_action->setCheckable (true);
@ -1678,6 +1681,17 @@ MarkerBrowserPage::set_rdb (rdb::Database *database)
mp_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 (); QAbstractItemModel *tree_model = directory_tree->model ();
MarkerBrowserTreeViewModel *new_model = new MarkerBrowserTreeViewModel (); MarkerBrowserTreeViewModel *new_model = new MarkerBrowserTreeViewModel ();
@ -2643,6 +2657,32 @@ MarkerBrowserPage::flag_button_clicked ()
list_model->mark_data_changed (); 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 void
MarkerBrowserPage::flag_menu_selected () MarkerBrowserPage::flag_menu_selected ()
{ {

View File

@ -26,6 +26,7 @@
#include "ui_MarkerBrowserPage.h" #include "ui_MarkerBrowserPage.h"
#include "rdbMarkerBrowser.h" #include "rdbMarkerBrowser.h"
#include "tlDeferredExecution.h"
#include "dbBox.h" #include "dbBox.h"
#include <QFrame> #include <QFrame>
@ -155,6 +156,7 @@ public slots:
void dir_down_clicked (); void dir_down_clicked ();
void list_up_clicked (); void list_up_clicked ();
void list_down_clicked (); void list_down_clicked ();
void rerun_button_pressed ();
void flag_button_clicked (); void flag_button_clicked ();
void flag_menu_selected (); void flag_menu_selected ();
void important_button_clicked (); void important_button_clicked ();
@ -205,6 +207,7 @@ private:
int m_directory_tree_sorted_section; int m_directory_tree_sorted_section;
Qt::SortOrder m_directory_tree_sort_order; Qt::SortOrder m_directory_tree_sort_order;
lay::PluginRoot *mp_plugin_root; lay::PluginRoot *mp_plugin_root;
tl::DeferredMethod<MarkerBrowserPage> dm_rerun_macro;
void release_markers (); void release_markers ();
void update_marker_list (int selection_mode); void update_marker_list (int selection_mode);
@ -214,6 +217,7 @@ private:
void mark_visited (bool visited); void mark_visited (bool visited);
void do_update_markers (); void do_update_markers ();
void update_info_text (); void update_info_text ();
void rerun_macro ();
}; };
} // namespace rdb } // namespace rdb

View File

@ -61,6 +61,7 @@ module LVS
@lvs = RBA::LayoutVsSchematic::new(cell.name, layout.dbu) @lvs = RBA::LayoutVsSchematic::new(cell.name, layout.dbu)
end end
@lvs.name = "LVS"
@lvs.generator = @engine._generator @lvs.generator = @engine._generator
@l2n = @lvs @l2n = @lvs