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 ||= "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

View File

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

View File

@ -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 &gt;= 10 &amp;&amp; RBA::Logger::info("Running #{_macro.path}")
_drc.instance_eval(_macro.text, _macro.path)
RBA::Logger::verbosity &gt;= 10 &amp;&amp; RBA::Logger::info("Running #{macro.path}")
drc.instance_eval(macro.text, macro.path)
# Remove the debugger scope
RBA::MacroExecutionContext::remove_debugger_scope
rescue =&gt; 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 &lt; 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 &lt; 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 &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
DRCInterpreter::new
DRCPlainTextInterpreter::new
DRCInterpreter::new(drc_recipe)
DRCPlainTextInterpreter::new(drc_recipe)
end
</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>
<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 &quot;Open&quot; from the &quot;File ...&quot; 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>

View File

@ -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">

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"
) +
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"

View File

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

View File

@ -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
*

View File

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

View File

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

View File

@ -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 ()
{

View File

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

View File

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