Advertisement
Guest User

Untitled

a guest
Sep 10th, 2019
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Latex 5.02 KB | None | 0 0
  1. A representacaox de um circuito é de extrema importancia para o simulador.
  2. Uma representacaox complexa e detalhada torna a ferramente menos acessivel a novos usuarios.
  3. Sendo assim, a representacaox feita tentou ser simples e familiar, pois modela circuitos de maneira analoga ao apresentado nas literaturas.
  4.  
  5. Definir a representação foi o primeiro passo do processo criativo pois ela define a interface do codígo.
  6. A interface definida passou por uma série de iterações até chegar em um resultado que o autor considerou agradável e entendivel.
  7. Como um objetivo é desenvolver uma ferramenta amigavel, primeiramente será demonstrado snippets de código do modelo implementado.
  8.  
  9. O codígo abaixo criou uma porta do tipo AND e alterou os sinais de entrada dessa porta.
  10. Percebe-se que a porta foi criada usando a notação familiar de construcaox de objetos em linguagens orientada a objetos.
  11. A porta AND possui duas entradas (A e B) e uma saída (Y), e como foi visto anteriormente cada uma dessas conexões é um terminal.
  12. A interação com os terminais é feita a partir do operador ponto (usado para acessar atributos), no codigo acessamos a bus ligada ao terminal 'A' da porta lógica e em seguida modificamos o valor do sinal da bus.
  13. Essa operação foi executada de maneira enxuta e legivel, sem dificuldades para o usuário.
  14. O mesmo procedimento é executado na porta 'B' e finalmente executa-se a função print para verificar o sinal no terminal Y.
  15. Também é possível chamar print na porta como um todo e é impresso todas as informações referentes ao circuito.
  16.  
  17. \begin{lslisting}
  18.  porta = AND() #cria porta do tipo AND e armezena referencia à variável porta
  19.  porta.a.signal = 1 #modifica o sinal presente na Bus conectada ao terminal A
  20.  porta.b = 1
  21.  print(porta.y) #imprime informacão do terminal Y
  22.  print(porta) #impreme informacao do circuito
  23. \end{lslisting}
  24.  
  25. A composição de circuitos também é feita a partir de operações nos objetos.
  26. O código abaixo cria duas portas AND, p1 e p2, e conecta a saída de p1 na entrada de p2.
  27. A conexão dos circuitos é feita a partir do método "connect".
  28. Esse método faz uso de argumentos do tipo chave-valor.
  29. O método recebe um conjunto chave-valor onde a chave é o nome de um terminal do circuito e o valor é uma bus que será ligada ao terminal.
  30. A conexaox entre os dois circuitos foi feita em uma linha de código de maneira clara e simples.
  31.  
  32. \begin{lslisting}
  33.  p1, p2 = AND(), AND()
  34.  p2.connect(a=p1.y) #Liga saída de p1 na entrada 'a' de p2
  35. \end{lslisting}
  36.  
  37. O snippet final utiliza os conceitos apresentados até agora e aplica modularidade ao processo.
  38. O código a seguir define um novo circuito, ou seja uma classe, e a ele damos o nome "NovoCircuito".
  39. NovoCircuito herda de uma classe pai disponibilizada pela ferramenta e o circuito implementado é o mesmo circuito descrto acima (duas portas AND conectadas).
  40. A vantagem de criar uma classe para esse circuito é que ele fica reutilizavel, caso precisamos dele novamente basta instancialo novamente; outra vantagem é que aplicamos o conceito de hierarquia, ou seja, construimos um circuito mais complexo a partir de circuitos simples.
  41. A nova classe deve definir o nome dos terminais de entrada e saida e o método "make", esse processo é feito sempre que construimos uma nova classe.
  42. Os atributos 'input_labels' e 'output_labels' esperam uma lista de strings que definem os nomes dos terminais de entrada e saída, respectivamente.
  43. O metodo make é aonde o circuito as conexões entre sub circuitos são definidas.
  44. Algo de grande importante no método make é que o usuário deve chamar o método self.get_inputs().
  45. Esse método retorna uma estrutura similar a um struct com as buses que pertencem ao circuito sendo construído.
  46. Esse passo é essencial, pois é a partir dessas buses que é feita a conexão do NovoCircuito com os subcircuitos presentes nele.
  47. Sem os objetos retornados pelo get_inputs, NovoCircuito seria uma caixa preta com terminais porém esses terminais não estariam ligados a nada.
  48.  
  49. \begin{lslisting}
  50. class NovoCircuito(BaseCircuit):
  51.    input_labels = ['a', 'b', 'c'] #lista de nomes dos terminais de entrada
  52.    output_labels = ['y'] #lista de nomes dos terminais de saida
  53.  
  54.    def make(self):
  55.        i = self.get_inputs() #objeto que contem as buses internas ao circuito NovoCircuito.
  56.        and_1 = AND()
  57.        and_1.connect(a=i.a, b=i.b) #Conecta as buses de entrada a e b ao circuito and_1
  58.        and_2 = AND(a=and_1.y)
  59.        self.set_outputs(y=and_2.y) #Conecta a saida do circuito and_2 a saida 'Y' do NovoCircuito
  60. \end{lslisting}
  61.  
  62. Os três snippets acima são curtos porém eles, de certa forma, são tudo o que é preciso entender sobre a ferramenta.
  63. Eles introduzem a "linguagem" da ferramenta, com essa linguagem o usuário pode modelar qualquer circuito que ele queira.
  64. A simples representação escolhida é o diferencial da ferramenta, a partir dela pode-se criar circuitos de complexidade incremental usando modularidade e hierarquia, e tudo isso com uma interface de código consistente.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement