vertigo_vhdl 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (183) hide show
  1. checksums.yaml +7 -0
  2. data/bin/vertigo +7 -0
  3. data/lib/vertigo.rb +4 -0
  4. data/lib/vertigo/ast.rb +87 -0
  5. data/lib/vertigo/ast_vertigo_rkgen.rb +607 -0
  6. data/lib/vertigo/code.rb +57 -0
  7. data/lib/vertigo/compiler.rb +61 -0
  8. data/lib/vertigo/generic_lexer.rb +61 -0
  9. data/lib/vertigo/generic_parser.rb +44 -0
  10. data/lib/vertigo/indent.rb +20 -0
  11. data/lib/vertigo/lexer.rb +172 -0
  12. data/lib/vertigo/parser.rb +1458 -0
  13. data/lib/vertigo/pretty_printer.rb +749 -0
  14. data/lib/vertigo/runner.rb +115 -0
  15. data/lib/vertigo/tb_generator.rb +81 -0
  16. data/lib/vertigo/template.tb.vhd +72 -0
  17. data/lib/vertigo/token.rb +67 -0
  18. data/lib/vertigo/version.rb +3 -0
  19. data/lib/vertigo/vertigo.rkg +354 -0
  20. data/lib/vertigo/visitor_vertigo_rkgen.rb +447 -0
  21. data/tests/ghdl_tests/fsm.vhd +98 -0
  22. data/tests/ghdl_tests/fsm_synth.vhd +248 -0
  23. data/tests/ghdl_tests/test_fsm.vhd +162 -0
  24. data/tests/parser_tests/else.vhd +64 -0
  25. data/tests/parser_tests/test_MUST_fail.vhd +1 -0
  26. data/tests/parser_tests/test_accelerator.vhd +160 -0
  27. data/tests/parser_tests/test_accelerator_pp.vhd +144 -0
  28. data/tests/parser_tests/test_aggregate.vhd +17 -0
  29. data/tests/parser_tests/test_aggregate_pp.vhd +15 -0
  30. data/tests/parser_tests/test_archi_1.vhd +45 -0
  31. data/tests/parser_tests/test_archi_1_pp.vhd +41 -0
  32. data/tests/parser_tests/test_array_array_00.vhd +25 -0
  33. data/tests/parser_tests/test_array_array_00_pp.vhd +25 -0
  34. data/tests/parser_tests/test_array_urange.vhd +25 -0
  35. data/tests/parser_tests/test_array_urange_pp.vhd +25 -0
  36. data/tests/parser_tests/test_chu-1.vhd +80 -0
  37. data/tests/parser_tests/test_chu-1_pp.vhd +104 -0
  38. data/tests/parser_tests/test_concat.vhd +11 -0
  39. data/tests/parser_tests/test_concat_pp.vhd +14 -0
  40. data/tests/parser_tests/test_counter.vhd +35 -0
  41. data/tests/parser_tests/test_counter_pp.vhd +35 -0
  42. data/tests/parser_tests/test_de2.vhd +358 -0
  43. data/tests/parser_tests/test_de2_pp.vhd +274 -0
  44. data/tests/parser_tests/test_encode.vhd +2679 -0
  45. data/tests/parser_tests/test_encode_pp.vhd +2549 -0
  46. data/tests/parser_tests/test_fsm.vhd +162 -0
  47. data/tests/parser_tests/test_fsm_pp.vhd +125 -0
  48. data/tests/parser_tests/test_fsm_synth.vhd +248 -0
  49. data/tests/parser_tests/test_fsm_synth_pp.vhd +197 -0
  50. data/tests/parser_tests/test_function-01.vhd +33 -0
  51. data/tests/parser_tests/test_function-01_pp.vhd +18 -0
  52. data/tests/parser_tests/test_lfsr.vhd +75 -0
  53. data/tests/parser_tests/test_lfsr_pp.vhd +44 -0
  54. data/tests/parser_tests/test_microwatt_cache_ram.vhd +1 -0
  55. data/tests/parser_tests/test_microwatt_cache_ram_pp.vhd +68 -0
  56. data/tests/parser_tests/test_microwatt_common.vhd +1 -0
  57. data/tests/parser_tests/test_microwatt_common_pp.vhd +336 -0
  58. data/tests/parser_tests/test_microwatt_control.vhd +1 -0
  59. data/tests/parser_tests/test_microwatt_control_pp.vhd +187 -0
  60. data/tests/parser_tests/test_microwatt_core.vhd +1 -0
  61. data/tests/parser_tests/test_microwatt_core_debug.vhd +1 -0
  62. data/tests/parser_tests/test_microwatt_core_debug_pp.vhd +104 -0
  63. data/tests/parser_tests/test_microwatt_core_pp.vhd +231 -0
  64. data/tests/parser_tests/test_microwatt_core_tb.vhd +1 -0
  65. data/tests/parser_tests/test_microwatt_core_tb_pp.vhd +43 -0
  66. data/tests/parser_tests/test_microwatt_countzero.vhd +1 -0
  67. data/tests/parser_tests/test_microwatt_countzero_pp.vhd +120 -0
  68. data/tests/parser_tests/test_microwatt_countzero_tb.vhd +1 -0
  69. data/tests/parser_tests/test_microwatt_countzero_tb_pp.vhd +70 -0
  70. data/tests/parser_tests/test_microwatt_cr_file.vhd +1 -0
  71. data/tests/parser_tests/test_microwatt_cr_file_pp.vhd +74 -0
  72. data/tests/parser_tests/test_microwatt_cr_hazard.vhd +1 -0
  73. data/tests/parser_tests/test_microwatt_cr_hazard_pp.vhd +51 -0
  74. data/tests/parser_tests/test_microwatt_crhelpers.vhd +1 -0
  75. data/tests/parser_tests/test_microwatt_crhelpers_pp.vhd +48 -0
  76. data/tests/parser_tests/test_microwatt_dcache.vhd +1 -0
  77. data/tests/parser_tests/test_microwatt_dcache_pp.vhd +481 -0
  78. data/tests/parser_tests/test_microwatt_dcache_tb.vhd +1 -0
  79. data/tests/parser_tests/test_microwatt_dcache_tb_pp.vhd +98 -0
  80. data/tests/parser_tests/test_microwatt_decode1.vhd +1 -0
  81. data/tests/parser_tests/test_microwatt_decode1_pp.vhd +138 -0
  82. data/tests/parser_tests/test_microwatt_decode2.vhd +1 -0
  83. data/tests/parser_tests/test_microwatt_decode2_pp.vhd +300 -0
  84. data/tests/parser_tests/test_microwatt_decode_types.vhd +1 -0
  85. data/tests/parser_tests/test_microwatt_decode_types_pp.vhd +67 -0
  86. data/tests/parser_tests/test_microwatt_divider.vhd +1 -0
  87. data/tests/parser_tests/test_microwatt_divider_pp.vhd +132 -0
  88. data/tests/parser_tests/test_microwatt_divider_tb.vhd +1 -0
  89. data/tests/parser_tests/test_microwatt_divider_tb_pp.vhd +95 -0
  90. data/tests/parser_tests/test_microwatt_dmi_dtm_dummy.vhd +1 -0
  91. data/tests/parser_tests/test_microwatt_dmi_dtm_dummy_pp.vhd +29 -0
  92. data/tests/parser_tests/test_microwatt_dmi_dtm_tb.vhd +1 -0
  93. data/tests/parser_tests/test_microwatt_dmi_dtm_tb_pp.vhd +197 -0
  94. data/tests/parser_tests/test_microwatt_dmi_dtm_xilinx.vhd +1 -0
  95. data/tests/parser_tests/test_microwatt_dmi_dtm_xilinx_pp.vhd +139 -0
  96. data/tests/parser_tests/test_microwatt_execute1.vhd +1 -0
  97. data/tests/parser_tests/test_microwatt_execute1_pp.vhd +689 -0
  98. data/tests/parser_tests/test_microwatt_fetch1.vhd +1 -0
  99. data/tests/parser_tests/test_microwatt_fetch1_pp.vhd +88 -0
  100. data/tests/parser_tests/test_microwatt_fetch2.vhd +1 -0
  101. data/tests/parser_tests/test_microwatt_fetch2_pp.vhd +79 -0
  102. data/tests/parser_tests/test_microwatt_glibc_random.vhd +1 -0
  103. data/tests/parser_tests/test_microwatt_glibc_random_helpers.vhd +1 -0
  104. data/tests/parser_tests/test_microwatt_glibc_random_helpers_pp.vhd +25 -0
  105. data/tests/parser_tests/test_microwatt_glibc_random_pp.vhd +41 -0
  106. data/tests/parser_tests/test_microwatt_gpr_hazard.vhd +1 -0
  107. data/tests/parser_tests/test_microwatt_gpr_hazard_pp.vhd +68 -0
  108. data/tests/parser_tests/test_microwatt_helpers.vhd +1 -0
  109. data/tests/parser_tests/test_microwatt_helpers_pp.vhd +153 -0
  110. data/tests/parser_tests/test_microwatt_icache.vhd +1 -0
  111. data/tests/parser_tests/test_microwatt_icache_pp.vhd +337 -0
  112. data/tests/parser_tests/test_microwatt_icache_tb.vhd +1 -0
  113. data/tests/parser_tests/test_microwatt_icache_tb_pp.vhd +104 -0
  114. data/tests/parser_tests/test_microwatt_insn_helpers.vhd +1 -0
  115. data/tests/parser_tests/test_microwatt_insn_helpers_pp.vhd +208 -0
  116. data/tests/parser_tests/test_microwatt_loadstore1.vhd +1 -0
  117. data/tests/parser_tests/test_microwatt_loadstore1_pp.vhd +222 -0
  118. data/tests/parser_tests/test_microwatt_logical.vhd +1 -0
  119. data/tests/parser_tests/test_microwatt_logical_pp.vhd +87 -0
  120. data/tests/parser_tests/test_microwatt_multiply.vhd +1 -0
  121. data/tests/parser_tests/test_microwatt_multiply_pp.vhd +84 -0
  122. data/tests/parser_tests/test_microwatt_multiply_tb.vhd +1 -0
  123. data/tests/parser_tests/test_microwatt_multiply_tb_pp.vhd +75 -0
  124. data/tests/parser_tests/test_microwatt_plru.vhd +1 -0
  125. data/tests/parser_tests/test_microwatt_plru_pp.vhd +46 -0
  126. data/tests/parser_tests/test_microwatt_plru_tb.vhd +1 -0
  127. data/tests/parser_tests/test_microwatt_plru_tb_pp.vhd +93 -0
  128. data/tests/parser_tests/test_microwatt_ppc_fx_insns.vhd +1 -0
  129. data/tests/parser_tests/test_microwatt_ppc_fx_insns_pp.vhd +665 -0
  130. data/tests/parser_tests/test_microwatt_register_file.vhd +1 -0
  131. data/tests/parser_tests/test_microwatt_register_file_pp.vhd +86 -0
  132. data/tests/parser_tests/test_microwatt_rotator.vhd +1 -0
  133. data/tests/parser_tests/test_microwatt_rotator_pp.vhd +149 -0
  134. data/tests/parser_tests/test_microwatt_rotator_tb.vhd +1 -0
  135. data/tests/parser_tests/test_microwatt_rotator_tb_pp.vhd +134 -0
  136. data/tests/parser_tests/test_microwatt_sim_bram.vhd +1 -0
  137. data/tests/parser_tests/test_microwatt_sim_bram_helpers.vhd +1 -0
  138. data/tests/parser_tests/test_microwatt_sim_bram_helpers_pp.vhd +52 -0
  139. data/tests/parser_tests/test_microwatt_sim_bram_pp.vhd +53 -0
  140. data/tests/parser_tests/test_microwatt_sim_console.vhd +1 -0
  141. data/tests/parser_tests/test_microwatt_sim_console_pp.vhd +43 -0
  142. data/tests/parser_tests/test_microwatt_sim_jtag.vhd +1 -0
  143. data/tests/parser_tests/test_microwatt_sim_jtag_pp.vhd +64 -0
  144. data/tests/parser_tests/test_microwatt_sim_jtag_socket.vhd +1 -0
  145. data/tests/parser_tests/test_microwatt_sim_jtag_socket_pp.vhd +36 -0
  146. data/tests/parser_tests/test_microwatt_sim_uart.vhd +1 -0
  147. data/tests/parser_tests/test_microwatt_sim_uart_pp.vhd +90 -0
  148. data/tests/parser_tests/test_microwatt_soc.vhd +1 -0
  149. data/tests/parser_tests/test_microwatt_soc_pp.vhd +195 -0
  150. data/tests/parser_tests/test_microwatt_utils.vhd +1 -0
  151. data/tests/parser_tests/test_microwatt_utils_pp.vhd +39 -0
  152. data/tests/parser_tests/test_microwatt_wishbone_arbiter.vhd +1 -0
  153. data/tests/parser_tests/test_microwatt_wishbone_arbiter_pp.vhd +54 -0
  154. data/tests/parser_tests/test_microwatt_wishbone_bram_tb.vhd +1 -0
  155. data/tests/parser_tests/test_microwatt_wishbone_bram_tb_pp.vhd +157 -0
  156. data/tests/parser_tests/test_microwatt_wishbone_bram_wrapper.vhd +1 -0
  157. data/tests/parser_tests/test_microwatt_wishbone_bram_wrapper_pp.vhd +62 -0
  158. data/tests/parser_tests/test_microwatt_wishbone_debug_master.vhd +1 -0
  159. data/tests/parser_tests/test_microwatt_wishbone_debug_master_pp.vhd +124 -0
  160. data/tests/parser_tests/test_microwatt_wishbone_types.vhd +1 -0
  161. data/tests/parser_tests/test_microwatt_wishbone_types_pp.vhd +38 -0
  162. data/tests/parser_tests/test_microwatt_writeback.vhd +1 -0
  163. data/tests/parser_tests/test_microwatt_writeback_pp.vhd +87 -0
  164. data/tests/parser_tests/test_package-1.vhd +68 -0
  165. data/tests/parser_tests/test_package-1_pp.vhd +53 -0
  166. data/tests/parser_tests/test_precedence.vhd +13 -0
  167. data/tests/parser_tests/test_precedence_pp.vhd +16 -0
  168. data/tests/parser_tests/test_selected_sig.vhd +14 -0
  169. data/tests/parser_tests/test_selected_sig_pp.vhd +10 -0
  170. data/tests/parser_tests/test_slice.vhd +15 -0
  171. data/tests/parser_tests/test_slice_pp.vhd +16 -0
  172. data/tests/parser_tests/test_tb-00.vhd +94 -0
  173. data/tests/parser_tests/test_tb-00_pp.vhd +71 -0
  174. data/tests/parser_tests/test_type_decl_02.vhd +9 -0
  175. data/tests/parser_tests/test_type_decl_02_pp.vhd +11 -0
  176. data/tests/parser_tests/test_use.vhd +7 -0
  177. data/tests/parser_tests/test_use_pp.vhd +10 -0
  178. data/tests/parser_tests/test_while_1.vhd +38 -0
  179. data/tests/parser_tests/test_while_1_pp.vhd +26 -0
  180. data/tests/parser_tests/test_with-00.vhd +21 -0
  181. data/tests/parser_tests/test_with-00_pp.vhd +12 -0
  182. data/tests/tb_gen_tests/test_accelerator.vhd +160 -0
  183. metadata +224 -0
@@ -0,0 +1,208 @@
1
+ -- generated by Vertigo VHDL tool
2
+ library ieee;
3
+ use ieee.std_logic_1164.all;
4
+
5
+ package insn_helpers is
6
+ function insn_rs(insn_in : std_ulogic_vector) return std_ulogic_vector
7
+ function insn_rt(insn_in : std_ulogic_vector) return std_ulogic_vector
8
+ function insn_ra(insn_in : std_ulogic_vector) return std_ulogic_vector
9
+ function insn_rb(insn_in : std_ulogic_vector) return std_ulogic_vector
10
+ function insn_si(insn_in : std_ulogic_vector) return std_ulogic_vector
11
+ function insn_ui(insn_in : std_ulogic_vector) return std_ulogic_vector
12
+ function insn_l(insn_in : std_ulogic_vector) return std_ulogic
13
+ function insn_sh32(insn_in : std_ulogic_vector) return std_ulogic_vector
14
+ function insn_mb32(insn_in : std_ulogic_vector) return std_ulogic_vector
15
+ function insn_me32(insn_in : std_ulogic_vector) return std_ulogic_vector
16
+ function insn_li(insn_in : std_ulogic_vector) return std_ulogic_vector
17
+ function insn_lk(insn_in : std_ulogic_vector) return std_ulogic
18
+ function insn_aa(insn_in : std_ulogic_vector) return std_ulogic
19
+ function insn_rc(insn_in : std_ulogic_vector) return std_ulogic
20
+ function insn_oe(insn_in : std_ulogic_vector) return std_ulogic
21
+ function insn_bd(insn_in : std_ulogic_vector) return std_ulogic_vector
22
+ function insn_bf(insn_in : std_ulogic_vector) return std_ulogic_vector
23
+ function insn_bfa(insn_in : std_ulogic_vector) return std_ulogic_vector
24
+ function insn_cr(insn_in : std_ulogic_vector) return std_ulogic_vector
25
+ function insn_bt(insn_in : std_ulogic_vector) return std_ulogic_vector
26
+ function insn_ba(insn_in : std_ulogic_vector) return std_ulogic_vector
27
+ function insn_bb(insn_in : std_ulogic_vector) return std_ulogic_vector
28
+ function insn_fxm(insn_in : std_ulogic_vector) return std_ulogic_vector
29
+ function insn_bo(insn_in : std_ulogic_vector) return std_ulogic_vector
30
+ function insn_bi(insn_in : std_ulogic_vector) return std_ulogic_vector
31
+ function insn_bh(insn_in : std_ulogic_vector) return std_ulogic_vector
32
+ function insn_d(insn_in : std_ulogic_vector) return std_ulogic_vector
33
+ function insn_ds(insn_in : std_ulogic_vector) return std_ulogic_vector
34
+ function insn_to(insn_in : std_ulogic_vector) return std_ulogic_vector
35
+ function insn_bc(insn_in : std_ulogic_vector) return std_ulogic_vector
36
+ function insn_sh(insn_in : std_ulogic_vector) return std_ulogic_vector
37
+ function insn_me(insn_in : std_ulogic_vector) return std_ulogic_vector
38
+ function insn_mb(insn_in : std_ulogic_vector) return std_ulogic_vector
39
+
40
+ end insn_helpers;
41
+
42
+ package body insn_helpers is
43
+
44
+ function insn_rs(insn_in : std_ulogic_vector) return std_ulogic_vector is
45
+ begin
46
+ return insn_in(25 downto 21);
47
+ end function insn_rs;
48
+
49
+ function insn_rt(insn_in : std_ulogic_vector) return std_ulogic_vector is
50
+ begin
51
+ return insn_in(25 downto 21);
52
+ end function insn_rt;
53
+
54
+ function insn_ra(insn_in : std_ulogic_vector) return std_ulogic_vector is
55
+ begin
56
+ return insn_in(20 downto 16);
57
+ end function insn_ra;
58
+
59
+ function insn_rb(insn_in : std_ulogic_vector) return std_ulogic_vector is
60
+ begin
61
+ return insn_in(15 downto 11);
62
+ end function insn_rb;
63
+
64
+ function insn_si(insn_in : std_ulogic_vector) return std_ulogic_vector is
65
+ begin
66
+ return insn_in(15 downto 0);
67
+ end function insn_si;
68
+
69
+ function insn_ui(insn_in : std_ulogic_vector) return std_ulogic_vector is
70
+ begin
71
+ return insn_in(15 downto 0);
72
+ end function insn_ui;
73
+
74
+ function insn_l(insn_in : std_ulogic_vector) return std_ulogic is
75
+ begin
76
+ return insn_in(21);
77
+ end function insn_l;
78
+
79
+ function insn_sh32(insn_in : std_ulogic_vector) return std_ulogic_vector is
80
+ begin
81
+ return insn_in(15 downto 11);
82
+ end function insn_sh32;
83
+
84
+ function insn_mb32(insn_in : std_ulogic_vector) return std_ulogic_vector is
85
+ begin
86
+ return insn_in(10 downto 6);
87
+ end function insn_mb32;
88
+
89
+ function insn_me32(insn_in : std_ulogic_vector) return std_ulogic_vector is
90
+ begin
91
+ return insn_in(5 downto 1);
92
+ end function insn_me32;
93
+
94
+ function insn_li(insn_in : std_ulogic_vector) return std_ulogic_vector is
95
+ begin
96
+ return insn_in(25 downto 2);
97
+ end function insn_li;
98
+
99
+ function insn_lk(insn_in : std_ulogic_vector) return std_ulogic is
100
+ begin
101
+ return insn_in(0);
102
+ end function insn_lk;
103
+
104
+ function insn_aa(insn_in : std_ulogic_vector) return std_ulogic is
105
+ begin
106
+ return insn_in(1);
107
+ end function insn_aa;
108
+
109
+ function insn_rc(insn_in : std_ulogic_vector) return std_ulogic is
110
+ begin
111
+ return insn_in(0);
112
+ end function insn_rc;
113
+
114
+ function insn_oe(insn_in : std_ulogic_vector) return std_ulogic is
115
+ begin
116
+ return insn_in(10);
117
+ end function insn_oe;
118
+
119
+ function insn_bd(insn_in : std_ulogic_vector) return std_ulogic_vector is
120
+ begin
121
+ return insn_in(15 downto 2);
122
+ end function insn_bd;
123
+
124
+ function insn_bf(insn_in : std_ulogic_vector) return std_ulogic_vector is
125
+ begin
126
+ return insn_in(25 downto 23);
127
+ end function insn_bf;
128
+
129
+ function insn_bfa(insn_in : std_ulogic_vector) return std_ulogic_vector is
130
+ begin
131
+ return insn_in(20 downto 18);
132
+ end function insn_bfa;
133
+
134
+ function insn_cr(insn_in : std_ulogic_vector) return std_ulogic_vector is
135
+ begin
136
+ return insn_in(10 downto 1);
137
+ end function insn_cr;
138
+
139
+ function insn_bb(insn_in : std_ulogic_vector) return std_ulogic_vector is
140
+ begin
141
+ return insn_in(15 downto 11);
142
+ end function insn_bb;
143
+
144
+ function insn_ba(insn_in : std_ulogic_vector) return std_ulogic_vector is
145
+ begin
146
+ return insn_in(20 downto 16);
147
+ end function insn_ba;
148
+
149
+ function insn_bt(insn_in : std_ulogic_vector) return std_ulogic_vector is
150
+ begin
151
+ return insn_in(25 downto 21);
152
+ end function insn_bt;
153
+
154
+ function insn_fxm(insn_in : std_ulogic_vector) return std_ulogic_vector is
155
+ begin
156
+ return insn_in(19 downto 12);
157
+ end function insn_fxm;
158
+
159
+ function insn_bo(insn_in : std_ulogic_vector) return std_ulogic_vector is
160
+ begin
161
+ return insn_in(25 downto 21);
162
+ end function insn_bo;
163
+
164
+ function insn_bi(insn_in : std_ulogic_vector) return std_ulogic_vector is
165
+ begin
166
+ return insn_in(20 downto 16);
167
+ end function insn_bi;
168
+
169
+ function insn_bh(insn_in : std_ulogic_vector) return std_ulogic_vector is
170
+ begin
171
+ return insn_in(12 downto 11);
172
+ end function insn_bh;
173
+
174
+ function insn_d(insn_in : std_ulogic_vector) return std_ulogic_vector is
175
+ begin
176
+ return insn_in(15 downto 0);
177
+ end function insn_d;
178
+
179
+ function insn_ds(insn_in : std_ulogic_vector) return std_ulogic_vector is
180
+ begin
181
+ return insn_in(15 downto 2);
182
+ end function insn_ds;
183
+
184
+ function insn_to(insn_in : std_ulogic_vector) return std_ulogic_vector is
185
+ begin
186
+ return insn_in(25 downto 21);
187
+ end function insn_to;
188
+
189
+ function insn_bc(insn_in : std_ulogic_vector) return std_ulogic_vector is
190
+ begin
191
+ return insn_in(10 downto 6);
192
+ end function insn_bc;
193
+
194
+ function insn_sh(insn_in : std_ulogic_vector) return std_ulogic_vector is
195
+ begin
196
+ return insn_in(1) & insn_in(15 downto 11);
197
+ end function insn_sh;
198
+
199
+ function insn_me(insn_in : std_ulogic_vector) return std_ulogic_vector is
200
+ begin
201
+ return insn_in(5) & insn_in(10 downto 6);
202
+ end function insn_me;
203
+
204
+ function insn_mb(insn_in : std_ulogic_vector) return std_ulogic_vector is
205
+ begin
206
+ return insn_in(5) & insn_in(10 downto 6);
207
+ end function insn_mb;
208
+ end insn_helpers;
@@ -0,0 +1 @@
1
+ ../microwatt/loadstore1.vhdl
@@ -0,0 +1,222 @@
1
+ -- generated by Vertigo VHDL tool
2
+ library ieee;
3
+ use ieee.std_logic_1164.all;
4
+ use ieee.numeric_std.all;
5
+ library work;
6
+ use work.common.all;
7
+ use work.helpers.all;
8
+
9
+ entity loadstore1 is
10
+ port(
11
+ clk : in std_ulogic;
12
+ rst : in std_ulogic;
13
+ l_in : in execute1toloadstore1type;
14
+ l_out : out loadstore1towritebacktype;
15
+ d_out : out loadstore1todcachetype;
16
+ d_in : in dcachetoloadstore1type;
17
+ dc_stall : in std_ulogic;
18
+ stall_out : out std_ulogic);
19
+ end entity loadstore1;
20
+
21
+ architecture behave of loadstore1 is
22
+
23
+ type state_t is (idle,second_req,first_ack_wait,last_ack_wait,ld_update);
24
+
25
+ type reg_stage_t is record
26
+ load : std_ulogic;
27
+ addr : std_ulogic_vector(63 downto 0);
28
+ store_data : std_ulogic_vector(63 downto 0);
29
+ load_data : std_ulogic_vector(63 downto 0);
30
+ write_reg : gpr_index_t;
31
+ length : std_ulogic_vector(3 downto 0);
32
+ byte_reverse : std_ulogic;
33
+ sign_extend : std_ulogic;
34
+ update : std_ulogic;
35
+ update_reg : gpr_index_t;
36
+ xerc : xer_common_t;
37
+ reserve : std_ulogic;
38
+ rc : std_ulogic;
39
+ nc : std_ulogic;
40
+ state : state_t;
41
+ second_bytes : std_ulogic_vector(7 downto 0);
42
+ end record;
43
+
44
+ type byte_sel_t is array(range 0 to 7) of std_ulogic;
45
+
46
+ subtype byte_trim_t is std_ulogic_vector(1 downto 0);
47
+
48
+ type trim_ctl_t is array(range 0 to 7) of byte_trim_t;
49
+ signal r : reg_stage_t;
50
+ signal rin : reg_stage_t;
51
+ signal lsu_sum : std_ulogic_vector(63 downto 0);
52
+
53
+ function length_to_sel(length : in std_logic_vector(3 downto 0)) return std_ulogic_vector is
54
+ begin
55
+ case length is
56
+ when "0001" =>
57
+ return "00000001";
58
+ when "0010" =>
59
+ return "00000011";
60
+ when "0100" =>
61
+ return "00001111";
62
+ when "1000" =>
63
+ return "11111111";
64
+ when others =>
65
+ return "00000000";
66
+ end case;
67
+ end function length_to_sel;
68
+
69
+ function xfer_data_sel(size : in std_logic_vector(3 downto 0);address : in std_logic_vector(2 downto 0)) return std_ulogic_vector is
70
+ variable longsel : std_ulogic_vector(15 downto 0);
71
+ begin
72
+ longsel := "00000000" & length_to_sel(size);
73
+ return std_ulogic_vector(shift_left(unsigned(longsel),to_integer(unsigned(address))));
74
+ end function xfer_data_sel;
75
+ begin
76
+
77
+ lsu_sum <= std_ulogic_vector(unsigned(l_in.addr1) + unsigned(l_in.addr2)) when l_in.valid = '1' else (others => '0');
78
+
79
+ loadstore1_0 : process(clk)
80
+ begin
81
+ if rising_edge(clk) then
82
+ if rst = '1' then
83
+ r.state <= idle;
84
+ else
85
+ r <= rin;
86
+ end if;
87
+ end if;
88
+ end process;
89
+
90
+ loadstore1_1 : process(all)
91
+ variable v : reg_stage_t;
92
+ variable brev_lenm1 : unsigned(2 downto 0);
93
+ variable byte_offset : unsigned(2 downto 0);
94
+ variable j : integer;
95
+ variable k : unsigned(2 downto 0);
96
+ variable kk : unsigned(3 downto 0);
97
+ variable long_sel : std_ulogic_vector(15 downto 0);
98
+ variable byte_sel : std_ulogic_vector(7 downto 0);
99
+ variable req : std_ulogic;
100
+ variable stall : std_ulogic;
101
+ variable addr : std_ulogic_vector(63 downto 0);
102
+ variable wdata : std_ulogic_vector(63 downto 0);
103
+ variable write_enable : std_ulogic;
104
+ variable do_update : std_ulogic;
105
+ variable two_dwords : std_ulogic;
106
+ variable done : std_ulogic;
107
+ variable data_permuted : std_ulogic_vector(63 downto 0);
108
+ variable data_trimmed : std_ulogic_vector(63 downto 0);
109
+ variable use_second : byte_sel_t;
110
+ variable trim_ctl : trim_ctl_t;
111
+ variable negative : std_ulogic;
112
+ begin
113
+ v := r;
114
+ req := '0';
115
+ stall := '0';
116
+ done := '0';
117
+ byte_sel := (others => '0');
118
+ addr := lsu_sum;
119
+ write_enable := '0';
120
+ do_update := '0';
121
+ two_dwords := or(r.second_bytes);
122
+ if r.load = '1' then
123
+ byte_offset := unsigned(r.addr(2 downto 0));
124
+ brev_lenm1 := "000";
125
+ if r.byte_reverse = '1' then
126
+ brev_lenm1 := unsigned(r.length(2 downto 0)) - 1;
127
+ end if;
128
+ negative := (r.length(3) and data_permuted(63)) or (r.length(2) and data_permuted(31)) or (r.length(1) and data_permuted(15)) or (r.length(0) and data_permuted(7));
129
+ end if;
130
+ case r.state is
131
+ when idle =>
132
+ if l_in.valid = '1' then
133
+ v.load := l_in.load;
134
+ v.addr := lsu_sum;
135
+ v.write_reg := l_in.write_reg;
136
+ v.length := l_in.length;
137
+ v.byte_reverse := l_in.byte_reverse;
138
+ v.sign_extend := l_in.sign_extend;
139
+ v.update := l_in.update;
140
+ v.update_reg := l_in.update_reg;
141
+ v.xerc := l_in.xerc;
142
+ v.reserve := l_in.reserve;
143
+ v.rc := l_in.rc;
144
+ v.nc := l_in.ci;
145
+ if lsu_sum(31 downto 28) = "1100" then
146
+ v.nc := '1';
147
+ end if;
148
+ long_sel := xfer_data_sel(l_in.length,v.addr(2 downto 0));
149
+ byte_sel := long_sel(7 downto 0);
150
+ v.second_bytes := long_sel(15 downto 8);
151
+ v.addr := lsu_sum;
152
+ if v.load = '0' then
153
+ byte_offset := unsigned(lsu_sum(2 downto 0));
154
+ brev_lenm1 := "000";
155
+ if l_in.byte_reverse = '1' then
156
+ brev_lenm1 := unsigned(l_in.length(2 downto 0)) - 1;
157
+ end if;
158
+ end if;
159
+ req := '1';
160
+ stall := '1';
161
+ if long_sel(15 downto 8) = "00000000" then
162
+ v.state := last_ack_wait;
163
+ else
164
+ v.state := second_req;
165
+ end if;
166
+ end if;
167
+ when second_req =>
168
+ addr := std_ulogic_vector(unsigned(r.addr(63 downto 3)) + 1) & "000";
169
+ byte_sel := r.second_bytes;
170
+ req := '1';
171
+ stall := '1';
172
+ v.state := first_ack_wait;
173
+ when first_ack_wait =>
174
+ stall := '1';
175
+ if d_in.valid = '1' then
176
+ v.state := last_ack_wait;
177
+ if r.load = '1' then
178
+ v.load_data := data_permuted;
179
+ end if;
180
+ end if;
181
+ when last_ack_wait =>
182
+ stall := '1';
183
+ if d_in.valid = '1' then
184
+ write_enable := r.load;
185
+ if r.load = '1' and r.update = '1' then
186
+ v.state := ld_update;
187
+ else
188
+ do_update := r.update;
189
+ stall := '0';
190
+ done := '1';
191
+ v.state := idle;
192
+ end if;
193
+ end if;
194
+ when ld_update =>
195
+ do_update := '1';
196
+ v.state := idle;
197
+ done := '1';
198
+ end case;
199
+ d_out.valid <= req;
200
+ d_out.load <= v.load;
201
+ d_out.nc <= v.nc;
202
+ d_out.reserve <= v.reserve;
203
+ d_out.addr <= addr;
204
+ d_out.data <= v.store_data;
205
+ d_out.byte_sel <= byte_sel;
206
+ l_out.valid <= done;
207
+ if do_update = '1' then
208
+ l_out.write_enable <= '1';
209
+ l_out.write_reg <= r.update_reg;
210
+ l_out.write_data <= r.addr;
211
+ else
212
+ l_out.write_enable <= write_enable;
213
+ l_out.write_reg <= r.write_reg;
214
+ l_out.write_data <= data_trimmed;
215
+ end if;
216
+ l_out.xerc <= r.xerc;
217
+ l_out.rc <= r.rc and done;
218
+ l_out.store_done <= d_in.store_done;
219
+ stall_out <= stall;
220
+ rin <= v;
221
+ end process;
222
+ end behave;
@@ -0,0 +1 @@
1
+ ../microwatt/logical.vhdl
@@ -0,0 +1,87 @@
1
+ -- generated by Vertigo VHDL tool
2
+ library ieee;
3
+ use ieee.std_logic_1164.all;
4
+ use ieee.numeric_std.all;
5
+ library work;
6
+ use work.decode_types.all;
7
+
8
+ entity logical is
9
+ port(
10
+ rs : in std_ulogic_vector(63 downto 0);
11
+ rb : in std_ulogic_vector(63 downto 0);
12
+ op : in insn_type_t;
13
+ invert_in : in std_ulogic;
14
+ invert_out : in std_ulogic;
15
+ result : out std_ulogic_vector(63 downto 0);
16
+ datalen : in std_logic_vector(3 downto 0);
17
+ popcnt : out std_ulogic_vector(63 downto 0);
18
+ parity : out std_ulogic_vector(63 downto 0));
19
+ end entity logical;
20
+
21
+ architecture behaviour of logical is
22
+
23
+ subtype twobit is unsigned(1 downto 0);
24
+
25
+ type twobit32 is array(range 0 to 31) of twobit;
26
+ signal pc2 : twobit32;
27
+
28
+ subtype threebit is unsigned(2 downto 0);
29
+
30
+ type threebit16 is array(range 0 to 15) of threebit;
31
+ signal pc4 : threebit16;
32
+
33
+ subtype fourbit is unsigned(3 downto 0);
34
+
35
+ type fourbit8 is array(range 0 to 7) of fourbit;
36
+ signal pc8 : fourbit8;
37
+
38
+ subtype sixbit is unsigned(5 downto 0);
39
+
40
+ type sixbit2 is array(range 0 to 1) of sixbit;
41
+ signal pc32 : sixbit2;
42
+ signal par0 : std_ulogic;
43
+ signal par1 : std_ulogic;
44
+ begin
45
+
46
+
47
+ logical_0 : process(all)
48
+ variable rb_adj : std_ulogic_vector(63 downto 0);
49
+ variable tmp : std_ulogic_vector(63 downto 0);
50
+ begin
51
+ rb_adj := rb;
52
+ if invert_in = '1' then
53
+ rb_adj := rb;
54
+ end if;
55
+ case op is
56
+ when op_and =>
57
+ tmp := rs and rb_adj;
58
+ when op_or =>
59
+ tmp := rs or rb_adj;
60
+ when others =>
61
+ tmp := rs xor rb_adj;
62
+ end case;
63
+ result <= tmp;
64
+ if invert_out = '1' then
65
+ result <= tmp;
66
+ end if;
67
+ ;
68
+ ;
69
+ popcnt <= (others => '0');
70
+ if datalen(3 downto 2) = "00" then
71
+ ;
72
+ elsif datalen(3) = '0' then
73
+ ;
74
+ else
75
+ popcnt(6 downto 0) <= std_ulogic_vector(('0' & pc32(0)) + ('0' & pc32(1)));
76
+ end if;
77
+ par0 <= rs(0) xor rs(8) xor rs(16) xor rs(24);
78
+ par1 <= rs(32) xor rs(40) xor rs(48) xor rs(56);
79
+ parity <= (others => '0');
80
+ if datalen(3) = '1' then
81
+ parity(0) <= par0 xor par1;
82
+ else
83
+ parity(0) <= par0;
84
+ parity(32) <= par1;
85
+ end if;
86
+ end process;
87
+ end behaviour;