-Subproject commit 62f583c8ab43754b5265c708243f3f5353ebfa1e
+Subproject commit d0985dc4a6e2234daa57f638980ef3769c899767
gate,
} t_terminal;
+typedef enum e_type
+{
+ p = 'p',
+ n = 'n',
+} t_type;
+
+typedef unsigned long t_id;
+
typedef struct s_node
{
- size_t id;
+ t_id id;
int checked;
t_state state;
t_state set_state;
t_vec connected;
} t_node;
-typedef enum e_type
-{
- p = 'p',
- n = 'n',
-} t_type;
-
typedef struct s_mosfet
{
+ t_id id;
int is_opened;
t_type type;
t_node *gate;
WINDOW *border_win;
} t_windows;
-void add_node(t_vec *nodes, t_state set_state);
-void add_mosfet(t_vec *mosfets, t_type type);
-void bind_fet_node(t_mosfet *mosfet, t_node *node, t_terminal terminal);
-t_node *get_node_of_terminal(t_mosfet *mosfet, t_terminal terminal);
-int transfer_mosfet(t_mosfet *mosfet, t_node *from, t_node *to);
-int merge_nodes(t_node *node1, t_node *node2);
+t_node *add_node(t_vec *nodes, t_state set_state);
+t_mosfet *add_mosfet(t_vec *mosfets, t_type type);
+t_node *get_node_by_id(t_vec *nodes, t_id id);
+t_mosfet *get_mosfet_by_id(t_vec *mosfets, t_id id);
+void bind_fet_node(t_mosfet *mosfet, t_node *node, t_terminal terminal);
+t_node *get_node_of_terminal(t_mosfet *mosfet, t_terminal terminal);
+int transfer_mosfet(t_mosfet *mosfet, t_node *from, t_node *to);
+int merge_nodes(t_node *node1, t_node *node2);
-void free_node(void *node);
-int process_input(t_windows *windows, t_vec *nodes, t_vec *mosfets);
-int get_input(WINDOW *command_win, t_input *input);
+void free_node(void *node);
+int process_input(t_windows *windows, t_vec *nodes, t_vec *mosfets);
+int get_input(WINDOW *command_win, t_input *input);
const char *state_color_escape(t_state state);
-void draw_single(WINDOW *command_win, t_vec *mosfets, size_t i);
-
-void update_nodes(t_vec *nodes);
-int should_open(t_type type, t_state state);
-int sim_step(t_vec *nodes, t_vec *mosfets);
-
-void setup_terminal(t_windows *windows);
-void clean_terminal(t_windows *windows);
-void print_start(WINDOW *command_win);
-void command_not_found(WINDOW *command_win, const char *input);
-void print_help(WINDOW *command_win, t_command c);
-void print_index_error(WINDOW *command_win, size_t index, size_t size);
-
-int construct_input(t_input *input, char **split_inp);
-
-void init_colors(void);
-
-t_state simple_resolve_state(t_state s1, t_state s2);
-t_state resolve_state(t_vec *connected_nodes);
-void apply_state(t_state state, t_vec *connected_nodes);
-t_state reduce_state(t_state state);
-
-int c_addfet(WINDOW *command_win, t_input input, t_vec *mosfets);
-int c_addnode(WINDOW *command_win, t_input input, t_vec *nodes);
-int c_bind(t_input input, t_vec *nodes, t_vec *mosfets);
-int c_connect(t_input input, t_vec *nodes, t_vec *mosfets);
-int c_draw(WINDOW *command_win, t_input input, t_vec *mosfets);
-int c_help(WINDOW *command_win, t_input input);
-int c_next(t_input input, t_vec *nodes, t_vec *mosfets);
-int c_setnode(WINDOW *command_win, t_input input, t_vec *nodes);
-
-int schema_mode(WINDOW *schematics_win, t_vec *nodes, t_vec *mosfets);
+void draw_single(WINDOW *command_win, const t_mosfet *mosfet);
+
+void update_nodes(t_vec *nodes);
+int should_open(t_type type, t_state state);
+int sim_step(t_vec *nodes, t_vec *mosfets);
+
+void setup_terminal(t_windows *windows);
+void clean_terminal(t_windows *windows);
+void print_start(WINDOW *command_win);
+void command_not_found(WINDOW *command_win, const char *input);
+void print_help(WINDOW *command_win, t_command c);
+void print_node_id_error(WINDOW *command_win, t_id id);
+void print_mosfet_id_error(WINDOW *command_win, t_id id);
+
+int construct_input(t_input *input, char **split_inp);
+
+void init_colors(void);
+
+t_state simple_resolve_state(t_state s1, t_state s2);
+t_state resolve_state(t_vec *connected_nodes);
+void apply_state(t_state state, t_vec *connected_nodes);
+t_state reduce_state(t_state state);
+
+int c_addfet(WINDOW *command_win, t_input input, t_vec *mosfets);
+int c_addnode(WINDOW *command_win, t_input input, t_vec *nodes);
+int c_bind(WINDOW *command_win, t_input input, t_vec *nodes, t_vec *mosfets);
+int c_connect(WINDOW *command_win, t_input input, t_vec *nodes, t_vec *mosfets);
+int c_draw(WINDOW *command_win, t_input input, t_vec *mosfets);
+int c_help(WINDOW *command_win, t_input input);
+int c_next(t_input input, t_vec *nodes, t_vec *mosfets);
+int c_setnode(WINDOW *command_win, t_input input, t_vec *nodes);
+
+int schema_mode(WINDOW *schematics_win, t_vec *nodes, t_vec *mosfets);
#endif //FET_SIM_H
return (NULL);
}
+int mosfet_identity(const void *v_mosfet1, const void *v_mosfet2)
+{
+ const t_mosfet *mosfet1 = v_mosfet1;
+ const t_mosfet *mosfet2 = v_mosfet2;
+
+ return (mosfet1->id - mosfet2->id);
+}
+
+t_mosfet *get_mosfet_by_id(t_vec *mosfets, t_id id)
+{
+ t_mosfet wanted_dummy;
+
+ wanted_dummy.id = id;
+ return (ft_vec_find(mosfets, &wanted_dummy, mosfet_identity));
+}
+
+int node_identity(const void *v_node1, const void *v_node2)
+{
+ const t_node *node1 = v_node1;
+ const t_node *node2 = v_node2;
+
+ return (node1->id - node2->id);
+}
+
+t_node *get_node_by_id(t_vec *nodes, t_id id)
+{
+ t_node wanted_dummy;
+
+ wanted_dummy.id = id;
+ return (ft_vec_find(nodes, &wanted_dummy, node_identity));
+}
+
+int mosfet_identity_indirect(const void *v_mosfet1_ptr, const void *v_mosfet2_ptr)
+{
+ const t_mosfet *const *mosfet1 = v_mosfet1_ptr;
+ const t_mosfet *const *mosfet2 = v_mosfet2_ptr;
+
+ return (mosfet_identity(*mosfet1, *mosfet2));
+}
+
void bind_fet_node(t_mosfet *mosfet, t_node *node, t_terminal terminal)
{
t_node *old;
{
mosfet->gate = node;
}
- if (old && ft_vec_find_index(&old->connected, &mosfet, &index) == success)
+ if (old && ft_vec_find_index(&old->connected, &mosfet, &index, mosfet_identity_indirect) == success)
{
ft_vec_forget(&old->connected, index);
}
return ;
}
+static t_id get_new_id(void)
+{
+ static t_id id = 0;
+
+ return (id++);
+}
+
// memset is used to initialize struct padding
-void add_node(t_vec *nodes, t_state set_state)
+t_node *add_node(t_vec *nodes, t_state set_state)
{
t_node node;
- ft_memset(&node, 0, sizeof(node));
- node.id = nodes->size;
+ node.id = get_new_id();
node.checked = 0;
node.state = set_state;
node.set_state = set_state;
ft_vec_init(&node.connected, sizeof(t_mosfet *));
ft_vec_append(nodes, &node);
- return ;
+ return (ft_vec_access(nodes, nodes->size - 1));
}
-void add_mosfet(t_vec *mosfets, t_type type)
+t_mosfet *add_mosfet(t_vec *mosfets, t_type type)
{
t_mosfet mosfet;
+ mosfet.id = get_new_id();
mosfet.is_opened = 0;
mosfet.type = type;
mosfet.gate = NULL;
mosfet.drain = NULL;
mosfet.source = NULL;
ft_vec_append(mosfets, &mosfet);
- return ;
+ return (ft_vec_access(mosfets, mosfets->size - 1));
}
int c_addfet(WINDOW *command_win, t_input input, t_vec *mosfets)
{
- size_t i;
+ size_t num;
+ const t_mosfet *mosfet;
- if (input.argc == 1 && input.argv[0].type == type)
+ if (input.argc == 1)
{
- add_mosfet(mosfets, input.argv[0].val.type);
- wprintw(command_win, "Index of added FET:\n\t%lu ", mosfets->size - 1);
+ num = 1;
+ wprintw(command_win, "ID of added FET:\n\t");
}
- else if (input.argc == 2 && input.argv[0].type == type && input.argv[1].type == num)
+ else
{
- i = 0;
- wprintw(command_win, "Indeces of added FETs:\n\t");
- while (i < input.argv[1].val.num)
- {
- wprintw(command_win, "%lu ", mosfets->size);
- add_mosfet(mosfets, input.argv[0].val.type);
- ++i;
- }
+ num = input.argv[1].val.num;
+ wprintw(command_win, "IDs of added FETs:\n\t");
+ }
+ while (num > 0)
+ {
+ mosfet = add_mosfet(mosfets, input.argv[0].val.type);
+ if (!mosfet)
+ return (0);
+ wprintw(command_win, "%lu ", mosfet->id);
+ --num;
}
wprintw(command_win, "\n");
/*else
static int add_nodes(WINDOW *command_win, t_vec *nodes, size_t num, t_state state)
{
size_t i;
+ t_node *node;
+ if (num == 1)
+ wprintw(command_win, "ID of added node:\n\t");
+ else
+ wprintw(command_win, "IDs of added nodes:\n\t");
i = 0;
- wprintw(command_win, "Indexes of added nodes:\n\t");
while (i < num)
{
- wprintw(command_win, "%lu ", nodes->size);
- add_node(nodes, state);
+ node = add_node(nodes, state);
+ wprintw(command_win, "%lu ", node->id);
++i;
}
wprintw(command_win, "\n");
size_t new_nodes_num;
t_state set_state;
- /*if (input.argc > 2
- || (input.argc == 1
- && input.argv[0].type != num && input.argv[0].type != state)
- || (input.argc == 2
- && (input.argv[0].type != state || input.argv[1].type != num)))
- {
- print_wrong_usage(input);
- return (1);
- }*/
new_nodes_num = 1;
set_state = unknown;
if (input.argc == 1 && input.argv[0].type == state)
set_state = input.argv[0].val.state;
else if (input.argc == 1)
- new_nodes_num= input.argv[0].val.num;
+ new_nodes_num = input.argv[0].val.num;
else if (input.argc == 2)
{
set_state = input.argv[0].val.state;
#include "FET_sim.h"
#include "libft.h"
+#include <ncurses.h>
-int c_bind(t_input input, t_vec *nodes, t_vec *mosfets)
+int c_bind(WINDOW *command_win, t_input input, t_vec *nodes, t_vec *mosfets)
{
t_node *node;
t_mosfet *mosfet;
print_wrong_usage(input);
return (1);
}*/
- node = ft_vec_access(nodes, input.argv[0].val.num);
- mosfet = ft_vec_access(mosfets, input.argv[1].val.num);
+ node = get_node_by_id(nodes, input.argv[0].val.num);
+ if (!node)
+ {
+ print_node_id_error(command_win, input.argv[0].val.num);
+ return (1);
+ }
+ mosfet = get_mosfet_by_id(mosfets, input.argv[1].val.num);
+ if (!mosfet)
+ {
+ print_mosfet_id_error(command_win, input.argv[1].val.num);
+ return (1);
+ }
term = input.argv[2].val.terminal;
bind_fet_node(mosfet, node, term);
return (1);
#include "FET_sim.h"
#include "libft.h"
-int c_connect(t_input input, t_vec *nodes, t_vec *mosfets)
+int c_connect(WINDOW *command_win, t_input input, t_vec *nodes, t_vec *mosfets)
{
t_mosfet *mosfet1;
t_node *term_node1;
t_node *term_node2;
t_node *new_node;
- mosfet1 = ft_vec_access(mosfets, input.argv[0].val.num);
+ mosfet1 = get_mosfet_by_id(mosfets, input.argv[0].val.num);
+ if (!mosfet1)
+ {
+ print_mosfet_id_error(command_win, input.argv[0].val.num);
+ return (1);
+ }
term_node1 = get_node_of_terminal(mosfet1, input.argv[1].val.terminal);
- mosfet2 = ft_vec_access(mosfets, input.argv[2].val.num);
+ mosfet2 = get_mosfet_by_id(mosfets, input.argv[2].val.num);
+ if (!mosfet2)
+ {
+ print_mosfet_id_error(command_win, input.argv[2].val.num);
+ return (1);
+ }
term_node2 = get_node_of_terminal(mosfet2, input.argv[3].val.terminal);
if (term_node1 && term_node2)
return (!merge_nodes(term_node1, term_node2));
bind_fet_node(mosfet1, term_node2, input.argv[1].val.terminal);
else
{
- add_node(nodes, unknown);
- new_node = ft_vec_access(nodes, nodes->size - 1);
+ new_node = add_node(nodes, unknown);
bind_fet_node(mosfet1, new_node, input.argv[1].val.terminal);
bind_fet_node(mosfet2, new_node, input.argv[3].val.terminal);
}
int c_draw(WINDOW *command_win, t_input input, t_vec *mosfets)
{
- size_t i;
+ size_t i;
+ const t_mosfet *mosfet;
if (input.argc == 0)
{
i = 0;
while (i < mosfets->size)
{
- draw_single(command_win, mosfets, i);
+ mosfet = ft_vec_caccess(mosfets, i);
+ draw_single(command_win, ft_vec_caccess(mosfets, i));
++i;
}
}
else if (input.argc == 1 && input.argv[0].type == num)
{
- draw_single(command_win, mosfets, input.argv[0].val.num);
+ mosfet = get_mosfet_by_id(mosfets, input.argv[0].val.num);
+ if (!mosfet)
+ print_mosfet_id_error(command_win, input.argv[0].val.num);
+ else
+ draw_single(command_win, mosfet);
}
/*else
{
print_wrong_usage(input);
return (1);
}*/
- node = ft_vec_access(nodes, input.argv[0].val.num);
+ node = get_node_by_id(nodes, input.argv[0].val.num);
if (!node)
{
- print_index_error(command_win, input.argv[0].val.num, nodes->size);
+ print_node_id_error(command_win, input.argv[0].val.num);
return (1);
}
node->set_state = input.argv[1].val.state;
return ;
}
-static void draw_top(WINDOW *command_win, t_mosfet *mosfet)
+static void draw_top(WINDOW *command_win, const t_mosfet *mosfet)
{
if (mosfet->source)
{
return ;
}
-static void draw_switch(WINDOW *command_win, t_mosfet *mosfet)
+static void draw_switch(WINDOW *command_win, const t_mosfet *mosfet)
{
t_nc_color color;
return ;
}
-static void draw_middle(WINDOW *command_win, t_mosfet *mosfet)
+static void draw_middle(WINDOW *command_win, const t_mosfet *mosfet)
{
if (mosfet->gate)
{
return ;
}
-static void draw_bottom(WINDOW *command_win, t_mosfet *mosfet)
+static void draw_bottom(WINDOW *command_win, const t_mosfet *mosfet)
{
wprintw(command_win, " ");
if (mosfet->drain)
return ;
}
-void draw_single(WINDOW *command_win, t_vec *mosfets, size_t i)
+void draw_single(WINDOW *command_win, const t_mosfet *mosfet)
{
- t_mosfet *mosfet;
-
- mosfet = ft_vec_access(mosfets, i);
draw_top(command_win, mosfet);
draw_middle(command_win, mosfet);
draw_bottom(command_win, mosfet);
+ return ;
}
else if (input.command == addfet)
res = c_addfet(windows->command_win, input, mosfets);
else if (input.command == bind)
- res = c_bind(input, nodes, mosfets);
+ res = c_bind(windows->command_win, input, nodes, mosfets);
else if (input.command == connect)
- res = c_connect(input, nodes, mosfets);
+ res = c_connect(windows->command_win, input, nodes, mosfets);
else if (input.command == help)
res = c_help(windows->command_win, input);
else if (input.command == switch_to_schema)
return ;
}
-void print_index_error(WINDOW *command_win, size_t index, size_t size)
+void print_node_id_error(WINDOW *command_win, t_id id)
{
- if (size > 0)
- {
- wprintw(command_win, "This action is invalid as given index %lu "
- "is larger then the highest index present %lu.\n",
- index, size - 1);
- }
- else
- {
- wprintw(command_win, "This action is invalid as there is no element yet.\n");
- }
+ wprintw(command_win, "The provided index %lu does not refer to a node.\n", id);
+ return ;
+}
+
+void print_mosfet_id_error(WINDOW *command_win, t_id id)
+{
+ wprintw(command_win, "The provided index %lu does not refer to a mosfet.\n", id);
return ;
}