From: Lukáš Jiřiště Date: Fri, 20 Dec 2024 17:59:53 +0000 (+0100) Subject: Fix merge_nodes not transferring "gate mosfets" X-Git-Url: https://git.ljiriste.work/?a=commitdiff_plain;h=3fb0187dded9976906c133e0a9dca0bc828fbd42;p=FET_sim.git Fix merge_nodes not transferring "gate mosfets" 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. --- diff --git a/inc/FET_sim.h b/inc/FET_sim.h index 80d150c..f3d3351 100644 --- a/inc/FET_sim.h +++ b/inc/FET_sim.h @@ -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; diff --git a/src/build_helper.c b/src/build_helper.c index 112d18a..0c2377f 100644 --- a/src/build_helper.c +++ b/src/build_helper.c @@ -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));