Implemented new layout dialog with intial layers

Plus small enhancements: the first layer will be selected
initially, so you can starting drawing immediately.
This commit is contained in:
Matthias Koefferlein 2021-03-04 23:11:54 +01:00
parent da273c8e4b
commit 3a9a7e81fb
6 changed files with 160 additions and 74 deletions

View File

@ -2525,21 +2525,30 @@ MainWindow::cm_new_layout ()
std::string technology = m_initial_technology;
static std::string s_new_cell_cell_name ("TOP");
static double s_new_cell_window_size = 2.0;
static std::vector<db::LayerProperties> s_layers;
double dbu = 0.0;
lay::NewLayoutPropertiesDialog dialog (this);
if (dialog.exec_dialog (technology, s_new_cell_cell_name, dbu, s_new_cell_window_size, m_new_layout_current_panel)) {
if (dialog.exec_dialog (technology, s_new_cell_cell_name, dbu, s_new_cell_window_size, s_layers, m_new_layout_current_panel)) {
lay::CellViewRef cellview = create_or_load_layout (0, 0, technology, m_new_layout_current_panel ? 2 : 1 /*= new view*/);
std::unique_ptr <lay::LayoutHandle> handle (new lay::LayoutHandle (new db::Layout (& manager ()), std::string ()));
handle->rename ("new");
if (dbu > 1e-10) {
cellview->layout ().dbu (dbu);
handle->layout ().dbu (dbu);
}
db::cell_index_type new_ci = cellview->layout ().add_cell (s_new_cell_cell_name.empty () ? 0 : s_new_cell_cell_name.c_str ());
cellview.set_cell (new_ci);
db::cell_index_type new_ci = handle->layout ().add_cell (s_new_cell_cell_name.empty () ? 0 : s_new_cell_cell_name.c_str ());
current_view ()->zoom_box_and_set_hier_levels (db::DBox (-0.5 * s_new_cell_window_size, -0.5 * s_new_cell_window_size, 0.5 * s_new_cell_window_size, 0.5 * s_new_cell_window_size), std::make_pair (0, 1));
for (std::vector<db::LayerProperties>::const_iterator l = s_layers.begin (); l != s_layers.end (); ++l) {
handle->layout ().insert_layer (*l);
}
lay::LayoutView *mp_view = (m_new_layout_current_panel && current_view ()) ? current_view () : view (create_view ());
unsigned int ci = mp_view->add_layout (handle.release (), true);
mp_view->cellview_ref (ci).set_cell (new_ci);
mp_view->zoom_box_and_set_hier_levels (db::DBox (-0.5 * s_new_cell_window_size, -0.5 * s_new_cell_window_size, 0.5 * s_new_cell_window_size, 0.5 * s_new_cell_window_size), std::make_pair (0, 1));
}
}

View File

@ -1040,7 +1040,7 @@ BEGIN_PROTECTED
query_to_model (model, lq, iq, std::numeric_limits<size_t>::max (), true);
model.end_changes ();
std::unique_ptr <lay::LayoutHandle> handle (new lay::LayoutHandle (new db::Layout (), std::string ()));
std::unique_ptr <lay::LayoutHandle> handle (new lay::LayoutHandle (new db::Layout (mp_view->manager ()), std::string ()));
handle->rename ("query_results");
model.export_layout (handle->layout ());
mp_view->add_layout (handle.release (), true);

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>563</width>
<height>234</height>
<width>594</width>
<height>401</height>
</rect>
</property>
<property name="windowTitle">
@ -50,7 +50,7 @@
<property name="spacing">
<number>6</number>
</property>
<item row="3" column="1">
<item row="4" column="1">
<widget class="QLineEdit" name="window_le">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
@ -60,13 +60,6 @@
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Database unit</string>
</property>
</widget>
</item>
<item row="1" column="2" colspan="3">
<spacer>
<property name="orientation">
@ -80,13 +73,80 @@
</property>
</spacer>
</item>
<item row="2" column="2">
<item row="1" column="1">
<widget class="QLineEdit" name="topcell_le">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="dbu_le">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="0" column="1" colspan="4">
<widget class="QComboBox" name="tech_cbx"/>
</item>
<item row="5" column="1" colspan="4">
<widget class="QLineEdit" name="layers_le"/>
</item>
<item row="4" column="4">
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>141</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="2">
<widget class="QLabel" name="label_6">
<property name="text">
<string>µm</string>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QLabel" name="label_4">
<property name="text">
<string>µm</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Top cell</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Database unit</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Technology</string>
</property>
</widget>
</item>
<item row="3" column="4">
<spacer>
<property name="orientation">
@ -100,74 +160,34 @@
</property>
</spacer>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="dbu_le">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="0" column="1" colspan="4">
<widget class="QComboBox" name="tech_cbx"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label">
<item row="3" column="3">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Top cell</string>
<string> (empty for default)</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="topcell_le">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Technology</string>
</property>
</widget>
</item>
<item row="3" column="0">
<item row="4" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Initial window size</string>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QLabel" name="label_4">
<item row="5" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>µm</string>
<string>Initial layer(s)</string>
</property>
</widget>
</item>
<item row="2" column="4">
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>141</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="3">
<widget class="QLabel" name="label_7">
<item row="6" column="1" colspan="4">
<widget class="QLabel" name="label_9">
<property name="text">
<string> (empty for default)</string>
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;Specify a comma or blank separated list of layers to create in the usual layer notation, e.g. &quot;1/0 2/0 3/0&quot;, &quot;metal1 via1 metal2&quot; or &quot;metal1 (1/0) via1 (2/0) metal2 (3/0)&quot;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
@ -214,10 +234,12 @@
</layout>
</widget>
<tabstops>
<tabstop>tech_cbx</tabstop>
<tabstop>topcell_le</tabstop>
<tabstop>dbu_le</tabstop>
<tabstop>window_le</tabstop>
<tabstop>buttonBox</tabstop>
<tabstop>layers_le</tabstop>
<tabstop>current_panel_cb</tabstop>
</tabstops>
<resources/>
<connections>

View File

@ -129,7 +129,7 @@ NewLayoutPropertiesDialog::tech_changed ()
}
bool
NewLayoutPropertiesDialog::exec_dialog (std::string &technology, std::string &cell_name, double &dbu, double &size, bool &current_panel)
NewLayoutPropertiesDialog::exec_dialog (std::string &technology, std::string &cell_name, double &dbu, double &size, std::vector<db::LayerProperties> &layers, bool &current_panel)
{
mp_ui->tech_cbx->clear ();
unsigned int technology_index = 0;
@ -151,6 +151,15 @@ NewLayoutPropertiesDialog::exec_dialog (std::string &technology, std::string &ce
mp_ui->topcell_le->setText (tl::to_qstring (cell_name));
mp_ui->current_panel_cb->setChecked (current_panel);
std::string layer_string;
for (std::vector<db::LayerProperties>::const_iterator l = layers.begin (); l != layers.end (); ++l) {
if (l != layers.begin ()) {
layer_string += ", ";
}
layer_string += l->to_string ();
}
mp_ui->layers_le->setText (tl::to_qstring (layer_string));
if (QDialog::exec ()) {
// get the selected technology name
@ -167,8 +176,24 @@ NewLayoutPropertiesDialog::exec_dialog (std::string &technology, std::string &ce
} else {
dbu = 0.0;
}
cell_name = tl::to_string (mp_ui->topcell_le->text ());
current_panel = mp_ui->current_panel_cb->isChecked ();
layers.clear ();
layer_string = tl::to_string (mp_ui->layers_le->text ());
tl::Extractor ex (layer_string.c_str ());
while (! ex.at_end ()) {
db::LayerProperties lp;
try {
lp.read (ex);
} catch (...) {
break;
}
layers.push_back (lp);
ex.test (",");
}
return true;
} else {

View File

@ -328,7 +328,7 @@ public:
NewLayoutPropertiesDialog (QWidget *parent);
virtual ~NewLayoutPropertiesDialog ();
bool exec_dialog (std::string &tech_name, std::string &cell_name, double &dbu, double &window_size, bool &current_panel);
bool exec_dialog (std::string &tech_name, std::string &cell_name, double &dbu, double &window_size, std::vector<db::LayerProperties> &layers, bool &current_panel);
private slots:
void tech_changed ();

View File

@ -2859,6 +2859,8 @@ LayoutView::add_new_layers (const std::vector <unsigned int> &layer_ids, int cv_
// create the layers and do a basic recoloring ..
lay::LayerPropertiesList new_props (get_properties ());
bool was_empty = new_props.begin_const_recursive ().at_end ();
// don't create new layers for those, for which there are layers already: compute a
// set of layers already present
std::set <db::LayerProperties, db::LPLogicalLessFunc> present_layers;
@ -2890,6 +2892,10 @@ LayoutView::add_new_layers (const std::vector <unsigned int> &layer_ids, int cv_
set_properties (new_props);
if (was_empty) {
set_current_layer (new_props.begin_const_recursive ());
}
}
}
@ -3291,6 +3297,18 @@ LayoutView::add_layout (lay::LayoutHandle *layout_handle, bool add_cellview, boo
}
// select the first layer if nothing else is selected
if (cv_index == 0 && ! mp_control_panel->has_selection ()) {
const lay::LayerPropertiesList &lp = get_properties ();
lay::LayerPropertiesConstIterator li = lp.begin_const_recursive ();
while (! li.at_end () && li->has_children ()) {
++li;
}
if (! li.at_end ()) {
mp_control_panel->set_current_layer (li);
}
}
// signal to any observers
file_open_event ();
@ -3456,6 +3474,18 @@ LayoutView::load_layout (const std::string &filename, const db::LoadLayoutOption
// create the initial layer properties
create_initial_layer_props (cv_index, lyp_file, add_other_layers);
// select the first layer if nothing else is selected
if (cv_index == 0 && ! mp_control_panel->has_selection ()) {
const lay::LayerPropertiesList &lp = get_properties ();
lay::LayerPropertiesConstIterator li = lp.begin_const_recursive ();
while (! li.at_end () && li->has_children ()) {
++li;
}
if (! li.at_end ()) {
mp_control_panel->set_current_layer (li);
}
}
// signal to any observers
file_open_event ();