Fix merge_nodes not transferring "gate mosfets"
authorLukáš Jiřiště <gymnazium.jiriste@gmail.com>
Fri, 20 Dec 2024 17:59:53 +0000 (18:59 +0100)
committerLukáš Jiřiště <gymnazium.jiriste@gmail.com>
Fri, 20 Dec 2024 17:59:53 +0000 (18:59 +0100)
Because mosfets were not listed in their gate nodes, they were bot
transferred during node merge.
This is fixed by adding a vector to node, that saves all mosfets
connected through gate.
The connected vector of node was not used, as the "gate mosfets" would
have to be filtered in simulation.

inc/FET_sim.h
src/build_helper.c

index 80d150ca02d7c564cf9ba7da14b9ee810bdb9838..f3d33510423c462769c7da00da7f131dca43f439 100644 (file)
@@ -63,6 +63,7 @@ typedef struct s_node
        t_state state;
        t_state set_state;
        t_vec   connected;
+       t_vec   connected_gates;
        t_vec   segments;
 }                      t_node;
 
index 112d18a9811aa61b4423f704efbefb94db3f3a0d..0c2377fd8ed03c4868d456cc6a231d78210a8ad3 100644 (file)
@@ -27,6 +27,13 @@ int  merge_nodes(t_node *node1, t_node *node2)
                ++i;
        }
        i = 0;
+       while (i < node2->connected_gates.size)
+       {
+               mosfet = ft_vec_access(&node2->connected_gates, i);
+               transfer_mosfet(*mosfet, node2, node1);
+               ++i;
+       }
+       i = 0;
        while (i < node2->segments.size)
        {
                seg = ft_vec_access(&node2->segments, i);
@@ -99,20 +106,24 @@ void       bind_fet_node(t_mosfet *mosfet, t_node *node, t_terminal terminal)
                old = mosfet->source;
                mosfet->source = node;
                ft_vec_append(&node->connected, &mosfet);
+               if (old && ft_vec_find_index(&node->connected, &mosfet, &index, mosfet_identity_indirect) == success)
+                       ft_vec_forget(&old->connected, index);
        }
        else if (terminal == drain)
        {
                old = mosfet->drain;
                mosfet->drain = node;
                ft_vec_append(&node->connected, &mosfet);
+               if (old && ft_vec_find_index(&node->connected, &mosfet, &index, mosfet_identity_indirect) == success)
+                       ft_vec_forget(&old->connected, index);
        }
        else
        {
+               old = mosfet->gate;
                mosfet->gate = node;
-       }
-       if (old && ft_vec_find_index(&old->connected, &mosfet, &index, mosfet_identity_indirect) == success)
-       {
-               ft_vec_forget(&old->connected, index);
+               ft_vec_append(&node->connected_gates, &mosfet);
+               if (old && ft_vec_find_index(&node->connected_gates, &mosfet, &index, mosfet_identity_indirect) == success)
+                       ft_vec_forget(&old->connected_gates, index);
        }
        return ;
 }
@@ -134,6 +145,7 @@ t_node      *add_node(t_vec *nodes, t_state set_state)
        node.state = set_state;
        node.set_state = set_state;
        ft_vec_init(&node.connected, sizeof(t_mosfet *));
+       ft_vec_init(&node.connected_gates, sizeof(t_mosfet *));
        ft_vec_init(&node.segments, sizeof(t_node_segment));
        ft_vec_append(nodes, &node);
        return (ft_vec_access(nodes, nodes->size - 1));