diff --git a/src/laybasic/laybasic/layNetlistBrowserPage.cc b/src/laybasic/laybasic/layNetlistBrowserPage.cc index 881d03f22..6e7de5d9a 100644 --- a/src/laybasic/laybasic/layNetlistBrowserPage.cc +++ b/src/laybasic/laybasic/layNetlistBrowserPage.cc @@ -626,21 +626,22 @@ NetlistBrowserModel::index (int row, int column, const QModelIndex &parent) cons if (is_id_circuit (id)) { + int r = row; db::Circuit *circuit = circuit_from_id (id); - if (row < int (circuit->pin_count ())) { - new_id = make_id_circuit_pin (circuit_index_from_id (id), row); + if (r < int (circuit->pin_count ())) { + new_id = make_id_circuit_pin (circuit_index_from_id (id), size_t (r)); } else { - row -= int (circuit->pin_count ()); - if (row < int (circuit->net_count ())) { - new_id = make_id_circuit_net (circuit_index_from_id (id), row); + r -= int (circuit->pin_count ()); + if (r < int (circuit->net_count ())) { + new_id = make_id_circuit_net (circuit_index_from_id (id), size_t (r)); } else { - row -= int (circuit->net_count ()); - if (row < int (circuit->subcircuit_count ())) { - new_id = make_id_circuit_subcircuit (circuit_index_from_id (id), row); + r -= int (circuit->net_count ()); + if (r < int (circuit->subcircuit_count ())) { + new_id = make_id_circuit_subcircuit (circuit_index_from_id (id), size_t (r)); } else { - row -= int (circuit->subcircuit_count ()); - if (row < int (circuit->device_count ())) { - new_id = make_id_circuit_device (circuit_index_from_id (id), row); + r -= int (circuit->subcircuit_count ()); + if (r < int (circuit->device_count ())) { + new_id = make_id_circuit_device (circuit_index_from_id (id), size_t (r)); } } } @@ -648,40 +649,41 @@ NetlistBrowserModel::index (int row, int column, const QModelIndex &parent) cons } else if (is_id_circuit_pin (id)) { - new_id = make_id_circuit_pin_net (circuit_index_from_id (id), circuit_pin_index_from_id (id), row); + new_id = make_id_circuit_pin_net (circuit_index_from_id (id), circuit_pin_index_from_id (id), size_t (row)); } else if (is_id_circuit_device (id)) { - new_id = make_id_circuit_device_terminal (circuit_index_from_id (id), circuit_device_index_from_id (id), row); + new_id = make_id_circuit_device_terminal (circuit_index_from_id (id), circuit_device_index_from_id (id), size_t (row)); } else if (is_id_circuit_subcircuit (id)) { - new_id = make_id_circuit_subcircuit_pin (circuit_index_from_id (id), circuit_subcircuit_index_from_id (id), row); + new_id = make_id_circuit_subcircuit_pin (circuit_index_from_id (id), circuit_subcircuit_index_from_id (id), size_t (row)); } else if (is_id_circuit_net (id)) { + int r = row; db::Net *net = net_from_id (id); - if (row < int (net->terminal_count ())) { - new_id = make_id_circuit_net_device_terminal (circuit_index_from_id (id), circuit_net_index_from_id (id), row); + if (r < int (net->terminal_count ())) { + new_id = make_id_circuit_net_device_terminal (circuit_index_from_id (id), circuit_net_index_from_id (id), size_t (r)); } else { - row -= int (net->terminal_count ()); - if (row < int (net->pin_count ())) { - new_id = make_id_circuit_net_pin (circuit_index_from_id (id), circuit_net_index_from_id (id), row); + r -= int (net->terminal_count ()); + if (r < int (net->pin_count ())) { + new_id = make_id_circuit_net_pin (circuit_index_from_id (id), circuit_net_index_from_id (id), size_t (r)); } else { - row -= int (net->pin_count ()); - if (row < int (net->subcircuit_pin_count ())) { - new_id = make_id_circuit_net_subcircuit_pin (circuit_index_from_id (id), circuit_net_index_from_id (id), row); + r -= int (net->pin_count ()); + if (r < int (net->subcircuit_pin_count ())) { + new_id = make_id_circuit_net_subcircuit_pin (circuit_index_from_id (id), circuit_net_index_from_id (id), size_t (r)); } } } } else if (is_id_circuit_net_subcircuit_pin (id)) { - new_id = make_id_circuit_net_subcircuit_pin_others (circuit_index_from_id (id), circuit_net_index_from_id (id), circuit_net_subcircuit_pin_index_from_id (id), row); + new_id = make_id_circuit_net_subcircuit_pin_others (circuit_index_from_id (id), circuit_net_index_from_id (id), circuit_net_subcircuit_pin_index_from_id (id), size_t (row)); } else if (is_id_circuit_net_device_terminal (id)) { - new_id = make_id_circuit_net_device_terminal_others (circuit_index_from_id (id), circuit_net_index_from_id (id), circuit_net_device_terminal_index_from_id (id), row); + new_id = make_id_circuit_net_device_terminal_others (circuit_index_from_id (id), circuit_net_index_from_id (id), circuit_net_device_terminal_index_from_id (id), size_t (row)); } @@ -727,7 +729,7 @@ NetlistBrowserModel::parent (const QModelIndex &index) const } else if (is_id_circuit_device_terminal (id)) { db::Circuit *circuit = circuit_from_id (id); - return createIndex (int (circuit->pin_count () + circuit->net_count () + circuit->subcircuit_count () + circuit_device_terminal_index_from_id (id)), column, make_id_circuit_device (circuit_index_from_id (id), circuit_device_index_from_id (id))); + return createIndex (int (circuit->pin_count () + circuit->net_count () + circuit->subcircuit_count () + circuit_device_index_from_id (id)), column, make_id_circuit_device (circuit_index_from_id (id), circuit_device_index_from_id (id))); } else if (is_id_circuit_net_device_terminal_others (id)) { diff --git a/src/laybasic/unit_tests/layNetlistBrowserModelTests.cc b/src/laybasic/unit_tests/layNetlistBrowserModelTests.cc index bdb7c358d..59ab5cf22 100644 --- a/src/laybasic/unit_tests/layNetlistBrowserModelTests.cc +++ b/src/laybasic/unit_tests/layNetlistBrowserModelTests.cc @@ -78,16 +78,19 @@ TEST (1) // OUT pin of INV2 has a single child node which is the "OUT" net QModelIndex inv2PinOutIndex = model->index (2, 0, inv2Index); + EXPECT_EQ (model->parent (inv2PinOutIndex) == inv2Index, true); EXPECT_EQ (model->hasChildren (inv2PinOutIndex), true); EXPECT_EQ (model->rowCount (inv2PinOutIndex), 1); EXPECT_EQ (tl::to_string (model->data (model->index (0, 0, inv2PinOutIndex), Qt::DisplayRole).toString ()), "NOUT"); QModelIndex inv2PinOutIndexNet = model->index (0, 0, inv2PinOutIndex); + EXPECT_EQ (model->parent (inv2PinOutIndexNet) == inv2PinOutIndex, true); EXPECT_EQ (model->hasChildren (inv2PinOutIndexNet), false); EXPECT_EQ (model->rowCount (inv2PinOutIndexNet), 0); // NOUT net has 1 pin, 2 devices, 0 subcircuits QModelIndex inv2NOutIndex = model->index (7, 0, inv2Index); + EXPECT_EQ (model->parent (inv2NOutIndex) == inv2Index, true); EXPECT_EQ (model->hasChildren (inv2NOutIndex), true); EXPECT_EQ (model->rowCount (inv2NOutIndex), 3); @@ -97,11 +100,13 @@ TEST (1) // no children for pins on nets QModelIndex inv2NOutPinOutIndex = model->index (2, 0, inv2NOutIndex); + EXPECT_EQ (model->parent (inv2NOutPinOutIndex) == inv2NOutIndex, true); EXPECT_EQ (model->hasChildren (inv2NOutPinOutIndex), false); EXPECT_EQ (model->rowCount (inv2NOutPinOutIndex), 0); // a MOS3 transistor has three other terminals QModelIndex inv2NOutDeviceIndex = model->index (0, 0, inv2NOutIndex); + EXPECT_EQ (model->parent (inv2NOutDeviceIndex) == inv2NOutIndex, true); EXPECT_EQ (model->hasChildren (inv2NOutDeviceIndex), true); EXPECT_EQ (model->rowCount (inv2NOutDeviceIndex), 3); @@ -110,11 +115,13 @@ TEST (1) EXPECT_EQ (tl::to_string (model->data (model->index (2, 0, inv2NOutDeviceIndex), Qt::DisplayRole).toString ()), "D"); QModelIndex inv2NOutDeviceGateIndex = model->index (1, 0, inv2NOutDeviceIndex); + EXPECT_EQ (model->parent (inv2NOutDeviceGateIndex) == inv2NOutDeviceIndex, true); EXPECT_EQ (model->hasChildren (inv2NOutDeviceGateIndex), false); EXPECT_EQ (model->rowCount (inv2NOutDeviceGateIndex), 0); // FB net has 0 pin, 0 devices, 2 subcircuits QModelIndex ringoFbIndex = model->index (0, 0, ringoIndex); + EXPECT_EQ (model->parent (ringoFbIndex) == ringoIndex, true); EXPECT_EQ (model->hasChildren (ringoFbIndex), true); EXPECT_EQ (model->rowCount (ringoFbIndex), 2); @@ -122,6 +129,7 @@ TEST (1) EXPECT_EQ (tl::to_string (model->data (model->index (1, 0, ringoFbIndex), Qt::DisplayRole).toString ()), "IN"); QModelIndex ringoFbSubcircuit2Index = model->index (1, 0, ringoFbIndex); + EXPECT_EQ (model->parent (ringoFbSubcircuit2Index) == ringoFbIndex, true); EXPECT_EQ (model->hasChildren (ringoFbSubcircuit2Index), true); EXPECT_EQ (model->rowCount (ringoFbSubcircuit2Index), 5); @@ -132,30 +140,35 @@ TEST (1) EXPECT_EQ (tl::to_string (model->data (model->index (4, 0, ringoFbSubcircuit2Index), Qt::DisplayRole).toString ()), "$4"); QModelIndex ringoFbSubcircuit2InPinIndex = model->index (1, 0, ringoFbSubcircuit2Index); + EXPECT_EQ (model->parent (ringoFbSubcircuit2InPinIndex) == ringoFbSubcircuit2Index, true); EXPECT_EQ (model->hasChildren (ringoFbSubcircuit2InPinIndex), false); EXPECT_EQ (model->rowCount (ringoFbSubcircuit2InPinIndex), 0); // Subcircuit 1 of RINGO has 5 pins QModelIndex ringoSubcircuit1Index = model->index (12, 0, ringoIndex); + EXPECT_EQ (model->parent (ringoSubcircuit1Index) == ringoIndex, true); EXPECT_EQ (model->hasChildren (ringoSubcircuit1Index), true); EXPECT_EQ (model->rowCount (ringoSubcircuit1Index), 5); EXPECT_EQ (tl::to_string (model->data (model->index (2, 0, ringoSubcircuit1Index), Qt::DisplayRole).toString ()), "OUT"); QModelIndex ringoSubcircuit1OutPinIndex = model->index (2, 0, ringoSubcircuit1Index); + EXPECT_EQ (model->parent (ringoSubcircuit1OutPinIndex) == ringoSubcircuit1Index, true); EXPECT_EQ (model->hasChildren (ringoSubcircuit1OutPinIndex), false); EXPECT_EQ (model->rowCount (ringoSubcircuit1OutPinIndex), 0); // Device 1 of INV2 has 3 pins QModelIndex inv2Device1Index = model->index (10, 0, inv2Index); + EXPECT_EQ (model->parent (inv2Device1Index) == inv2Index, true); EXPECT_EQ (model->hasChildren (inv2Device1Index), true); EXPECT_EQ (model->rowCount (inv2Device1Index), 3); EXPECT_EQ (tl::to_string (model->data (model->index (1, 0, inv2Device1Index), Qt::DisplayRole).toString ()), "G"); QModelIndex inv2Device1GateIndex = model->index (1, 0, inv2Device1Index); + EXPECT_EQ (model->parent (inv2Device1GateIndex) == inv2Device1Index, true); EXPECT_EQ (model->hasChildren (inv2Device1GateIndex), false); EXPECT_EQ (model->rowCount (inv2Device1GateIndex), 0); }