Commit 7aeec1aa320b44c835a301fb79ca52174c3cc01e
1 parent
131e732d
--no commit message
Showing
12 changed files
with
194 additions
and
32 deletions
arith/Makefile
0 → 100644
arith/adder.c
0 → 100644
1 | +#include <stdio.h> | |
2 | +#include <string.h> | |
3 | +#include "auxiliar.h" | |
4 | + | |
5 | +int check_length(char **inputs, uint8_t num_inputs) | |
6 | +{ | |
7 | + int input_length = strlen(inputs[0]); | |
8 | + if((input_length != strlen(inputs[1])) || (strlen(inputs[2]) != 1)) | |
9 | + { | |
10 | + return -1; | |
11 | + } | |
12 | + return input_length; | |
13 | +} | |
14 | + | |
15 | +int main(int argc, char **argv) | |
16 | +{ | |
17 | + int i; | |
18 | + int pos; | |
19 | + if(argc != 2) | |
20 | + { | |
21 | + error(); | |
22 | + } | |
23 | + char *input = argv[1]; | |
24 | + if(!strcmp(input,"error")) | |
25 | + { | |
26 | + error(); | |
27 | + } | |
28 | + char **inputs = comma_separate(input); | |
29 | + if(inputs == NULL) | |
30 | + { | |
31 | + error(); | |
32 | + } | |
33 | + int num_inputs = num_occurrences(input,','); | |
34 | + if(num_inputs != 3) | |
35 | + { | |
36 | + error(); | |
37 | + } | |
38 | + int input_length = check_length(inputs,num_inputs); | |
39 | + if(input_length == -1) | |
40 | + { | |
41 | + error(); | |
42 | + } | |
43 | + int a,b,carry_in,c; | |
44 | + a = bin2dec(inputs[0]); | |
45 | + b = bin2dec(inputs[1]); | |
46 | + carry_in = bin2dec(inputs[2]); | |
47 | + c = a+b+carry_in; | |
48 | + char *result = dec2bin(c,input_length+1); | |
49 | + printf("%s,%c",result+1,result[0]); | |
50 | + free(result); | |
51 | + free_mem(inputs,num_inputs); | |
52 | + return 0; | |
53 | +} | ... | ... |
common/auxiliar.c
... | ... | @@ -4,7 +4,7 @@ char* substring(char *string, uint8_t start, uint8_t end) |
4 | 4 | { |
5 | 5 | uint8_t size = end - start; |
6 | 6 | char *substr; |
7 | - substr = (char*) malloc(sizeof(char)*size + 1); | |
7 | + substr = (char*) malloc(sizeof(char)*(size + 1)); | |
8 | 8 | memset(substr,0x00,size+1); |
9 | 9 | strncpy(substr,string+start,size); |
10 | 10 | return substr; |
... | ... | @@ -60,7 +60,7 @@ char** comma_separate(char *input) |
60 | 60 | return NULL; |
61 | 61 | } |
62 | 62 | char **inputs; |
63 | - inputs = malloc(sizeof(char*) * input_num); | |
63 | + inputs = malloc(sizeof(char*) * (input_num+1)); | |
64 | 64 | for(i = 0; i < input_num; i++) |
65 | 65 | { |
66 | 66 | next_pos += next_occurrence(input+pos,','); |
... | ... | @@ -128,14 +128,14 @@ int bin2dec(char *bin) |
128 | 128 | int num = 0; |
129 | 129 | int length = strlen(bin); |
130 | 130 | int pos = length - 1; |
131 | - char *aux = (char*) malloc(sizeof(char) * length); | |
131 | + char *aux = (char*) malloc(sizeof(char) * (length+1)); | |
132 | 132 | strcpy(aux,bin); |
133 | 133 | normalize(&aux,1); |
134 | 134 | for(i = 0; i < length; i++) |
135 | 135 | { |
136 | 136 | if(aux[pos--]) |
137 | 137 | { |
138 | - num += pow(2,i); | |
138 | + num += 0x1 << i; | |
139 | 139 | } |
140 | 140 | } |
141 | 141 | free(aux); |
... | ... | @@ -144,7 +144,7 @@ int bin2dec(char *bin) |
144 | 144 | |
145 | 145 | char* dec2bin(int dec, int length) |
146 | 146 | { |
147 | - char *bin = (char*) malloc(sizeof(char) * length + 1); | |
147 | + char *bin = (char*) malloc(sizeof(char) * (length + 1)); | |
148 | 148 | int pos = length-1; |
149 | 149 | int i; |
150 | 150 | for(i = 0; i < length; i++) |
... | ... | @@ -160,4 +160,28 @@ char* dec2bin(int dec, int length) |
160 | 160 | dec >>= 1; |
161 | 161 | } |
162 | 162 | return bin; |
163 | -} | |
164 | 163 | \ No newline at end of file |
164 | +} | |
165 | + | |
166 | + | |
167 | +void expand_input(char **input, int required_length) | |
168 | +{ | |
169 | + char *new_input = malloc(sizeof(char)*(required_length + 1)); | |
170 | + memset(new_input,'0',required_length+1); | |
171 | + int offset = required_length - strlen(*input); | |
172 | + strcpy(new_input + offset,*input); | |
173 | + free(*input); | |
174 | + *input = new_input; | |
175 | +} | |
176 | + | |
177 | +int str2int(char *string) | |
178 | +{ | |
179 | + int i; | |
180 | + int num = 0; | |
181 | + int mul = 1; | |
182 | + for(i = 0; i < strlen(string); i++) | |
183 | + { | |
184 | + num += mul*(string[i] - 48); | |
185 | + mul *= 10; | |
186 | + } | |
187 | + return num; | |
188 | +} | ... | ... |
common/auxiliar.h
... | ... | @@ -8,10 +8,12 @@ int next_occurrence(char *string, char character); |
8 | 8 | int num_occurrences(char *string, char character); |
9 | 9 | int last_occurrence(char *string, char character); |
10 | 10 | char** comma_separate(char *input); |
11 | +int str2int(char *string); | |
11 | 12 | |
12 | 13 | void error(); |
13 | 14 | void free_mem(char **inputs, int num_inputs); |
14 | 15 | |
15 | 16 | void normalize(char **inputs, int num_inputs); |
16 | 17 | int bin2dec(char *bin); |
17 | -char* dec2bin(int dec, int length); | |
18 | 18 | \ No newline at end of file |
19 | +char* dec2bin(int dec, int length); | |
20 | +void expand_input(char **input, int required_length); | ... | ... |
logic_gate/logic_gate.c
... | ... | @@ -21,8 +21,8 @@ char* or(char **inputs, int num_inputs, int input_length) |
21 | 21 | { |
22 | 22 | int i; |
23 | 23 | int j; |
24 | - char *result = malloc(sizeof(char) * input_length + 1); | |
25 | - memset(result, 0x00, input_length); | |
24 | + char *result = malloc(sizeof(char) * (input_length + 1)); | |
25 | + memset(result, 0x00, input_length+1); | |
26 | 26 | for(i = 0; i < input_length; i++) |
27 | 27 | { |
28 | 28 | for(j = 0; j < num_inputs; j++) |
... | ... | @@ -46,8 +46,8 @@ char* nor(char **inputs, int num_inputs, int input_length) |
46 | 46 | { |
47 | 47 | int i; |
48 | 48 | int j; |
49 | - char *result = malloc(sizeof(char) * input_length + 1); | |
50 | - memset(result, 0x00, input_length); | |
49 | + char *result = malloc(sizeof(char) * (input_length + 1)); | |
50 | + memset(result, 0x00, input_length+1); | |
51 | 51 | for(i = 0; i < input_length; i++) |
52 | 52 | { |
53 | 53 | for(j = 0; j < num_inputs; j++) |
... | ... | @@ -71,8 +71,8 @@ char* xor(char **inputs, int num_inputs, int input_length) |
71 | 71 | { |
72 | 72 | int i; |
73 | 73 | int j; |
74 | - char *result = malloc(sizeof(char) * input_length + 1); | |
75 | - memset(result, 0x00, input_length); | |
74 | + char *result = malloc(sizeof(char) * (input_length + 1)); | |
75 | + memset(result, 0x00, input_length+1); | |
76 | 76 | for(i = 0; i < input_length; i++) |
77 | 77 | { |
78 | 78 | for(j = 0; j < num_inputs; j++) |
... | ... | @@ -95,8 +95,8 @@ char* xnor(char **inputs, int num_inputs, int input_length) |
95 | 95 | { |
96 | 96 | int i; |
97 | 97 | int j; |
98 | - char *result = malloc(sizeof(char) * input_length + 1); | |
99 | - memset(result, 0x00, input_length); | |
98 | + char *result = malloc(sizeof(char) * (input_length + 1)); | |
99 | + memset(result, 0x00, input_length+1); | |
100 | 100 | for(i = 0; i < input_length; i++) |
101 | 101 | { |
102 | 102 | for(j = 0; j < num_inputs; j++) |
... | ... | @@ -119,8 +119,8 @@ char* and(char **inputs, int num_inputs, int input_length) |
119 | 119 | { |
120 | 120 | int i; |
121 | 121 | int j; |
122 | - char *result = malloc(sizeof(char) * input_length + 1); | |
123 | - memset(result, 0x01, input_length); | |
122 | + char *result = malloc(sizeof(char) * (input_length + 1)); | |
123 | + memset(result, 0x01, input_length+1); | |
124 | 124 | for(i = 0; i < input_length; i++) |
125 | 125 | { |
126 | 126 | for(j = 0; j < num_inputs; j++) |
... | ... | @@ -143,8 +143,8 @@ char* nand(char **inputs, int num_inputs, int input_length) |
143 | 143 | { |
144 | 144 | int i; |
145 | 145 | int j; |
146 | - char *result = malloc(sizeof(char) * input_length + 1); | |
147 | - memset(result, 0x01, input_length); | |
146 | + char *result = malloc(sizeof(char) * (input_length + 1)); | |
147 | + memset(result, 0x01, input_length+1); | |
148 | 148 | for(i = 0; i < input_length; i++) |
149 | 149 | { |
150 | 150 | for(j = 0; j < num_inputs; j++) |
... | ... | @@ -167,8 +167,8 @@ char* not(char **inputs, int num_inputs, int input_length) |
167 | 167 | { |
168 | 168 | int i; |
169 | 169 | int j; |
170 | - char *result = malloc(sizeof(char) * input_length + 1); | |
171 | - memset(result, 0x01, input_length); | |
170 | + char *result = malloc(sizeof(char) * (input_length + 1)); | |
171 | + memset(result, 0x01, input_length+1); | |
172 | 172 | for(i = 0; i < input_length; i++) |
173 | 173 | { |
174 | 174 | for(j = 0; j < num_inputs; j++) | ... | ... |
plexers/Makefile
1 | -TARGETS = multiplexor demultiplexor encoder decoder | |
1 | +TARGETS = multiplexor demultiplexor encoder decoder bit_selector | |
2 | 2 | |
3 | 3 | .PHONY: all clean |
4 | 4 | |
... | ... | @@ -8,12 +8,14 @@ clean: |
8 | 8 | rm -rf $(TARGETS) |
9 | 9 | |
10 | 10 | multiplexor: |
11 | - gcc -I../common/ ../common/auxiliar.c multiplexor.c -o multiplexor -lm | |
11 | + gcc -I../common/ ../common/auxiliar.c multiplexor.c -o multiplexor | |
12 | 12 | |
13 | 13 | demultiplexor: |
14 | - gcc -I../common/ ../common/auxiliar.c demultiplexor.c -o demultiplexor -lm | |
14 | + gcc -I../common/ ../common/auxiliar.c demultiplexor.c -o demultiplexor | |
15 | 15 | |
16 | 16 | encoder: |
17 | - gcc -I../common/ ../common/auxiliar.c encoder.c -o encoder -lm | |
17 | + gcc -I../common/ ../common/auxiliar.c encoder.c -o encoder | |
18 | 18 | decoder: |
19 | - gcc -I../common/ ../common/auxiliar.c decoder.c -o decoder -lm | |
19 | + gcc -I../common/ ../common/auxiliar.c decoder.c -o decoder | |
20 | +bit_selector: | |
21 | + gcc -I../common/ ../common/auxiliar.c bit_selector.c -o bit_selector | ... | ... |
plexers/bit_selector.c
0 → 100644
1 | +#include <stdio.h> | |
2 | +#include <string.h> | |
3 | +#include "auxiliar.h" | |
4 | +#include <math.h> | |
5 | + | |
6 | +int check_length(char **inputs, int num_inputs, int output_length) | |
7 | +{ | |
8 | + int input_length = strlen(inputs[0]); | |
9 | + int selector_length = strlen(inputs[1]); | |
10 | + int sel_combinations = 0x1 << selector_length; | |
11 | + int num_groups = ceil(((float)input_length)/output_length); | |
12 | + int required_combinations = 1; | |
13 | + int i = 0; | |
14 | + while(required_combinations < num_groups) | |
15 | + { | |
16 | + required_combinations = 0x1 << ++i; | |
17 | + } | |
18 | + if(sel_combinations < required_combinations) | |
19 | + { | |
20 | + return -1; | |
21 | + } | |
22 | + return required_combinations * output_length; | |
23 | +} | |
24 | + | |
25 | +int main(int argc, char **argv) | |
26 | +{ | |
27 | + int i; | |
28 | + int j; | |
29 | + if(argc != 3) | |
30 | + { | |
31 | + error(); | |
32 | + } | |
33 | + char *input = argv[1]; | |
34 | + int output_length = str2int(argv[2]); | |
35 | + if(!strcmp(input,"error")) | |
36 | + { | |
37 | + error(); | |
38 | + } | |
39 | + char **inputs = comma_separate(input); | |
40 | + if(inputs == NULL) | |
41 | + { | |
42 | + error(); | |
43 | + } | |
44 | + int num_inputs = num_occurrences(input,','); | |
45 | + if(num_inputs != 2) | |
46 | + { | |
47 | + error(); | |
48 | + } | |
49 | + int input_length = strlen(inputs[0]); | |
50 | + int required_length = check_length(inputs,num_inputs,output_length); | |
51 | + if(required_length == -1) | |
52 | + { | |
53 | + error(); | |
54 | + } | |
55 | + if(input_length != required_length) | |
56 | + { | |
57 | + expand_input(&inputs[0],required_length); | |
58 | + } | |
59 | + char *result = malloc(sizeof(char) * (output_length + 1)); | |
60 | + memset(result,0x00,output_length+1); | |
61 | + int selected = bin2dec(inputs[1]); | |
62 | + int pos = 0; | |
63 | + for(i = (selected+1)*(output_length)-1; i >= selected*output_length; i--) | |
64 | + { | |
65 | + result[pos++] = inputs[0][required_length-(i+1)]; | |
66 | + } | |
67 | + printf("%s",result); | |
68 | + free(result); | |
69 | + free_mem(inputs,num_inputs); | |
70 | + return 0; | |
71 | +} | |
72 | + | ... | ... |
plexers/decoder.c
plexers/demultiplexor.c
... | ... | @@ -28,7 +28,7 @@ int main(int argc, char **argv) |
28 | 28 | } |
29 | 29 | int input_length = strlen(inputs[0]); |
30 | 30 | int selected = bin2dec(inputs[1]); |
31 | - int num_outputs = pow(2,strlen(inputs[1])); | |
31 | + int num_outputs = 0x1 << strlen(inputs[1]); | |
32 | 32 | for(i = 0; i < num_outputs; i++) |
33 | 33 | { |
34 | 34 | if(i == selected) | ... | ... |
plexers/encoder.c
plexers/multiplexor.c