//mult.h const NUMBER_OF_BITS = 5; const int MAX_FAN_IN = 22; const int MAX_FAN_OUT = 22; const int N_LEVEL1 = 9; const int N_LEVEL2 = 11; const int N_LEVEL3 = 13; ///////////////////////////////////////////////////////////////////// //Input/Output Pins structures and functions //////////////////////////////////////////////////////////////////// struct input_pin_struct { bool is_value; union { int value; struct output_pin_struct *from; }union_field; }; struct output_pin_node { struct input_pin_struct *to_inpin; struct output_pin_node *next; }; struct output_pin_struct { bool valid; int value; struct output_pin_node *to_inpin; }; void set_inpin_value(struct input_pin_struct *inpin, int value); void connect_pin(struct output_pin_struct *outpin, struct input_pin_struct *inpin); //////////////////////////////////////////////////////////////// //Threshold structure and functions //////////////////////////////////////////////////////////////// struct threshold_struct { int num_input; int k; int weight[MAX_FAN_IN]; struct input_pin_struct inpins[MAX_FAN_IN]; struct output_pin_struct outpins; }; // This structure is for evaluating the multiplication circuit // When a threshold gate is generated, a eval_node is created // and is linked to head list. struct eval_node { struct threshold_struct *item; bool valid; int value; struct eval_node *next; } *head = NULL; void construct_threshold(struct threshold_struct *t, int n, int k); void change_threshold_weights(struct threshold_struct *t, int weight[]); bool evaluate_threshold(struct threshold_struct *t, int *result); ////////////////////////////////////////////////////////////////// //Black box structure and functions //A black box is a virtual box, which is made from inpins, //outpins. BCOUNT,AND,OR gates can be seen as a constructed //black box, each one has its own threshold circuits. //Multiplication circuit is made from four levels black boxes, //each level has diffrent number of black boxes. ///////////////////////////////////////////////////////////////// struct blkbox_inpin_node { struct input_pin_struct *pin; struct blkbox_inpin_node *next; }; struct blkbox_struct { int num_input; int num_output; struct blkbox_inpin_node *intable[MAX_FAN_IN]; struct output_pin_struct *outtable[MAX_FAN_OUT]; } level0_boxes[NUMBER_OF_BITS][NUMBER_OF_BITS], level1_boxes[N_LEVEL1], level2_boxes[N_LEVEL2], level3_box; void connect_blkbox(struct output_pin_struct *opin, struct blkbox_inpin_node *bbpin); void set_blkbox_inpin_value(struct blkbox_inpin_node *inpin, int value); bool get_blkbox_outpin_value(struct output_pin_struct *outpin, int *value); ///////////////////////////////////////////////////////////////// //Construct AND, OR, BCNT gates //Each construct function can be seen as a "fill" black box //procedure. ///////////////////////////////////////////////////////////////// void set_and_gate(struct blkbox_struct *pand, int num_input); void set_or_gate(struct blkbox_struct *por, int num_input); void set_bcnt5_gate(struct blkbox_struct *pbcnt); void set_bcnt3_gate(struct blkbox_struct *pbcnt); ///////////////////////////////////////////////////////////////// //Implementaion of adding two numbers. ///////////////////////////////////////////////////////////////// void set_fast_adder(struct blkbox_struct *padder); ///////////////////////////////////////////////////////////////// //Construct and evaluate multiplication circuit ///////////////////////////////////////////////////////////////// int mult1[NUMBER_OF_BITS], mult2[NUMBER_OF_BITS]; void set_values_level0(); void init_level0(); void init_level1(); void init_level2(); void init_level3(); //evaluate multiplication circuit void evaluate_mult_circuit(); //Reset multiplication circuit for next calculation to //avoid realocating the whole circuit. void reset_mult_circuit(); /////////////////////////////////////////////////////////////// //for main() /////////////////////////////////////////////////////////////// void init_input(); void print_result(); int menu();