Você está na página 1de 6

UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE

CENTRO DE TECNOLOGIA
DEPARTAMENTO DE ENGENHARIA DE COMPUTAÇÃO E AUTOMAÇÃO

SIMULADOR DE CIRCUITOS DIGITAIS


PROFESSOR: ADELARDO ADELINO DANTAS DE MEDEIROS

O objetivo é desenvolver em C++ um simulador  Para cada uma das portas lógicas:
de circuitos lógicos, composto por portas lógi- o O tipo de porta (AND, NOT, etc.).
cas de 2 ou mais entradas (ou de uma entrada, o O nº de entradas da porta (exceto NOT).
no caso da NOT) dos seguintes tipos: o Para cada entrada da porta:
 NOT (NEGAÇÃO)  A origem do sinal lógico: uma porta
 AND (E), NAND (NOT AND) ou uma das entradas do circuito.
 OR (OU), NOR (NOT OR)  Para cada uma das saídas do circuito:
 XOR (OU EXCLUSIVO), NXOR (NOT XOR) o A origem do sinal lógico: uma porta ou
uma das entradas do circuito.
As entradas e saídas do circuito e das portas
devem lidar com sinais lógicos verdadeiros (T - Tendo em vista que um dos objetivos principais
TRUE), falsos (F - FALSE) ou indefinidos (? - do projeto é praticar a utilização do polimor-
UNDEF), realizando as operações lógicas bási- fismo baseado em métodos virtuais, além de
cas (AND, OR e NOT) das seguintes maneiras: utilizar regras de boa programação, algumas
regras devem ser obrigatoriamente seguidas:
A B A AND B A B A OR B  O aplicativo deve ser programado basean-
? ? ? ? ? ? do-se em objetos polimórficos para mode-
? F F ? F ? lagem das portas lógicas. Ou seja, não deve
? T ? ? T T haver instruções de controle de fluxo (if,
F ? F F ? ? switch, ternários, etc.) que mudem a
F F F F F F forma de execução de acordo com o tipo
F T F F T T da porta (OR, NOT, NAND, etc.), exceto no
T ? ? T ? T tratamento imediatamente seguinte à lei-
T F F T F T tura (do arquivo ou da interface) do tipo de
T T T T T T porta a ser incluído no circuito.
 As classes que representam as portas lógi-
cas e o simulador de circuitos devem se
A B A XOR B A NOT A
basear e utilizar o tipo bool3S fornecido,
? ? ? ? ?
sem modificá-lo ou ignorá-lo.
? F ? F T
 O programa deve se basear na implemen-
? T ? T F
tação parcial fornecida das classes das por-
F ? ?
tas e da classe Circuito, sem modificar
F F F
suas declarações. Além das funcionalidades
F T T já concluídas, devem ser desenvolvidos ou
T ? ? completados todos os métodos previstos
T F T na implementação parcial, incluindo:
T T F o Construtores, destrutores e sobrecarga
de operadores.
A simulação deve ser capaz de lidar com circui- o Definição de novo circuito pelo console
tos contendo ciclos, calculando as saídas ou (digitar), mesmo que na versão final
informando que uma ou mais saídas ficam a interface seja visual.
UNDEF quando não for possível a sua determi- o Leitura de circuito de arquivo (ler).
nação (TRUE ou FALSE). o Impressão em stream (imprimir).
o Salvamento em arquivo (salvar), uti-
Os dados de entrada a serem fornecidos pelo lizando o método imprimir.
usuário, via interface ou arquivo, são: o Geração das saídas para uma dada
 Número de entradas e saídas do circuito. combinação das entradas (simular).
 Número de portas lógicas do circuito.
UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE
CENTRO DE TECNOLOGIA
DEPARTAMENTO DE ENGENHARIA DE COMPUTAÇÃO E AUTOMAÇÃO

ARQUIVO

Os arquivos de leitura e escrita dos circuitos  id_out: identificador da saída


devem seguir um padrão, de tal forma que (1 ≤ id_out ≤ Nout)
possam ser reconhecidos pelos programas de  id_orig_out: identificador da origem do
outros alunos. O formato que deve ser seguido sinal lógico da saída do circuito:
ao salvar1 um arquivo é o seguinte: o > 0 se o sinal vem da saída de uma por-
ta (1 ≤ id_orig_out ≤Nportas)
CIRCUITO Nin Nout Nportas o < 0 se o sinal vem de uma entrada do
PORTAS
circuito (-1 ≥ id_orig_out ≥ - Nin)
id_port) type n_in: id_orig_in1 … id_orig_inn_in
...
As portas e saídas devem estar ordenadas no
id_port) type n_in: id_orig_in1 … id_orig_inn_in
arquivo, de modo que as linhas corresponden-
SAIDAS
tes à primeira porta e à primeira saída no ar-
id_out) id_orig_out
quivo devem ter id_port e id_out iguais a 1; as
...
últimas devem ter id_port e id_out iguais a
id_out) id_orig_out
Nportas e Nout, respectivamente.
Os trechos em negrito devem estar presen-
Durante a leitura, o arquivo de descrição de
tes no arquivo salvo. Os trechos em itálico cor-
circuito deve ser verificado quanto à existência
respondem aos locais onde serão salvos no
dos campos obrigatórios e da validade dos
arquivo os valores correspondentes ao circuito.
valores. Não precisa nem deve ser verificada o
O significado dos valores é o seguinte:
tipo e quantidade dos separadores entre cam-
 Nin: número de entradas do circuito
pos (espaços, quebras de linha, etc.), embora
 Nout: número de saídas do circuito
deva ser verificada a existência de “)” após os
 Nportas; número de portas do circuito
identificadores de portas e de saídas e de “:”
 id_port: identificador da porta após o número de entradas de portas, com ou
(1 ≤ id_port ≤ Nportas) sem separadores antes ou depois deles. Caso
 type: tipo da porta: haja alguma incoerência nos dados (campos
o NT = porta NOT obrigatórios faltando, referência a uma id ine-
o AN = porta AND xistente, etc.), o arquivo não deverá ser lido.
o NA = porta NAND
o OR = porta OR DICA: Não complique a implementação do
o NO = porta NOR método de leitura, pois o operator>> já lida
o XO = porta XOR com informações separadas por quantidades e
o NX = porta NXOR tipos arbitrários de separadores (espaço,
 n_in: número de entradas da porta lógica ENTER, TAB), além de ser capaz de ler strings
(1 para NOT; 2 ou mais para as outras). sem espaços, como as do arquivo. Não há ne-
 id_orig_ini: identificador da origem do sinal cessidade de usar getline, ignore, ws ou
lógico da i-ésima entrada da porta (compa- nenhuma função mais avançada de leitura de
tível com o número de entradas n_in). dados. Basta ler os valores sucessivos com
o > 0 se o sinal vem da saída de uma por- operator>> e descartar o arquivo caso algum
ta (1 ≤ id_orig_in ≤Nportas) valor lido seja inválido. O eventual conteúdo
o < 0 se o sinal vem de uma entrada do excedente no final do arquivo (valores e/ou
circuito (-1 ≥ id_orig_in ≥ - Nin) linhas a mais) será ignorado. Informação exce-
dente em uma linha (por exemplo, uma
id_orig_in de entrada a mais do que o que de-
1
veria existir em uma porta) será lida como se
Em leitura, admitem-se arquivos que não sigam fosse a informação seguinte, não passará na
exatamente esse formato, conforme detalhado próxima validação (valor incorreto) e o arquivo
mais à frente, desde que as informações necessá-
será rejeitado.
rias estejam presentes, válidas e na ordem correta.
UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE
CENTRO DE TECNOLOGIA
DEPARTAMENTO DE ENGENHARIA DE COMPUTAÇÃO E AUTOMAÇÃO

EXEMPLOS DE ARQUIVOS

CIRCUITO 3 3 6
PORTAS
1) OR 3: 5 -2 3
2) XO 2: 5 3
3) NA 2: -2 -3
4) NT 1: -2
5) AN 2: -1 4
6) NO 2: 2 3
SAIDAS
1) 2
2) 1
3) 6

Exemplos de arquivos válidos em leitura (o Exemplos de arquivos inválidos em leitura


primeiro exemplo também é válido em escrita) e em escrita
CIRCUITO 2 1 3 CIRCUITO 2 1 3 Circuito 2 1 3 CIRCUITO 2 2 3
PORTAS PORTAS 1) OR 2: PORTS PORTAS
1) OR 2: -1 -2 -1 -2 2) NT 1: -2 1) OR 2: -1 -2 1) OR 2: -1 -2
2) NT 1: -2 3) AN 2: 1 2) NT 1: -2 2) NT 1: -2
3) AN 2: 1 2 3) AN 2: 1 2 3) AN 2: 1 2
SAIDAS 2 SAIDAS 1) _ SAIDAS
1) 3 3 1) 3 1) 3
CIRCUITO 2 1 3 ____
CIRCUITO PORTAS CIRCUITO 2 1 3 CIRCUITO 2 1 3
2 1 3 PORTAS 1 ) OR 2 : -1 -2 PORTAS PORTAS
2 ) NT 1 : -2 1) OR 2: -1 -2 1 OR 2: -1 -2
1) OR 2: -1 -2 3 ) AN 2 : 1 2 3) NT 1: -2 2 NT 1: -2
2) NT 1 : -2 SAIDAS 2) AN 2: 1 2 3 AN 2: 1 2
3) AN 2: 1 2 1) 3 SAIDAS SAIDAS
SAIDAS 4) 22 0) 3 1 3
1 ) 3 OUTRA: 3.141592654 CIRCUITO 2 1 3 CIRCUITO 2 1 3
CIRCUITO 2 1 3 CIRCUITO 2 1 3 PORTAS PORTAS
PORTAS PORTAS 1) OR 2 -1 -2 1) OR 2: -1 -2
1)OR 2:-1 -2 1) OR 2 : -1 -2 2) NT 1 -2 2) NT 1: -3
2)NT 1:-2 2) NT 1 : -2 3) AN 2 1 2 3) AN 2: 4 2
3)AN 2:1 2 3) AN 2 : 1 2 SAIDAS SAIDAS
SAIDAS SAIDAS 1) 3 1) 0
1)3 1) 3 CIRCUITO 2 1 3 CIRCUITO 2 1 3
PORTAS PORTAS
1) OR 2: ) -1 -2 1) OR 2: -1
2) NT 1 0 : -2 2) NT 1: -2 2
3 0 ) AN 2: 1 2 3) AN 2: 1 2
SAIDAS SAIDAS
1] 3 1) 3
CIRCUITO: 2 1 3 CIRCUITO 2 1 3
PORTAS: PORTAS
1) OR 2: -1 -2 1) OR 2:: -1 -2
2) NT 1: -2 2) NT 1:: -2
3) AN 2: 1 2 3) AN 2:: 1 2
SAIDAS: SAIDAS
1) 3 1) 3
UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE
CENTRO DE TECNOLOGIA
DEPARTAMENTO DE ENGENHARIA DE COMPUTAÇÃO E AUTOMAÇÃO

ALGORITMOS

SIMULAR CIRCUITO: | | |
| | | // Simula a porta
// TIPO DE DADO Port | | | simularports[i](in_port)
Port: | | |
vector<int> id_in | | | Se (out_portports[i] == UNDEF)
// ids das entradas da porta: | | | | tudo_def ← false
bool3S out_port // Saída da porta | | | Caso contrário
| | | | alguma_def ← true
// DADOS GLOBAIS | | | Fim Se
vector<Port> ports | | |
// portas do circuito | | Fim Se
vector<int> id_out | Fim Para
// ids das saídas do circuito Enquanto (!tudo_def && alguma_def)

// ENTRADA: // DETERMINAÇÃO DAS SAÍDAS


vector<bool3S> in_circ Para j de 0 a Num_out-1
// Entradas do circuito | // De onde vem a saída?
| id ← id_out[j];
// SAÍDA | // Obtem valor da saída
vector<bool3S> out_circ | Se (id>0)
// Saídas do circuito | | // De uma porta
| | out_circ[j] ←
// VARIÁVEIS LOCAIS: | | out_portports[id-1]
bool tudo_def, alguma_def | Caso contrário
vector<bool3S> in_port | | // De entrada do circuito
// Entradas de uma porta | | out_circ [j] ←
| | in_circ[-id-1]
// INICIALIZAÇÃO DAS PORTAS | Fim Se
Para i de 0 a Num_ports-1 Fim Para
| out_portports[i] ← UNDEF
Fim Para

Repita
| tudo_def ← true;
| alguma_def ← false;
|
| Para i de 0 a Num_portas-1
| | Se (out_portports[i] == UNDEF)
| | | // Ajusta tamanho de in_port
| | | // igual ao num de entradas
| | | // da porta a ser simulada
| | | ajusta_tamanho(in_port,
| | | Ninports[i])
| | |
| | | Para j de 0 a Ninports[i]-1
| | | | // De onde vem a entrada?
| | | | id ← id_in[j]ports[i];
| | | | // Obtém valor da entrada
| | | | Se (id>0)
| | | | | // De outra porta
| | | | | in_port[j] ←
| | | | | out_portports[id-1]
| | | | Caso contrário
| | | | | // De entrada do circuito
| | | | | in_port[j] ←
| | | | | in_circ[-id-1]
| | | | Fim Se
| | | Fim Para
UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE
CENTRO DE TECNOLOGIA
DEPARTAMENTO DE ENGENHARIA DE COMPUTAÇÃO E AUTOMAÇÃO

SIMULAR PORTA: GERAR TABELA VERDADE:

Os operadores são associativos: // TIPO DE DADO bool3S


A AND B AND C = (A AND B) AND C bool3S: {UNDEF, FALSE, TRUE}
bool3S++:
= A AND (B AND C) UNDEF → FALSE → TRUE → UNDEF → …
A OR B OR C = (A OR B) OR C
= A OR (B OR C) // VARIÁVEIS LOCAIS:
A XOR B XOR C = (A XOR B) XOR C vector<bool3S> in_circ
= A XOR (B XOR C) // Entradas do circuito
Portanto, para simular uma porta com mais de
Para i de 0 a Num_input_circ-1
2 entradas, basta realizar a operação lógica | in_circ[i] ← UNDEF
entre a entrada de cada porta e o resultado da Fim Para
operação lógica entre todas as entradas ante-
riores. // GERAÇÃO DA TABELA
Repita
// ENTRADA: | simular_circuito(in_circ)
vector<bool3S> in_port | exibir_entradas_saidas()
// Entradas da porta | // Qual input incrementar?
| i ← Num_input_circ-1
// SAÍDA | Enquanto (i >= 0 &&
bool3S out_port | in_circ[i] == TRUE)
// Saída da porta | | in_circ[i]++ // Se torna UNDEF
| | i--
// PORTA NOT | Fim Enquanto
out_port ← NOT(in_port[0]) | // Incrementa a input escolhida
| Se (i >= 0)
// PORTA AND | | in_circ[i]++
out_port ← in_port[0] | Fim Se
Para i de 1 a Num_input_port-1 Enquanto (i >= 0)
| out_port ← (out_port AND
| in_port[i])
Fim Para

// PORTA NOT XOR


out_port ← in_port[0]
Para i de 1 a Num_input_port-1
| out_port ← (out_port XOR
| in_port[i])
Fim Para
out_port ← NOT(out_port)
UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE
CENTRO DE TECNOLOGIA
DEPARTAMENTO DE ENGENHARIA DE COMPUTAÇÃO E AUTOMAÇÃO

SUGESTÃO DE DESENVOLVIMENTO

1) Implemente todas as funcionalidades das 4) Implemente s função simular da classe


portas. Faça um programa de teste (veja su- Circuito. Teste com o programa principal
gestão teste1.cpp no SIGAA) que: da avaliação.
a) Utilize construtores com e sem parâme- a) Confira os resultados da simulação, utili-
tros, válidos e inválidos, e use funções de zando, por exemplo, a avaliação do perí-
consulta (getNumInputs, etc.) para tes- odo letivo anterior fornecida no SIGAA.
tar se as portas foram criadas correta-
mente.
b) Teste se a função simular só aceita ve-
tor de bool3S com a dimensão correta.
c) Verifique se a simulação está correta pa-
ra todas as combinações de entrada.
d) Crie objetos dinâmicos e teste se os mé-
todos virtuais (getName, simular, etc.)
exibem comportamento polimórfico e
correto.

2) Implemente as obrigatoriedades da classe


Circuito (construtores, destrutor, opera-
dores de atribuição) e as funções clear,
resize e setPort. Faça um programa de
teste (veja sugestão teste2.cpp) que:
a) Teste o construtor default.
b) Teste as funções resize e setPort
com parâmetros válidos e inválidos.
c) Teste o construtor por cópia, verificando
se o novo objeto e o antigo têm memó-
rias dinâmicas independentes (alterar
um deles não modifica o outro).
d) Teste o construtor por movimento, veri-
ficando se o novo objeto tem memória
válida (pode ser alterada).
e) Teste os operadores de atribuição por
cópia e por movimento.

3) Implemente as funções digitar, ler,


imprimir e salvar da classe Circuito.
Faça um programa de teste (veja sugestão
teste3.cpp no SIGAA) que:
a) Permita digitar um circuito, informando
valores inválidos (caso em que deve soli-
citar nova digitação) e válidos.
b) Imprima circuitos em tela e salve em ar-
quivo, verificando os resultados.
c) Leia diversos arquivos válidos e inválidos
(podem ser os que são fornecidos no
SIGAA) e permita testar se a função ler
detectou corretamente eventuais erros.

Você também pode gostar