Commit 8a0a82367b7ccddba59f6e54f277b2b5468bf674
0 parents
Initial import
Showing
10 changed files
with
582 additions
and
0 deletions
common/auxiliar.c
0 → 100644
1 | +++ a/common/auxiliar.c | ||
1 | +#include "auxiliar.h" | ||
2 | + | ||
3 | +char* substring(char *string, uint8_t start, uint8_t end) | ||
4 | +{ | ||
5 | + uint8_t size = end - start; | ||
6 | + char *substr; | ||
7 | + substr = (char*) malloc(sizeof(char)*size + 1); | ||
8 | + memset(substr,0x00,size+1); | ||
9 | + strncpy(substr,string+start,size); | ||
10 | + return substr; | ||
11 | +} | ||
12 | + | ||
13 | +int next_occurrence(char *string, char character) | ||
14 | +{ | ||
15 | + int i; | ||
16 | + int pos = -1; | ||
17 | + for(i = 0; i < strlen(string); i++) | ||
18 | + { | ||
19 | + if(string[i] == character) | ||
20 | + { | ||
21 | + pos = i; | ||
22 | + break; | ||
23 | + } | ||
24 | + } | ||
25 | + return pos; | ||
26 | +} | ||
27 | + | ||
28 | +int num_occurrences(char *string, char character) | ||
29 | +{ | ||
30 | + int i; | ||
31 | + int count = 0; | ||
32 | + for(i = 0; i < strlen(string); i++) | ||
33 | + { | ||
34 | + if(string[i] == character) | ||
35 | + { | ||
36 | + count++; | ||
37 | + } | ||
38 | + } | ||
39 | + if(!count) | ||
40 | + { | ||
41 | + return -1; | ||
42 | + } | ||
43 | + return count; | ||
44 | +} | ||
45 | + | ||
46 | +void error() | ||
47 | +{ | ||
48 | + printf("error"); | ||
49 | + exit(-1); | ||
50 | +} | ||
51 | + | ||
52 | +char** comma_separate(char *input) | ||
53 | +{ | ||
54 | + int i; | ||
55 | + int next_pos = 0; | ||
56 | + int pos = 0; | ||
57 | + int input_num = num_occurrences(input,','); | ||
58 | + if(input_num <= 0) | ||
59 | + { | ||
60 | + return NULL; | ||
61 | + } | ||
62 | + char **inputs; | ||
63 | + inputs = malloc(sizeof(char*) * input_num); | ||
64 | + for(i = 0; i < input_num; i++) | ||
65 | + { | ||
66 | + next_pos += next_occurrence(input+pos,','); | ||
67 | + if(next_pos == -1) | ||
68 | + { | ||
69 | + return NULL; | ||
70 | + } | ||
71 | + inputs[i] = substring(input,pos,next_pos); | ||
72 | + next_pos++; | ||
73 | + pos = next_pos; | ||
74 | + } | ||
75 | + return inputs; | ||
76 | +} | ||
77 | + | ||
78 | +void free_mem(char **inputs, int num_inputs) | ||
79 | +{ | ||
80 | + int i; | ||
81 | + for(i = 0; i < num_inputs; i++) | ||
82 | + { | ||
83 | + free(inputs[i]); | ||
84 | + } | ||
85 | + free(inputs); | ||
86 | +} | ||
87 | + | ||
88 | +int last_occurrence(char *string, char character) | ||
89 | +{ | ||
90 | + int i; | ||
91 | + int pos = -1; | ||
92 | + for(i = 0; i < strlen(string); i++) | ||
93 | + { | ||
94 | + if(string[i] == character) | ||
95 | + { | ||
96 | + pos = i; | ||
97 | + } | ||
98 | + } | ||
99 | + return pos; | ||
100 | +} | ||
101 | + | ||
102 | +void normalize(char **inputs, int num_inputs) | ||
103 | +{ | ||
104 | + int i; | ||
105 | + int j; | ||
106 | + int length; | ||
107 | + | ||
108 | + for(i = 0; i < num_inputs; i++) | ||
109 | + { | ||
110 | + length = strlen(inputs[i]); | ||
111 | + for(j = 0; j < length; j++) | ||
112 | + { | ||
113 | + if(inputs[i][j] == '0') | ||
114 | + { | ||
115 | + inputs[i][j] = 0; | ||
116 | + } | ||
117 | + else | ||
118 | + { | ||
119 | + inputs[i][j] = 1; | ||
120 | + } | ||
121 | + } | ||
122 | + } | ||
123 | +} | ||
0 | \ No newline at end of file | 124 | \ No newline at end of file |
common/auxiliar.h
0 → 100644
1 | +++ a/common/auxiliar.h | ||
1 | +#include <stdio.h> | ||
2 | +#include <string.h> | ||
3 | +#include <stdlib.h> | ||
4 | +#include <stdint.h> | ||
5 | + | ||
6 | +char* substring(char *string, uint8_t start, uint8_t end); | ||
7 | +int next_occurrence(char *string, char character); | ||
8 | +int num_occurrences(char *string, char character); | ||
9 | +int last_occurrence(char *string, char character); | ||
10 | +char** comma_separate(char *input); | ||
11 | + | ||
12 | +void error(); | ||
13 | +void free_mem(char **inputs, int num_inputs); | ||
14 | + | ||
15 | +void normalize(char **inputs, int num_inputs); |
examples/multiplexor2.sh
0 → 100755
examples/multiplexor4.sh
0 → 100755
1 | +++ a/examples/multiplexor4.sh | ||
1 | +#!/bin/bash | ||
2 | + | ||
3 | +INPUT="$1" | ||
4 | + | ||
5 | +A=`echo "$INPUT" | cut -d',' -f 1` | ||
6 | +B=`echo "$INPUT" | cut -d',' -f 2` | ||
7 | +C=`echo "$INPUT" | cut -d',' -f 3` | ||
8 | +D=`echo "$INPUT" | cut -d',' -f 4` | ||
9 | +S=`echo "$INPUT" | cut -d',' -f 5` | ||
10 | + | ||
11 | +S1=`echo "$S" | cut -b1` | ||
12 | +S2=`echo "$S" | cut -b2` | ||
13 | + | ||
14 | +N1=`./not $S1,` | ||
15 | +N2=`./not $S2,` | ||
16 | +N3=`./and $D,$S1,` | ||
17 | +N4=`./and $C,$N1,` | ||
18 | +N5=`./and $B,$S1,` | ||
19 | +N6=`./and $A,$N1,` | ||
20 | +N7=`./and $N3,$S2,` | ||
21 | +N8=`./and $N4,$S2,` | ||
22 | +N9=`./and $N5,$N2,` | ||
23 | +N10=`./and $N6,$N2,` | ||
24 | +N11=`./or $N7,$N8,` | ||
25 | +N12=`./or $N9,$N10,` | ||
26 | +Z=`./or $N11,$N12,` | ||
27 | + | ||
28 | +echo $Z |
logic_gate/Makefile
0 → 100644
1 | +++ a/logic_gate/Makefile | ||
1 | +SYMLINKS = or nor xor xnor not and nand | ||
2 | +TARGETS = logic_gate | ||
3 | + | ||
4 | +.PHONY: all clean | ||
5 | + | ||
6 | +all: $(TARGETS) symlinks | ||
7 | + | ||
8 | +clean: | ||
9 | + rm -rf $(TARGETS) $(SYMLINKS) | ||
10 | + | ||
11 | +symlinks: logic_gate | ||
12 | + ln -s logic_gate or | ||
13 | + ln -s logic_gate nor | ||
14 | + ln -s logic_gate xor | ||
15 | + ln -s logic_gate xnor | ||
16 | + ln -s logic_gate not | ||
17 | + ln -s logic_gate and | ||
18 | + ln -s logic_gate nand | ||
19 | + | ||
20 | +logic_gate: | ||
21 | + gcc -I../common/ ../common/auxiliar.c logic_gate.c -o logic_gate |
logic_gate/logic_gate.c
0 → 100644
1 | +++ a/logic_gate/logic_gate.c | ||
1 | +#include <stdio.h> | ||
2 | +#include <string.h> | ||
3 | +#include <stdint.h> | ||
4 | +#include "auxiliar.h" | ||
5 | + | ||
6 | +int check_length(char **inputs, uint8_t num_inputs) | ||
7 | +{ | ||
8 | + int i; | ||
9 | + int length = strlen(inputs[0]); | ||
10 | + for(i = 1; i < num_inputs; i++) | ||
11 | + { | ||
12 | + if(strlen(inputs[i]) != length) | ||
13 | + { | ||
14 | + return -1; | ||
15 | + } | ||
16 | + } | ||
17 | + return length; | ||
18 | +} | ||
19 | + | ||
20 | +char* or(char **inputs, int num_inputs, int input_length) | ||
21 | +{ | ||
22 | + int i; | ||
23 | + int j; | ||
24 | + char *result = malloc(sizeof(char) * input_length + 1); | ||
25 | + memset(result, 0x00, input_length); | ||
26 | + for(i = 0; i < input_length; i++) | ||
27 | + { | ||
28 | + for(j = 0; j < num_inputs; j++) | ||
29 | + { | ||
30 | + result[i] |= inputs[j][i]; | ||
31 | + } | ||
32 | + if(result[i]) | ||
33 | + { | ||
34 | + result[i] = '1'; | ||
35 | + } | ||
36 | + else | ||
37 | + { | ||
38 | + result[i] = '0'; | ||
39 | + } | ||
40 | + | ||
41 | + } | ||
42 | + return result; | ||
43 | +} | ||
44 | + | ||
45 | +char* nor(char **inputs, int num_inputs, int input_length) | ||
46 | +{ | ||
47 | + int i; | ||
48 | + int j; | ||
49 | + char *result = malloc(sizeof(char) * input_length + 1); | ||
50 | + memset(result, 0x00, input_length); | ||
51 | + for(i = 0; i < input_length; i++) | ||
52 | + { | ||
53 | + for(j = 0; j < num_inputs; j++) | ||
54 | + { | ||
55 | + result[i] |= inputs[j][i]; | ||
56 | + | ||
57 | + } | ||
58 | + if(result[i]) | ||
59 | + { | ||
60 | + result[i] = '0'; | ||
61 | + } | ||
62 | + else | ||
63 | + { | ||
64 | + result[i] = '1'; | ||
65 | + } | ||
66 | + } | ||
67 | + return result; | ||
68 | +} | ||
69 | + | ||
70 | +char* xor(char **inputs, int num_inputs, int input_length) | ||
71 | +{ | ||
72 | + int i; | ||
73 | + int j; | ||
74 | + char *result = malloc(sizeof(char) * input_length + 1); | ||
75 | + memset(result, 0x00, input_length); | ||
76 | + for(i = 0; i < input_length; i++) | ||
77 | + { | ||
78 | + for(j = 0; j < num_inputs; j++) | ||
79 | + { | ||
80 | + result[i] ^= inputs[j][i]; | ||
81 | + } | ||
82 | + if(result[i]) | ||
83 | + { | ||
84 | + result[i] = '1'; | ||
85 | + } | ||
86 | + else | ||
87 | + { | ||
88 | + result[i] = '0'; | ||
89 | + } | ||
90 | + } | ||
91 | + return result; | ||
92 | +} | ||
93 | + | ||
94 | +char* xnor(char **inputs, int num_inputs, int input_length) | ||
95 | +{ | ||
96 | + int i; | ||
97 | + int j; | ||
98 | + char *result = malloc(sizeof(char) * input_length + 1); | ||
99 | + memset(result, 0x00, input_length); | ||
100 | + for(i = 0; i < input_length; i++) | ||
101 | + { | ||
102 | + for(j = 0; j < num_inputs; j++) | ||
103 | + { | ||
104 | + result[i] ^= inputs[j][i]; | ||
105 | + } | ||
106 | + if(result[i]) | ||
107 | + { | ||
108 | + result[i] = '0'; | ||
109 | + } | ||
110 | + else | ||
111 | + { | ||
112 | + result[i] = '1'; | ||
113 | + } | ||
114 | + } | ||
115 | + return result; | ||
116 | +} | ||
117 | + | ||
118 | +char* and(char **inputs, int num_inputs, int input_length) | ||
119 | +{ | ||
120 | + int i; | ||
121 | + int j; | ||
122 | + char *result = malloc(sizeof(char) * input_length + 1); | ||
123 | + memset(result, 0x01, input_length); | ||
124 | + for(i = 0; i < input_length; i++) | ||
125 | + { | ||
126 | + for(j = 0; j < num_inputs; j++) | ||
127 | + { | ||
128 | + result[i] &= inputs[j][i]; | ||
129 | + } | ||
130 | + if(result[i]) | ||
131 | + { | ||
132 | + result[i] = '1'; | ||
133 | + } | ||
134 | + else | ||
135 | + { | ||
136 | + result[i] = '0'; | ||
137 | + } | ||
138 | + } | ||
139 | + return result; | ||
140 | +} | ||
141 | + | ||
142 | +char* nand(char **inputs, int num_inputs, int input_length) | ||
143 | +{ | ||
144 | + int i; | ||
145 | + int j; | ||
146 | + char *result = malloc(sizeof(char) * input_length + 1); | ||
147 | + memset(result, 0x01, input_length); | ||
148 | + for(i = 0; i < input_length; i++) | ||
149 | + { | ||
150 | + for(j = 0; j < num_inputs; j++) | ||
151 | + { | ||
152 | + result[i] &= inputs[j][i]; | ||
153 | + } | ||
154 | + if(result[i]) | ||
155 | + { | ||
156 | + result[i] = '0'; | ||
157 | + } | ||
158 | + else | ||
159 | + { | ||
160 | + result[i] = '1'; | ||
161 | + } | ||
162 | + } | ||
163 | + return result; | ||
164 | +} | ||
165 | + | ||
166 | +char* not(char **inputs, int num_inputs, int input_length) | ||
167 | +{ | ||
168 | + int i; | ||
169 | + int j; | ||
170 | + char *result = malloc(sizeof(char) * input_length + 1); | ||
171 | + memset(result, 0x01, input_length); | ||
172 | + for(i = 0; i < input_length; i++) | ||
173 | + { | ||
174 | + for(j = 0; j < num_inputs; j++) | ||
175 | + { | ||
176 | + result[i] = inputs[j][i]; | ||
177 | + } | ||
178 | + if(result[i]) | ||
179 | + { | ||
180 | + result[i] = '0'; | ||
181 | + } | ||
182 | + else | ||
183 | + { | ||
184 | + result[i] = '1'; | ||
185 | + } | ||
186 | + } | ||
187 | + return result; | ||
188 | +} | ||
189 | + | ||
190 | +int main(int argc, char **argv) | ||
191 | +{ | ||
192 | + if(argc != 2) | ||
193 | + { | ||
194 | + error(); | ||
195 | + } | ||
196 | + char *input = argv[1]; | ||
197 | + if(!strcmp(input,"error")) | ||
198 | + { | ||
199 | + error(); | ||
200 | + } | ||
201 | + char **inputs = comma_separate(input); | ||
202 | + if(inputs == NULL) | ||
203 | + { | ||
204 | + error(); | ||
205 | + } | ||
206 | + int num_inputs = num_occurrences(input,','); | ||
207 | + int input_length = check_length(inputs,num_inputs); | ||
208 | + if(input_length == -1) | ||
209 | + { | ||
210 | + error(); | ||
211 | + } | ||
212 | + normalize(inputs,num_inputs); | ||
213 | + char *result; | ||
214 | + char *command_name; | ||
215 | + if(last_occurrence(argv[0],'/') == -1) | ||
216 | + { | ||
217 | + command_name = argv[0]; | ||
218 | + } | ||
219 | + else | ||
220 | + { | ||
221 | + command_name = substring(argv[0],last_occurrence(argv[0],'/')+1,strlen(argv[0])); | ||
222 | + } | ||
223 | + if(!strcmp(command_name,"or")) | ||
224 | + { | ||
225 | + result = or(inputs,num_inputs,input_length); | ||
226 | + } | ||
227 | + else if(!strcmp(command_name,"nor")) | ||
228 | + { | ||
229 | + result = nor(inputs,num_inputs,input_length); | ||
230 | + } | ||
231 | + else if(!strcmp(command_name,"xor")) | ||
232 | + { | ||
233 | + result = xor(inputs,num_inputs,input_length); | ||
234 | + } | ||
235 | + else if(!strcmp(command_name,"xnor")) | ||
236 | + { | ||
237 | + result = xnor(inputs,num_inputs,input_length); | ||
238 | + } | ||
239 | + else if(!strcmp(command_name,"and")) | ||
240 | + { | ||
241 | + result = and(inputs,num_inputs,input_length); | ||
242 | + } | ||
243 | + else if(!strcmp(command_name,"nand")) | ||
244 | + { | ||
245 | + result = nand(inputs,num_inputs,input_length); | ||
246 | + } | ||
247 | + else if(!strcmp(command_name,"not")) | ||
248 | + { | ||
249 | + result = not(inputs,num_inputs,input_length); | ||
250 | + } | ||
251 | + else | ||
252 | + { | ||
253 | + error(); | ||
254 | + } | ||
255 | + free_mem(inputs,num_inputs); | ||
256 | + printf("%s",result); | ||
257 | + free(result); | ||
258 | + return 0; | ||
259 | +} |
plexers/Makefile
0 → 100644
plexers/multiplexor
0 → 100755
No preview for this file type
plexers/multiplexor.c
0 → 100644
1 | +++ a/plexers/multiplexor.c | ||
1 | +#include <stdio.h> | ||
2 | +#include <string.h> | ||
3 | +#include "auxiliar.h" | ||
4 | +#include <math.h> | ||
5 | + | ||
6 | +int bin2dec(char *bin) | ||
7 | +{ | ||
8 | + int i; | ||
9 | + int num = 0; | ||
10 | + int length = strlen(bin); | ||
11 | + int pos = length - 1; | ||
12 | + char *aux = (char*) malloc(sizeof(char) * length); | ||
13 | + strcpy(aux,bin); | ||
14 | + normalize(&aux,1); | ||
15 | + for(i = 0; i < length; i++) | ||
16 | + { | ||
17 | + if(aux[pos--]) | ||
18 | + { | ||
19 | + num += pow(2,i); | ||
20 | + } | ||
21 | + } | ||
22 | + free(aux); | ||
23 | + return num; | ||
24 | +} | ||
25 | + | ||
26 | +int check_length(char **inputs, uint8_t num_inputs) | ||
27 | +{ | ||
28 | + int i; | ||
29 | + int length = strlen(inputs[0]); | ||
30 | + for(i = 1; i < num_inputs-1; i++) | ||
31 | + { | ||
32 | + if(strlen(inputs[i]) != length) | ||
33 | + { | ||
34 | + return -1; | ||
35 | + } | ||
36 | + } | ||
37 | + int sel_length = strlen(inputs[num_inputs-1]); | ||
38 | + if(pow(2,sel_length) < (num_inputs-1)) | ||
39 | + { | ||
40 | + return -1; | ||
41 | + } | ||
42 | + return length; | ||
43 | +} | ||
44 | + | ||
45 | +int main(int argc, char **argv) | ||
46 | +{ | ||
47 | + int i; | ||
48 | + if(argc != 2) | ||
49 | + { | ||
50 | + error(); | ||
51 | + } | ||
52 | + char *input = argv[1]; | ||
53 | + if(!strcmp(input,"error")) | ||
54 | + { | ||
55 | + error(); | ||
56 | + } | ||
57 | + char **inputs = comma_separate(input); | ||
58 | + if(inputs == NULL) | ||
59 | + { | ||
60 | + error(); | ||
61 | + } | ||
62 | + int num_inputs = num_occurrences(input,','); | ||
63 | + int input_length = check_length(inputs,num_inputs); | ||
64 | + if(input_length == -1) | ||
65 | + { | ||
66 | + error(); | ||
67 | + } | ||
68 | + int selected = bin2dec(inputs[num_inputs-1]); | ||
69 | + if(selected >= (num_inputs-1)) | ||
70 | + { | ||
71 | + for(i = 0; i < input_length; i++) | ||
72 | + { | ||
73 | + printf("0"); | ||
74 | + } | ||
75 | + } | ||
76 | + else | ||
77 | + { | ||
78 | + char *result = inputs[selected]; | ||
79 | + printf("%s",result); | ||
80 | + } | ||
81 | + free_mem(inputs,num_inputs); | ||
82 | + return 0; | ||
83 | +} |
todo
0 → 100644
1 | +++ a/todo | ||
1 | +demuxer | ||
2 | +coder | ||
3 | +decoder | ||
4 | +bit selector | ||
5 | + | ||
6 | +adder | ||
7 | +substractor | ||
8 | +multiplier | ||
9 | +divider | ||
10 | +negator | ||
11 | +comparator | ||
12 | +shifter | ||
13 | +bit adder | ||
14 | +bit finder | ||
15 | + | ||
16 | +biestable t | ||
17 | +biestable d | ||
18 | +biestable jk | ||
19 | +biestable sr | ||
20 | +register | ||
21 | +counter | ||
22 | +shift register | ||
23 | +ram | ||
24 | +rom | ||
25 | + | ||
26 | + | ||
27 | +7seg | ||
28 | +tty | ||
29 | +led |