| 1 | #!/usr/bin/env python |
|---|
| 2 | |
|---|
| 3 | from stratus import * |
|---|
| 4 | |
|---|
| 5 | class am2901_core ( Model ) : |
|---|
| 6 | |
|---|
| 7 | def Interface ( self ) : |
|---|
| 8 | # ***************** Terminal Declarations ****************** |
|---|
| 9 | # Pin terminals associated with ALU. |
|---|
| 10 | self.cin = SignalIn ( "cin", 1 ) |
|---|
| 11 | self.cout = SignalOut ( "cout", 1 ) |
|---|
| 12 | self.np = SignalOut ( "np", 1 ) |
|---|
| 13 | self.ng = SignalOut ( "ng", 1 ) |
|---|
| 14 | self.over = SignalOut ( "over", 1 ) |
|---|
| 15 | self.zero = SignalOut ( "zero", 1 ) |
|---|
| 16 | |
|---|
| 17 | # Pin terminals associated with the RAM and ACCU shifter. |
|---|
| 18 | # RAM and ACCU I/O plots controls. |
|---|
| 19 | self.sh_right = SignalOut ( "sh_right", 1 ) |
|---|
| 20 | self.sh_left = SignalOut ( "sh_left", 1 ) |
|---|
| 21 | |
|---|
| 22 | # RAM shifter I/O. |
|---|
| 23 | self.ram_o_down = SignalOut ( "ram_o_down", 1 ) # alu_f[0] |
|---|
| 24 | self.ram_o_up = SignalOut ( "ram_o_up", 1 ) # alu_f[3] |
|---|
| 25 | self.ram_i_down = SignalIn ( "ram_i_down", 1 ) |
|---|
| 26 | self.ram_i_up = SignalIn ( "ram_i_up", 1 ) |
|---|
| 27 | |
|---|
| 28 | # ACC shifter I/O. |
|---|
| 29 | self.acc_o_down = SignalOut ( "acc_o_down", 1 ) |
|---|
| 30 | self.acc_o_up = SignalOut ( "acc_o_up", 1 ) |
|---|
| 31 | self.acc_i_down = SignalIn ( "acc_i_down", 1 ) |
|---|
| 32 | self.acc_i_up = SignalIn ( "acc_i_up", 1 ) |
|---|
| 33 | |
|---|
| 34 | # ACCU controls terminals. |
|---|
| 35 | self.ck = SignalIn ( "ck", 1 ) |
|---|
| 36 | |
|---|
| 37 | # Data bus terminals. |
|---|
| 38 | self.a = SignalIn ( "a", 4 ) |
|---|
| 39 | self.b = SignalIn ( "b", 4 ) |
|---|
| 40 | self.d = SignalIn ( "d", 4 ) |
|---|
| 41 | self.i = SignalIn ( "i", 9 ) |
|---|
| 42 | self.y = SignalOut ( "y", 4 ) |
|---|
| 43 | self.noe = SignalIn ( "noe", 1 ) |
|---|
| 44 | self.oe = SignalOut ( "oe", 1 ) |
|---|
| 45 | |
|---|
| 46 | # Power suplies terminals. |
|---|
| 47 | self.vdd = VddIn ( "vdd" ) |
|---|
| 48 | self.vss = VssIn ( "vss" ) |
|---|
| 49 | |
|---|
| 50 | def Netlist ( self ) : |
|---|
| 51 | ops_mx = Signal ( "ops_mx", 3 ) |
|---|
| 52 | opr_mx = Signal ( "opr_mx", 2 ) |
|---|
| 53 | alu_k = Signal ( "alu_k", 5 ) |
|---|
| 54 | alu_over = Signal ( "alu_over", 1 ) |
|---|
| 55 | ram_sh = Signal ( "ram_sh", 2 ) |
|---|
| 56 | out_mx = Signal ( "out_mx", 1 ) |
|---|
| 57 | acc_wen = Signal ( "acc_wen", 1 ) |
|---|
| 58 | deca = Signal ( "deca", 16 ) |
|---|
| 59 | decb = Signal ( "decb", 16 ) |
|---|
| 60 | decwb = Signal ( "decwb", 16 ) |
|---|
| 61 | alu_np = Signal ( "alu_np", 4 ) |
|---|
| 62 | alu_ng = Signal ( "alu_ng", 4 ) |
|---|
| 63 | alu_f = Signal ( "alu_f", 2 ) |
|---|
| 64 | |
|---|
| 65 | Generate ( "am2901_dpt.am2901_dpt", "am2901_dpt" ) |
|---|
| 66 | |
|---|
| 67 | # **************** Data-Path Instanciation ***************** |
|---|
| 68 | self.Dpt = Inst ( "am2901_dpt", "dpt" |
|---|
| 69 | , map = { 'ram_ck' : Cat ( self.ck, self.ck, self.ck, self.ck, self.ck, self.ck, self.ck, self.ck |
|---|
| 70 | , self.ck, self.ck, self.ck, self.ck, self.ck, self.ck, self.ck, self.ck ) |
|---|
| 71 | , 'ops_mx' : ops_mx |
|---|
| 72 | , 'opr_mx' : opr_mx |
|---|
| 73 | , 'alu_k' : alu_k |
|---|
| 74 | , 'alu_cin' : self.cin |
|---|
| 75 | , 'alu_cout' : self.cout |
|---|
| 76 | , 'alu_over' : alu_over |
|---|
| 77 | , 'ram_sh' : ram_sh |
|---|
| 78 | , 'acc_sh' : ram_sh |
|---|
| 79 | , 'ram_i_up' : self.ram_i_up |
|---|
| 80 | , 'ram_i_down' : self.ram_i_down |
|---|
| 81 | , 'acc_i_up' : self.acc_i_up |
|---|
| 82 | , 'acc_i_down' : self.acc_i_down |
|---|
| 83 | , 'acc_q_down' : self.acc_o_down |
|---|
| 84 | , 'acc_q_up' : self.acc_o_up |
|---|
| 85 | , 'out_mx' : out_mx |
|---|
| 86 | , 'acc_ck' : self.ck |
|---|
| 87 | , 'acc_wen' : acc_wen |
|---|
| 88 | , 'a' : deca |
|---|
| 89 | , 'b' : decb |
|---|
| 90 | , 'b_w' : decwb |
|---|
| 91 | , 'opr_d' : self.d |
|---|
| 92 | , 'alu_f' : Cat ( self.ram_o_up, alu_f, self.ram_o_down ) |
|---|
| 93 | , 'alu_np' : alu_np |
|---|
| 94 | , 'alu_ng' : alu_ng |
|---|
| 95 | , 'out_x' : self.y |
|---|
| 96 | , 'vdd' : self.vdd |
|---|
| 97 | , 'vss' : self.vss |
|---|
| 98 | } |
|---|
| 99 | ) |
|---|
| 100 | |
|---|
| 101 | # ***************** Control Instanciation ****************** |
|---|
| 102 | self.Ctl = Inst ( "am2901_ctl", "ctl" |
|---|
| 103 | , map = { 'ops_mx' : ops_mx |
|---|
| 104 | , 'opr_mx' : opr_mx |
|---|
| 105 | , 'alu_k' : alu_k |
|---|
| 106 | , 'alu_cout' : self.cout |
|---|
| 107 | , 'alu_over' : alu_over |
|---|
| 108 | , 'deca' : deca |
|---|
| 109 | , 'decb' : decb |
|---|
| 110 | , 'decwb' : decwb |
|---|
| 111 | , 'a' : self.a |
|---|
| 112 | , 'b' : self.b # bw == b |
|---|
| 113 | , 'ram_sh' : ram_sh |
|---|
| 114 | , 'out_mx' : out_mx |
|---|
| 115 | , 'acc_wen' : acc_wen |
|---|
| 116 | , 'alu_f' : Cat ( self.ram_o_up, alu_f, self.ram_o_down ) |
|---|
| 117 | , 'alu_np' : alu_np |
|---|
| 118 | , 'alu_ng' : alu_ng |
|---|
| 119 | , 'core_np' : self.np |
|---|
| 120 | , 'core_ng' : self.ng |
|---|
| 121 | , 'core_over' : self.over |
|---|
| 122 | , 'core_zero' : self.zero |
|---|
| 123 | , 'core_sh_right' : self.sh_right |
|---|
| 124 | , 'core_sh_left' : self.sh_left |
|---|
| 125 | , 'i' : self.i |
|---|
| 126 | , 'noe' : self.noe |
|---|
| 127 | , 'oe' : self.oe |
|---|
| 128 | , 'vdd' : self.vdd |
|---|
| 129 | , 'vss' : self.vss |
|---|
| 130 | } |
|---|
| 131 | ) |
|---|