diff --git b/common/auxiliar.c a/common/auxiliar.c new file mode 100644 index 0000000..9adbb20 --- /dev/null +++ a/common/auxiliar.c @@ -0,0 +1,123 @@ +#include "auxiliar.h" + +char* substring(char *string, uint8_t start, uint8_t end) +{ + uint8_t size = end - start; + char *substr; + substr = (char*) malloc(sizeof(char)*size + 1); + memset(substr,0x00,size+1); + strncpy(substr,string+start,size); + return substr; +} + +int next_occurrence(char *string, char character) +{ + int i; + int pos = -1; + for(i = 0; i < strlen(string); i++) + { + if(string[i] == character) + { + pos = i; + break; + } + } + return pos; +} + +int num_occurrences(char *string, char character) +{ + int i; + int count = 0; + for(i = 0; i < strlen(string); i++) + { + if(string[i] == character) + { + count++; + } + } + if(!count) + { + return -1; + } + return count; +} + +void error() +{ + printf("error"); + exit(-1); +} + +char** comma_separate(char *input) +{ + int i; + int next_pos = 0; + int pos = 0; + int input_num = num_occurrences(input,','); + if(input_num <= 0) + { + return NULL; + } + char **inputs; + inputs = malloc(sizeof(char*) * input_num); + for(i = 0; i < input_num; i++) + { + next_pos += next_occurrence(input+pos,','); + if(next_pos == -1) + { + return NULL; + } + inputs[i] = substring(input,pos,next_pos); + next_pos++; + pos = next_pos; + } + return inputs; +} + +void free_mem(char **inputs, int num_inputs) +{ + int i; + for(i = 0; i < num_inputs; i++) + { + free(inputs[i]); + } + free(inputs); +} + +int last_occurrence(char *string, char character) +{ + int i; + int pos = -1; + for(i = 0; i < strlen(string); i++) + { + if(string[i] == character) + { + pos = i; + } + } + return pos; +} + +void normalize(char **inputs, int num_inputs) +{ + int i; + int j; + int length; + + for(i = 0; i < num_inputs; i++) + { + length = strlen(inputs[i]); + for(j = 0; j < length; j++) + { + if(inputs[i][j] == '0') + { + inputs[i][j] = 0; + } + else + { + inputs[i][j] = 1; + } + } + } +} \ No newline at end of file diff --git b/common/auxiliar.h a/common/auxiliar.h new file mode 100644 index 0000000..b3eb016 --- /dev/null +++ a/common/auxiliar.h @@ -0,0 +1,15 @@ +#include +#include +#include +#include + +char* substring(char *string, uint8_t start, uint8_t end); +int next_occurrence(char *string, char character); +int num_occurrences(char *string, char character); +int last_occurrence(char *string, char character); +char** comma_separate(char *input); + +void error(); +void free_mem(char **inputs, int num_inputs); + +void normalize(char **inputs, int num_inputs); diff --git b/examples/multiplexor2.sh a/examples/multiplexor2.sh new file mode 100755 index 0000000..977fddc --- /dev/null +++ a/examples/multiplexor2.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +INPUT="$1" +A=`echo "$INPUT" | cut -d',' -f 1` +B=`echo "$INPUT" | cut -d',' -f 2` +S=`echo "$INPUT" | cut -d',' -f 3` + +N1=`./not $S,` +N2=`./and $N1,$A,` +N3=`./and $S,$B,` +Z=`./or $N2,$N3,` + +echo $Z diff --git b/examples/multiplexor4.sh a/examples/multiplexor4.sh new file mode 100755 index 0000000..bfe2407 --- /dev/null +++ a/examples/multiplexor4.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +INPUT="$1" + +A=`echo "$INPUT" | cut -d',' -f 1` +B=`echo "$INPUT" | cut -d',' -f 2` +C=`echo "$INPUT" | cut -d',' -f 3` +D=`echo "$INPUT" | cut -d',' -f 4` +S=`echo "$INPUT" | cut -d',' -f 5` + +S1=`echo "$S" | cut -b1` +S2=`echo "$S" | cut -b2` + +N1=`./not $S1,` +N2=`./not $S2,` +N3=`./and $D,$S1,` +N4=`./and $C,$N1,` +N5=`./and $B,$S1,` +N6=`./and $A,$N1,` +N7=`./and $N3,$S2,` +N8=`./and $N4,$S2,` +N9=`./and $N5,$N2,` +N10=`./and $N6,$N2,` +N11=`./or $N7,$N8,` +N12=`./or $N9,$N10,` +Z=`./or $N11,$N12,` + +echo $Z diff --git b/logic_gate/Makefile a/logic_gate/Makefile new file mode 100644 index 0000000..22b7203 --- /dev/null +++ a/logic_gate/Makefile @@ -0,0 +1,21 @@ +SYMLINKS = or nor xor xnor not and nand +TARGETS = logic_gate + +.PHONY: all clean + +all: $(TARGETS) symlinks + +clean: + rm -rf $(TARGETS) $(SYMLINKS) + +symlinks: logic_gate + ln -s logic_gate or + ln -s logic_gate nor + ln -s logic_gate xor + ln -s logic_gate xnor + ln -s logic_gate not + ln -s logic_gate and + ln -s logic_gate nand + +logic_gate: + gcc -I../common/ ../common/auxiliar.c logic_gate.c -o logic_gate diff --git b/logic_gate/logic_gate.c a/logic_gate/logic_gate.c new file mode 100644 index 0000000..e9ef26b --- /dev/null +++ a/logic_gate/logic_gate.c @@ -0,0 +1,259 @@ +#include +#include +#include +#include "auxiliar.h" + +int check_length(char **inputs, uint8_t num_inputs) +{ + int i; + int length = strlen(inputs[0]); + for(i = 1; i < num_inputs; i++) + { + if(strlen(inputs[i]) != length) + { + return -1; + } + } + return length; +} + +char* or(char **inputs, int num_inputs, int input_length) +{ + int i; + int j; + char *result = malloc(sizeof(char) * input_length + 1); + memset(result, 0x00, input_length); + for(i = 0; i < input_length; i++) + { + for(j = 0; j < num_inputs; j++) + { + result[i] |= inputs[j][i]; + } + if(result[i]) + { + result[i] = '1'; + } + else + { + result[i] = '0'; + } + + } + return result; +} + +char* nor(char **inputs, int num_inputs, int input_length) +{ + int i; + int j; + char *result = malloc(sizeof(char) * input_length + 1); + memset(result, 0x00, input_length); + for(i = 0; i < input_length; i++) + { + for(j = 0; j < num_inputs; j++) + { + result[i] |= inputs[j][i]; + + } + if(result[i]) + { + result[i] = '0'; + } + else + { + result[i] = '1'; + } + } + return result; +} + +char* xor(char **inputs, int num_inputs, int input_length) +{ + int i; + int j; + char *result = malloc(sizeof(char) * input_length + 1); + memset(result, 0x00, input_length); + for(i = 0; i < input_length; i++) + { + for(j = 0; j < num_inputs; j++) + { + result[i] ^= inputs[j][i]; + } + if(result[i]) + { + result[i] = '1'; + } + else + { + result[i] = '0'; + } + } + return result; +} + +char* xnor(char **inputs, int num_inputs, int input_length) +{ + int i; + int j; + char *result = malloc(sizeof(char) * input_length + 1); + memset(result, 0x00, input_length); + for(i = 0; i < input_length; i++) + { + for(j = 0; j < num_inputs; j++) + { + result[i] ^= inputs[j][i]; + } + if(result[i]) + { + result[i] = '0'; + } + else + { + result[i] = '1'; + } + } + return result; +} + +char* and(char **inputs, int num_inputs, int input_length) +{ + int i; + int j; + char *result = malloc(sizeof(char) * input_length + 1); + memset(result, 0x01, input_length); + for(i = 0; i < input_length; i++) + { + for(j = 0; j < num_inputs; j++) + { + result[i] &= inputs[j][i]; + } + if(result[i]) + { + result[i] = '1'; + } + else + { + result[i] = '0'; + } + } + return result; +} + +char* nand(char **inputs, int num_inputs, int input_length) +{ + int i; + int j; + char *result = malloc(sizeof(char) * input_length + 1); + memset(result, 0x01, input_length); + for(i = 0; i < input_length; i++) + { + for(j = 0; j < num_inputs; j++) + { + result[i] &= inputs[j][i]; + } + if(result[i]) + { + result[i] = '0'; + } + else + { + result[i] = '1'; + } + } + return result; +} + +char* not(char **inputs, int num_inputs, int input_length) +{ + int i; + int j; + char *result = malloc(sizeof(char) * input_length + 1); + memset(result, 0x01, input_length); + for(i = 0; i < input_length; i++) + { + for(j = 0; j < num_inputs; j++) + { + result[i] = inputs[j][i]; + } + if(result[i]) + { + result[i] = '0'; + } + else + { + result[i] = '1'; + } + } + return result; +} + +int main(int argc, char **argv) +{ + if(argc != 2) + { + error(); + } + char *input = argv[1]; + if(!strcmp(input,"error")) + { + error(); + } + char **inputs = comma_separate(input); + if(inputs == NULL) + { + error(); + } + int num_inputs = num_occurrences(input,','); + int input_length = check_length(inputs,num_inputs); + if(input_length == -1) + { + error(); + } + normalize(inputs,num_inputs); + char *result; + char *command_name; + if(last_occurrence(argv[0],'/') == -1) + { + command_name = argv[0]; + } + else + { + command_name = substring(argv[0],last_occurrence(argv[0],'/')+1,strlen(argv[0])); + } + if(!strcmp(command_name,"or")) + { + result = or(inputs,num_inputs,input_length); + } + else if(!strcmp(command_name,"nor")) + { + result = nor(inputs,num_inputs,input_length); + } + else if(!strcmp(command_name,"xor")) + { + result = xor(inputs,num_inputs,input_length); + } + else if(!strcmp(command_name,"xnor")) + { + result = xnor(inputs,num_inputs,input_length); + } + else if(!strcmp(command_name,"and")) + { + result = and(inputs,num_inputs,input_length); + } + else if(!strcmp(command_name,"nand")) + { + result = nand(inputs,num_inputs,input_length); + } + else if(!strcmp(command_name,"not")) + { + result = not(inputs,num_inputs,input_length); + } + else + { + error(); + } + free_mem(inputs,num_inputs); + printf("%s",result); + free(result); + return 0; +} diff --git b/plexers/Makefile a/plexers/Makefile new file mode 100644 index 0000000..3229256 --- /dev/null +++ a/plexers/Makefile @@ -0,0 +1,11 @@ +TARGETS = multiplexor + +.PHONY: all clean + +all: $(TARGETS) + +clean: + rm -rf $(TARGETS) + +multiplexor: + gcc -I../common/ ../common/auxiliar.c multiplexor.c -o multiplexor -lm diff --git b/plexers/multiplexor a/plexers/multiplexor new file mode 100755 index 0000000..181bc09 --- /dev/null +++ a/plexers/multiplexor diff --git b/plexers/multiplexor.c a/plexers/multiplexor.c new file mode 100644 index 0000000..0d8dde0 --- /dev/null +++ a/plexers/multiplexor.c @@ -0,0 +1,83 @@ +#include +#include +#include "auxiliar.h" +#include + +int bin2dec(char *bin) +{ + int i; + int num = 0; + int length = strlen(bin); + int pos = length - 1; + char *aux = (char*) malloc(sizeof(char) * length); + strcpy(aux,bin); + normalize(&aux,1); + for(i = 0; i < length; i++) + { + if(aux[pos--]) + { + num += pow(2,i); + } + } + free(aux); + return num; +} + +int check_length(char **inputs, uint8_t num_inputs) +{ + int i; + int length = strlen(inputs[0]); + for(i = 1; i < num_inputs-1; i++) + { + if(strlen(inputs[i]) != length) + { + return -1; + } + } + int sel_length = strlen(inputs[num_inputs-1]); + if(pow(2,sel_length) < (num_inputs-1)) + { + return -1; + } + return length; +} + +int main(int argc, char **argv) +{ + int i; + if(argc != 2) + { + error(); + } + char *input = argv[1]; + if(!strcmp(input,"error")) + { + error(); + } + char **inputs = comma_separate(input); + if(inputs == NULL) + { + error(); + } + int num_inputs = num_occurrences(input,','); + int input_length = check_length(inputs,num_inputs); + if(input_length == -1) + { + error(); + } + int selected = bin2dec(inputs[num_inputs-1]); + if(selected >= (num_inputs-1)) + { + for(i = 0; i < input_length; i++) + { + printf("0"); + } + } + else + { + char *result = inputs[selected]; + printf("%s",result); + } + free_mem(inputs,num_inputs); + return 0; +} diff --git b/todo a/todo new file mode 100644 index 0000000..970a6f4 --- /dev/null +++ a/todo @@ -0,0 +1,29 @@ +demuxer +coder +decoder +bit selector + +adder +substractor +multiplier +divider +negator +comparator +shifter +bit adder +bit finder + +biestable t +biestable d +biestable jk +biestable sr +register +counter +shift register +ram +rom + + +7seg +tty +led