Bugfix: removing a pin from a Circuit does not crash if the pin was not disconnected before. Now it's disconnected automatically.

This commit is contained in:
Matthias Koefferlein 2026-07-12 00:14:30 +02:00
parent 8eaf5638f8
commit abe9479ced
2 changed files with 20 additions and 0 deletions

View File

@ -353,6 +353,7 @@ Pin &Circuit::add_pin (const std::string &name)
void Circuit::remove_pin (size_t id)
{
if (id < m_pin_by_id.size () && ! tl::is_null_iterator (m_pin_by_id [id])) {
connect_pin (id, 0);
m_pins.erase (m_pin_by_id [id]);
m_pin_by_id [id] = pin_list::iterator ();
}

View File

@ -213,6 +213,15 @@ class DBNetlist_TestClass < TestBase
assert_equal(p1.name, "X")
assert_equal(p2.name, "B")
n1 = c.create_net("NET1")
n2 = c.create_net("NET2")
c.connect_pin(p1.id, n1)
assert_equal(n1.pin_count, 1)
c.connect_pin(p2.id, n2)
assert_equal(n2.pin_count, 1)
assert_equal(p1.property(17), nil)
p1.set_property(17, 42)
assert_equal(p1.property(17), 42)
@ -245,6 +254,9 @@ class DBNetlist_TestClass < TestBase
c.remove_pin(0)
assert_equal(n1.pin_count, 0)
assert_equal(n2.pin_count, 1)
names = []
c.each_pin { |p| names << p.name }
assert_equal(names, [ "B" ])
@ -253,6 +265,13 @@ class DBNetlist_TestClass < TestBase
assert_equal(c.pin_by_id(1) == nil, false)
assert_equal(c.pin_by_id(1).name, "B")
c.remove_pin(1)
assert_equal(n1.pin_count, 0)
assert_equal(n2.pin_count, 0)
assert_equal(c.pin_by_id(1) == nil, true)
end
def test_4_Device