• Aucun résultat trouvé

VI. ANALYSE DE LA PROPOSITION

III.4. Le programme GNL

de armazenamento e funcionais, podemos estimar o número de unidades de interconexão (barramentos e/ou multiplexadores), os quais são requeridos para interconectar as unidades de armazenamento às unidades funcionais.

Na abordagem proposta, estimamos uma implementação com multiplexadores. Estas unidades de interconexão são estimadas diretamente a partir do modelo de fluxo de dados temporizados (Figura 5.5) e do mapeamento de variáveis e operações para unidades de armazenamento e funcionais, respectivamente.

Primeiro, o conjunto de conexões entre as unidades de armazenamento e funcionais no projeto é determinado. Examinando o comportamento, visto na Figura 5.3, encontramos a instrução C := A + B. Então existe uma conexão das unidades de armazenamento nas quais as variáveis A e B foram atribuídas com a unidade funcional que implementa a operação de adição, e outra conexão da unidade funcional à unidade de armazenamento na qual a variável C foi confinada. No modelo intermediário (Figura 5.5.) a instrução C := A + B é modelada pela transição t4 (t1.+) e pelos lugares p7

Como visto no Capítulo 3, Inp(p) e Out(p), denotam os conjuntos das transições

de entrada e saída de um lugar p. Enquanto Inp(t) e Out(t) representam os conjuntos dos lugares de entrada e saída de uma transição t, respectivamente. Para exemplificar a abordagem proposta com maiores detalhes, aplicaremos a mesma a um comportamento fictício (timed Petri net) o qual denominaremos ΓΓ3. A Tabela 5.6 mostra um banco de

registradores com cinco unidades de armazenamento e suas respectivas variáveis alocadas, obtidos de ΓΓ3.

Tabela 5.6: Mapeamento das variáveis para unidades de armazenamento para Γ3.

R1 a, e, h, j R2 c, g, k R3 b, i R4 d, l R5 f Unidades de Armazenamento Variáveis

Na Tabela 5.7, temos o mapeamento das transições às unidades funcionais. As colunas Inp(t) e Out(Out(Out(t))) mostram os lugares representando variáveis de leitura e escrita, respectivamente, para cada transição lógica/aritmética. Os dados desta tabela são obtidos a partir do modelo de fluxo de dados temporizados. Na coluna instruções são vistos as operações aritméticas executadas por cada unidade funcional. As variáveis, nestas instruções, foram substituídas pelas suas respectivas unidades de armazenamento, de acordo com o mapeamento da Tabela 5.6.

Tabela 5.7: Mapeamento das transições (com suas respectivas variáveis de leitura e escrita) e definição das instruções às unidades funcionais em Γ3.

t7 a, f b R3 := R1 + R5 t11 e, k l R4 := R1 + R2 t9 g, d f R5 := R2 + R4 t3 l, b a R1 := R4 + R3 t15 c, i k R2 := R2 + R3 t5 e, d f R5 := R1 + R4 t1 f, k d R4:= R5 + R2 t23 i, f k R2 := R3 + R5 t19 f, a c R2 := R5 + R1 t27 a, i g R2 := R1 * R3 t31 c, b i R3 := R2 * R3 UF1 UF2 UF3 + + * Unidades Funcionais Tipo

A partir destas tabelas podemos determinar o conjunto de conexões entre as unidades de armazenamento e funcionais no projeto. Cada unidade funcional é composta de uma lista de conexões. Uma conexão é definida através de três atributos: unidade de armazenamento (do tipo string, determina a unidade de armazenamento de entrada de dados), ligação para o lado esquerdo e ligação para o lado direito (ambos atributos booleanos que indicam a existência de ligações entre a unidade de armazenamento de entrada e os lados esquerdo e direito da unidade funcional).

A unidade funcional UF1 (ver coluna instruções da Tabela 5.7) apresenta a

seguinte lista de instruções L1 = (R3 := R1 + R5, R4 := R1 + R2, R5 := R2 + R4, R1 := R4 + R3,

R2 := R2 + R3, R5 := R1 + R4 , R4 := R5 + R2). No primeiro passo, criamos para UF1 uma

lista de conexões C1 e duas conexões c1 e c2, logo em seguida anexamos estas duas

conexões à lista C1. Sempre que uma conexão é criada, ambos os atributos booleanos

são inicializados com o valor falso. De posse do primeiro elemento da lista L1 (R3 := R1

+ R5), para a conexão c1, atribuímos ao atributo unidade de armazenamento o valor R1 e

ao atributo ligação para lado esquerdo o valor verdadeiro. Para a conexão c2,

atribuímos ao atributo unidade de armazenamento o valor R5 e ao atributo ligação para

lado direito o valor verdadeiro. Assim, conectando as unidades de armazenamento R1 e

R5 à esquerda e à direita de UF1, respectivamente, é possível realizar a operação

aritmética desta instrução. Para o segundo elemento da lista L1 (R4 := R1 + R2), buscamos

em C1 as conexões que contêm nos atributos unidade de armazenamento os valores R1 e

R2. Verificamos que a condição é verdadeira para a conexão c1 (existe conexão para R1),

portanto cria-se a conexão c3 onde atribuímos o valor de R2 ao atributo unidade de

armazenamento. Com relação aos atributos booleanos, vemos que na conexão c1 o

atributo ligação para lado esquerdo possui valor verdadeiro e c3 os valores das ligações

para os lados esquerdo e direito são falsos. Portanto, é necessário fazer uma ligação da conexão c3 para o lado direito da unidade funcional para que a operação possa ser

executada. Fazemos isto atribuindo o valor verdadeiro ao atributo ligação para lado

direito da conexão c3. Segue-se similarmente para os demais elementos da lista L1,

levando-se em consideração a existência de conexões para as unidades de armazenamento e direcionando os atributos booleanos para que as operações possam ser

realizadas. A Tabela 5.8 mostra as conexões que fazem a amarração das unidades de armazenamento à unidade funcional UF1.

Nos passos seguintes, criamos similarmente as listas de conexões para as outras unidades funcionais. A Tabela 5.9 e a Tabela 5.10 mostram as conexões das unidades de armazenamento às unidades funcionais UF2 e UF3, respectivamente.

Tabela 5.8: Conexões das unidades de armazenamento à unidade funcional UF1 em Γ3.

C1 R1 verdadeiro falso C2 R5 falso verdadeiro C3 R2 verdadeiro verdadeiro C4 R4 verdadeiro verdadeiro C5 R3 verdadeiro verdadeiro Conexões de

entrada UF1 (+) armazenamentoUnidades

ligação p/ lado esquerdo UF1

ligação p/ lado direito UF1

Tabela 5.9: Conexões das unidades de armazenamento à unidade funcional UF2 em Γ3.

C1 R3 verdadeiro falso

C2 R5 falso verdadeiro

C3 R1 verdadeiro falso

Conexões de

entrada UF2 (+) armazenamentoUnidades

ligação p/ lado esquerdo UF2

ligação p/ lado direito UF2

Tabela 5.10: Conexões das unidades de armazenamento à unidade funcional UF3 em Γ3.

C1 R1 verdadeiro falso

C2 R3 falso verdadeiro

C3 R2 verdadeiro falso

Conexões de

entrada UF3 (*) armazenamentoUnidades ligaçãoesquerdo UF3 p/ lado ligação direito UF3p/ lado

A Figura 5.9 mostra o resultado esquemático das linhas de conexões para as duas entradas (lados esquerdo e direito) das unidades funcionais UF1, UF2 e UF3 do

comportamento da rede de Petri timed fictícia ΓΓ3.

Uma vez que as conexões tenham sido determinadas, elas precisam ser mapeadas em um multiplexador ou barramento. Uma estratégia simples seria implementar o conjunto de conexões que são entradas comuns (mesmo lado da unidade funcional) com o mesmo multiplexador ou barramento.

Figura 5.9: Conexões para as entradas das unidades funcionais: UF1, UF2 e UF3 em ΓΓ3.

Figura 5.10: Implementação para ΓΓ3 com multiplexadores 2 ××1.

A Figura 5.9 mostra que existem quatro conexões para cada entrada da unidade funcional UF1, logo são necessários dois multiplexadores 4 × 1 ou seis multiplexadores

2 ×1 para implementar estas conexões. Para as unidades funcionais UF2 e UF3, com

duas entradas do lado esquerdo e uma entrada do lado direito é necessário apenas um multiplexador no lado esquerdo para cada unidade funcional. Figura 5.10 mostra o resultado da implementação utilizando-se apenas multiplexadores 2 × 1.

A redução no custo dos multiplexadores pode ser obtida pela fatoração das conexões que apresentam entradas comuns para os diferentes multiplexadores. Insere-se um multiplexador em separado, o qual servirá como entrada para cada conjunto de conexões que apresentam entradas comuns. Por exemplo, as conexões c3, c4 e c5 são

entradas comuns para os dois lados da unidade funcional UF1. Estas conexões podem

ser “fatoradas” e implementadas no multiplexador M, como mostrado na Figura 5.11.

Figura 5.12: Redução do número de multiplexadores 2 x 1 por fatoração para ΓΓ3.

Fatorando-se as entradas do multiplexador reduz-se o número total de multiplexadores do projeto e desta forma o custo dos multiplexadores. A Figura 5.12 mostra o resultado da implementação utilizando a abordagem proposta, foram utilizados seis multiplexadores 2 × 1. Para realizar a implementação mostrada pela Figura 5.10 foram necessários oito multiplexadores 2 × 1, logo a implementação através da fatoração apresentou uma redução de 25% na implementação.

Abaixo apresentamos a definição formal do método proposto para estimar o número de Unidades de Interconexão.

Definição 5.18 – Conjunto de Lugares de Entrada de uma Transição

Lógica/Aritmética: Seja N = (P, T, A, ω, m0, f), uma rede de Petri marked graph

temporizada. Seja TLA = {th, ..., tl, ..., tn} o conjunto de transições lógicas aritméticas.

Seja VAR = {ph, ..., pl, ..., pn} o conjunto de lugares representando variáveis. Seja LIT =

uma tupla composta dos lugares de entrada da transição lógica aritmética ti, onde ti

TLA ⊂ T ∧ ∀p ∈ LETi (N, ti), p ∈ VAR ∨ p ∈ LIT.

Definição 5.19 – Conjunto de constantes: Seja N = (P, T, A, ω, m0, f) uma

rede de Petri marked graph temporizada. Seja LIT = {pk, ..., pj ..., pz} o conjunto de

lugares representando literais. Seja l uma função de nomeação dos conjuntos de lugares e transições com nomes significativos, l : P ∪ T L , onde L = {string1, string2,...} ∧

l(p) = pr.val[k] ∀ p ∈ LIT. l : LIT LITC , onde LITC = {pr.val[k] | r,k ∈ +} é o

conjunto de constantes de um determinado comportamento.

Obtido os lugares de entrada das transições lógicas/aritméticas precisamos identificar as variáveis ou constantes modeladas por estes lugares.

Definição 5.20 – Variáveis e/ou Constantes de Entrada de uma Transição

Lógica/Aritmética: Seja N = (P, T, A, ω, m0, f) uma rede de Petri marked graph

temporizada. Seja VAR = {ph, ..., pl, ..., pn} o conjunto de lugares representando

variáveis. Seja LIT = {pk, ..., pj ..., pz} o conjunto de lugares representando literais. Seja

LETi (N, ti)= (pn, pm) uma tupla dos lugares de entrada da transição lógica aritmética ti,

onde, pn, pm ∈ VAR ∨ pn, pm ∈ LIT. Seja l uma função de nomeação dos conjuntos de

lugares e transições com nomes significativos, l : P ∪ T L , onde L = {string1,

string2,...} ∧ l (p) = pr.substrings.t ∀ pn∈ VAR ∧ l (p) = pr.val[k] ∀ p ∈ LIT. Seja LITC

= {pr.val[k] | r,k ∈  +} o conjunto de constantes de um determinado comportamento.

VCETi(N, ti) = (x, y) é uma dupla de variáveis e/ou constantes de entrada de uma

transição lógica/aritmética, onde (x = pr.substrings.t ∨ x = pr.val[k]) ∧ (y = pr.substrings.t

∨ y = pr.val[k]) ∧ l(pn) = x ∧ l(pm) = y ∧ pn ∈ LETi (N, ti) ∧ pm = LETi(N, ti).

Identificadas as variáveis e/ou constantes modeladas pelos lugares de entrada das transições lógicas/aritméticas precisamos saber em quais unidades de armazenamento estes lugares formam mapeados.

Definição 5.21 – Unidades de Armazenamento de Entrada de uma

Transição Lógica/Aritmética: Seja N = (P, T, A, ω, m0, f) uma rede de Petri marked

entrada de uma transição lógica/aritmética. Seja REGISTRADORES = {REGi | i ∈ +}

o conjunto das unidades de armazenamento, onde REGk = {substringm | m, k ∈  +}.

Seja LITC = {pr.val[k] | r,k ∈  +} o conjunto de constantes. UAETi(N, ti) = (m, n) é

uma tupla composta de unidades de armazenamento de entrada de uma transição lógica/aritmética, onde (m ∈ REGISTRADORES ∨ m = LITC) ∧ (n ∈

REGISTRADORES ∨ n = LITC) ∧ x∈ m ∧ y∈ n.

A partir desta definição obtemos os registradores de entrada (armazenam variáveis ou constantes) para cada transição lógica aritmética da rede.

Definição 5.22 – Conjunto de Pares de Registradores das Transições

Funcionais: Seja N = (P, T, A, ω, m0, f), uma rede de Petri marked graph temporizada.

Seja CTFi = {th, ..., tl, ..., tn} o conjunto de transições funcionais. Seja UAETi(N, ti) =

(m, n) uma tupla composta de unidades de armazenamento de entrada de uma transição

ti lógica/aritmética. CPRTFi(N, CTFi) = {x | x = UAETi(N, ti) ∧ ti ∈ CTFi} é o conjunto

de pares de registradores das transições funcionais.

Desta forma obtemos todos os pares de registradores (de variáveis ou constantes) para cada conjunto de transições funcionais. O passo seguinte é a obtenção do conjunto de conexões das unidades de armazenamento ao conjunto de transições funcionais, antes definiremos uma função que retorne os elementos de uma tupla.

Definição 5.23 – Função Primeiro, Segundo e Terceiro: Seja K = (x, y, z) uma

tupla de elementos quaisquer, primeiro(K) = x, segundo(K) = y e terceiro(K) = z retornam o primeiro, o segundo e o terceiro elemento de uma tupla, respectivamente.

Definição 5.24 – Conjunto de Conexões de um Conjunto de Transições

Funcionais: Seja N = (P, T, A, ω, m0, f), uma rede de Petri marked graph temporizada.

Sejam primeiro, segundo e terceiro funções que retornam o primeiro, o segundo e o terceiro elemento de uma tupla, respectivamente. Seja CPRTFi(N, CTFi) = {r | r =

UAETi(N, ti) ∧ ti ∈ CTFi} o conjunto de pares de registradores de CTFi. Uma conexão

ck = (x, y, z) é uma tupla, onde x é uma unidade de armazenamento, y e z são atributos

respectivamente. CONEXÕES(N, CTFi) = {ck | k ∈  +} é o conjunto de conexões de um

conjunto de transições funcionais, onde primeiro(ck) = primeiro(r) ∨ primeiro(ck) =

segundo(r) ∧ r ∈ CPRTFi(N, CTFi) ∧ primeiro(ck) ≠ primeiro(cj) ∀ c ∈

CONEXÕES(N, CTFi).

A partir desta definição obtemos o conjunto das conexões entre as unidades de armazenamento (de variáveis e/ou constantes) aos lados direito e/ou esquerdo do conjunto de unidades funcionais.

Definição 5.25 – Função de Ligação: Seja ck = (x, y, z) uma conexão. link é

uma função de ligação que atribui a ck uma tupla de valor booleano, link(ck) = (a,b),

onde (a = verdadeiro ∨ a = falso) ∧ (b = verdadeiro ∨ b = falso) ∧ y = a ∧ z = b. Através da função link é possível modelar as instruções lógica/aritméticas no conjunto de transições funcionais. Por exemplo, se em uma conexão a e b forem verdadeiros, significa que a unidade de armazenamento x possui ligações à direita e à esquerda do conjunto de transições funcionais.

Definição 5.26 – Número de Unidades de Interconexão: Seja N = (P, T, A, ω,

m0, f), uma rede de Petri timed marked graph. Seja CTFi = {th, ..., tl, ..., tn} o conjunto

de transições funcionais. Sejam primeiro, segundo e terceiro funções que retornam o primeiro, o segundo e o terceiro elemento de uma tupla, respectivamente. Seja CTF= Ui

CTFi o conjunto que contém todas os conjuntos de transições funcionais CTFi. Seja ck =

(x, y, z) uma conexão. Seja CONEXÕES (N, CTFi) = {ck | k ∈ +} o conjunto de

conexões de CTFi. CETFi = { r | r ∈ CONEXÕES (N, CTFi) ∧ segundo(r) =

verdadeiro} é o conjunto de conexões com ligações ao lado esquerdo de CTFi. CDTFi

= { s | s ∈ CONEXÕES (N, CTFi) ∧ terceiro(s) = verdadeiro} é o conjunto de conexões

com ligações ao lado direito de CTFi. NMULT2×1i(N, CTFi) = # CETFi + # CDTFi

– 2 determina o número de multiplexadores 2×1 de CTFi. TOTALMULT = 3i∈{1,2,3 ...

#CTF} NMULT2×1i(N, CTFi) é o número de Unidades de Interconexão (multiplexadores 2×1) necessário para implementar o comportamento de determinada especificação.

A abordagem proposta objetiva minimizar o número de unidades de interconexão de determinado comportamento. O algoritmo proposto é:

• Entrada: ΓΓ( M, f) uma rede marked-graph temporizada marcada onde M = (N, m0) é a rede marcada e N = (P, T, A, ω) a estrutura da rede; mapeamento das variáveis para as unidades de armazenamento e o mapeamento das transições às unidades funcionais.

• Saída: o número de unidades de interconexão necessárias para realizar a especificação (TOTALMULT).

Passos:

I. Para cada conjunto de transições funcionais CTFi obter a lista de transições Li.

II. Para cada transição t da lista Li obter os lugares que modelam as variáveis e/ou

constantes de leitura (inp(t)) e variáveis de escrita (Out(Out(Out(t)))) no modelo intermediário – modelo de fluxo de dados temporizados.

III. Para cada variável e/ou constante de leitura (vi e vj) e variável de escrita (vk) obter

suas respectivas unidades de armazenamento Ri, Rj e Rk.

IV. Montar a lista de operações Lopi = { Rk := Ri op Rj, . . . } para cada conjunto de

transições funcionais, com base na operação lógica aritmética modelada pela transição t e suas respectivas unidades de armazenamento de leitura e escrita. V. A cada passo, para cada elemento da lista Lop, verificar a necessidade de criação de

novas conexões. Para cada conexão ci existente mapear os atributos unidade de

armazenamento, ligação para lado esquerdo e ligação para lado direito para que a

operação lógica aritmética possa ser executada. Desta forma obtemos o conjunto de conexões para cada conjunto de transições funcionais.

VI. Para as conexões que são entradas comuns para os dois lados do conjunto de transições funcionais, proceder com o processo de fatoração. Desta forma diminuímos a quantidade de multiplexadores no projeto.

VII. A quantidade de multiplexadores 2×1 para cada unidade funcional é obtida pelo número de conexões – 2 e o total de multiplexadores 2×1 pelo somatório.

A complexidade para a obtenção das variáveis e/ou constantes de entrada de cada transição lógica/aritmética é O(TLA*P). Para a determinação do conjunto de pares de registradores de cada unidade funcional – lista de operações LOPi é O(V*R), R = { y

| y ∈ • + ∧ 1 ≤ y ≤ V}. Para determinar o conjunto de conexões C

i de cada unidade

funcional a complexidade é O(LOP* C). Onde P é o conjunto de lugares, TLA ⊂ T é o conjunto de transições lógica/aritméticas, V ⊂ P é o conjunto de variáveis e R é o conjunto de registradores, LOP é o conjunto de pares de registradores e C é o conjunto de conexões. Logo, a complexidade da abordagem proposta para o cálculo das unidades de interconexão é O(TLA*P + V*R + LOP* C).

Agora vamos aplicar o algoritmo proposto acima à Rede de Petri temporizada ΓΓ1 (modelo utilizado para demonstrar nossa abordagem),mostrada pela Figura 5.5. As

duas entradas restantes: mapeamento das variáveis para as unidades de armazenamento e das transições para as unidades funcionais é dada pela Tabela 5.4 e pela Tabela 5.5, respectivamente. De acordo com a Tabela 5.5, a lista de transições para a única unidade funcional do projeto UF1 é L1 = {t4, t9, t14}. A Tabela 5.11 mostra os lugares que

modelam as variáveis de leitura (coluna Inp(t)) e escrita (coluna Out(Out(Out(t)))) obtidos a partir do modelo intermediário de fluxo de dados temporizados (Figura 5.5), bem como a lista de operações Lop1 = {R3:= R1 +R2, R2:= R2 +R3,R2:= R1 +R2} com

suas respectivas unidades de armazenamento de entrada e escrita, já mapeadas com base na Tabela 5.4.

Tabela 5.11: Mapeamento das transições à unidade funcional UF1 e suas respectivas instruções

aritméticas para Γ1. t4 a, b c R3 := R1 + R2 t9 b, c d R2 := R2 + R3 t14 a, d b R2 := R1 + R2 UF1 + Unidades Funcionais Tipo

operação Transições Inp(t) Out(Out(Out(t))) Instruções

Tabela 5.12: Conexões unidades armazenamento com a unidade funcional UF1 para Γ1.

C1 R1 sim não

C2 R2 não sim

C3 R3 sim não

Conexões de

entrada UF1 (+) armazenamentoUnidades

link p/ lado esquerdo UF1

link p/ lado direito UF1

Após a execução dos passos sobre a lista Lop1 obtemos o conjunto de conexões

mostrado na Tabela 5.12. Estas linhas de conexões para as duas entradas da unidade funcional UF1 é melhor visualizada pelo esquemático da Figura 5.13(a). O projeto final

do caminho de dados (unidades de armazenamento, funcionais e de armazenamento – multiplexadores 2×1) é visto na Figura 5.13(b). Finalizando, para a o comportamento mostrado na Figura 5.3, o qual foi traduzido para um modelo intermediário em redes de Petri temporizada (timed) ΓΓ1 mostrado pela Figura 5.5, foi gerada uma estimativa para

uma implementação do caminho de dados de três unidades de armazenamento, um multiplexador 2×1 e uma unidade funcional (somador). O próximo passo é obter a estimativa de área de acordo com tecnologia a ser utilizada, FPGAs, full custom entre outras.

Figura 5.13: (a) Conexões para as duas entrada da unidade funcional (b) Implementação do projeto final para ΓΓ1.

Documents relatifs