mirror of
https://github.com/verilator/verilator.git
synced 2026-10-05 17:43:31 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
44ce83cd8e | ||
|
|
c199930943 | ||
|
|
81fc1d48a6 | ||
|
|
f330f16bf6 | ||
|
|
10a6b566ef | ||
|
|
cff5485821 | ||
|
|
dcbdac1b81 | ||
|
|
a59777aa75 | ||
|
|
d82b9128d0 | ||
|
|
ab4f18c892 | ||
|
|
4480938b25 | ||
|
|
11a1b201a9 | ||
|
|
1a8b192e40 | ||
|
|
aee3a32354 | ||
|
|
35e9489f33 | ||
|
|
5c6d74cd80 | ||
|
|
8611ff230d | ||
|
|
8ef4097f00 | ||
|
|
fe684e8733 | ||
|
|
96f8bbd023 | ||
|
|
95ffcad12e | ||
|
|
ebed1a9000 | ||
|
|
2240f42bfa | ||
|
|
ac4f0da9ee | ||
|
|
559852f60b | ||
|
|
b0669f3aca | ||
|
|
00979ede14 | ||
|
|
13569ed98b | ||
|
|
809a6de9cd | ||
|
|
d65d8fda54 | ||
|
|
2076b0219d | ||
|
|
32f93a8a1e | ||
|
|
e28175108f | ||
|
|
b81295230a | ||
|
|
6ae7f7b152 | ||
|
|
03026b63b9 | ||
|
|
38e586fabe | ||
|
|
3d6e8e9eb0 | ||
|
|
df192f2b61 | ||
|
|
17ad59394f | ||
|
|
682c2a610f | ||
|
|
59782266b9 | ||
|
|
4885bcb93c | ||
|
|
d47d3b5162 | ||
|
|
99455a16bf | ||
|
|
a86e1953eb | ||
|
|
f63dfd7028 | ||
|
|
7a413a121d | ||
|
|
0f6b625db8 | ||
|
|
f134ac4f2f | ||
|
|
39eeda50c6 | ||
|
|
09ca4ce791 | ||
|
|
2ff22d9050 | ||
|
|
c726ad0142 | ||
|
|
0c0198cf55 | ||
|
|
d480c2f033 | ||
|
|
8ebe86e54b | ||
|
|
62af9dbed4 | ||
|
|
3eb0ff8aa0 | ||
|
|
ce5a70fbca | ||
|
|
c36d9a68f5 | ||
|
|
8c5aa21a11 | ||
|
|
47b5e36e60 | ||
|
|
a481638edb | ||
|
|
de7caad710 | ||
|
|
b1c14e485a | ||
|
|
66727670f9 | ||
|
|
b9322206d7 | ||
|
|
617424e04a | ||
|
|
e9c4ffa04e | ||
|
|
30c2e53f9e | ||
|
|
a250decfaa | ||
|
|
21a380def0 | ||
|
|
77e30d4920 | ||
|
|
98dcbc6b3e | ||
|
|
6ce81698e7 | ||
|
|
30be381aa8 | ||
|
|
e04bc16ffa | ||
|
|
2b26ca2c07 | ||
|
|
ce178ec987 | ||
|
|
fcb733e8d0 | ||
|
|
f87107e757 | ||
|
|
cf9f466f0a | ||
|
|
28cbf39995 | ||
|
|
4767083a72 | ||
|
|
704f40b1a2 | ||
|
|
c5f859c9a3 | ||
|
|
abe95f3ab3 | ||
|
|
2eda38c4d1 | ||
|
|
5811ec07e6 | ||
|
|
8a5d13bce2 | ||
|
|
3232bdf016 | ||
|
|
7ef620dc64 | ||
|
|
8043a9c666 | ||
|
|
f1b10e2b4c | ||
|
|
c1a9ada279 | ||
|
|
2aed499e00 | ||
|
|
b2c5f8e74e | ||
|
|
9ef200d5a3 | ||
|
|
8a3227697e | ||
|
|
530ab17c8b | ||
|
|
ca8da1f54f | ||
|
|
cc4cb4e006 | ||
|
|
e40ad4a095 | ||
|
|
67a0ad02d2 | ||
|
|
055a978866 | ||
|
|
67d52372e5 | ||
|
|
a28896d967 | ||
|
|
9ff5ef4ad5 | ||
|
|
25f08b29c6 | ||
|
|
7febeab275 | ||
|
|
c0c038c887 | ||
|
|
8a5b8d5f38 | ||
|
|
ff0dd26fe5 | ||
|
|
f781085755 | ||
|
|
8f6efdaf5c | ||
|
|
4b5f0fd173 | ||
|
|
1224c69126 | ||
|
|
bcb766b4ce | ||
|
|
63373f6f4c | ||
|
|
40bdd85a07 | ||
|
|
974bf1d643 | ||
|
|
8ce60e955f | ||
|
|
171960635e | ||
|
|
2ab819aef0 | ||
|
|
647c321437 | ||
|
|
2bbb9dccb1 | ||
|
|
bac5d32582 | ||
|
|
3ebd6915f3 | ||
|
|
f852ba8a33 | ||
|
|
8f6015aad5 | ||
|
|
352adbed74 | ||
|
|
0cbfd29ac5 | ||
|
|
9f977ed419 | ||
|
|
baa6a2c31a | ||
|
|
3b33438e91 | ||
|
|
17ee8579a4 | ||
|
|
94f7133c6f | ||
|
|
6d58d32a0f | ||
|
|
c9d000467b | ||
|
|
e15d3afb7b | ||
|
|
712bc43a06 | ||
|
|
71fa09a25b | ||
|
|
89c3c5f952 | ||
|
|
7311c84937 | ||
|
|
8078fc0965 | ||
|
|
31a6a968cc | ||
|
|
1e4f471049 | ||
|
|
1232746395 | ||
|
|
1852ae1cc8 | ||
|
|
77f79f0114 | ||
|
|
6081c262f2 | ||
|
|
46ab907f6a | ||
|
|
8700564197 | ||
|
|
af8cc9127f | ||
|
|
c73336f8f5 | ||
|
|
4361fb838f | ||
|
|
6b8afe8137 | ||
|
|
a7c2037b7a | ||
|
|
9b09309f51 | ||
|
|
da0da9e258 | ||
|
|
58a42834a6 | ||
|
|
8c836e1222 | ||
|
|
ce179bd2e3 | ||
|
|
68e5c95b82 | ||
|
|
07db53e54f | ||
|
|
0ed58a4217 | ||
|
|
8e6d68147c | ||
|
|
e08b9b84b5 | ||
|
|
2f28c5f5b4 | ||
|
|
91f1acd85f | ||
|
|
ed1e5fb509 | ||
|
|
99b2ab7540 | ||
|
|
763b9909f1 | ||
|
|
dfcd412e5f | ||
|
|
307549e8a6 | ||
|
|
09b79a731a | ||
|
|
4544a2fd99 | ||
|
|
e09c918198 | ||
|
|
9bf6135f6d | ||
|
|
d472ef63e9 | ||
|
|
f1c04b5d25 | ||
|
|
1cf29c4d20 | ||
|
|
977a767477 | ||
|
|
771a301f66 | ||
|
|
a9954a71c3 | ||
|
|
967dc24fda | ||
|
|
e1e45cf13c | ||
|
|
bd89c71694 | ||
|
|
633131b984 | ||
|
|
99db18b6c3 | ||
|
|
961a8e190f | ||
|
|
045ff25f80 | ||
|
|
66209d1114 | ||
|
|
3f1fe2d18a | ||
|
|
8b6fb26272 | ||
|
|
881362bb04 | ||
|
|
239ef1ae6d | ||
|
|
9eaec3b5c1 | ||
|
|
dd4aa948ae | ||
|
|
12fa085b26 | ||
|
|
9d6b0d7dd6 | ||
|
|
a1405dac8e | ||
|
|
cb115e1a15 | ||
|
|
1c7eb89df5 | ||
|
|
6e91f82a7d | ||
|
|
17123cd0e0 | ||
|
|
3f0c5b7550 | ||
|
|
f6e0e9adec | ||
|
|
dea1531f40 | ||
|
|
edcfaa888d | ||
|
|
28b9db1903 | ||
|
|
9e64be71a7 | ||
|
|
99a8845a96 | ||
|
|
be4692772c | ||
|
|
4f315d9078 | ||
|
|
f133c4d0b3 | ||
|
|
8490046028 | ||
|
|
d6ac351dcb | ||
|
|
502bd6cbd6 | ||
|
|
d7b6b53c4d | ||
|
|
96725b3431 | ||
|
|
8686ed9b00 | ||
|
|
32e1207782 | ||
|
|
900115bb2d | ||
|
|
3469c78153 | ||
|
|
baa634343b | ||
|
|
1471f5691a | ||
|
|
e556269692 | ||
|
|
d1af69f91d | ||
|
|
fa904f386c | ||
|
|
a4daae66de | ||
|
|
c813026566 | ||
|
|
314cd92129 | ||
|
|
3bc260c55d | ||
|
|
4c0f95af10 | ||
|
|
35fe205fd6 | ||
|
|
70cf2582d6 | ||
|
|
ec620387af | ||
|
|
e1e4bde125 | ||
|
|
b947391662 | ||
|
|
edc0f442e4 | ||
|
|
562b9551bf | ||
|
|
f74af949da | ||
|
|
81e806e895 | ||
|
|
7d4958264a | ||
|
|
88b87429dc | ||
|
|
429f463032 | ||
|
|
af4a39603c | ||
|
|
a13d230d8c | ||
|
|
b7bd5956ea | ||
|
|
1a36e05cc6 | ||
|
|
71265a8ec9 | ||
|
|
3a720204c2 | ||
|
|
a95f58749f | ||
|
|
9e58ede480 | ||
|
|
cf2ac30f66 | ||
|
|
68b22a4a3d | ||
|
|
875dc9a27e | ||
|
|
1332446f2a | ||
|
|
6b798830c9 | ||
|
|
ffa23b59b8 | ||
|
|
7d27461054 | ||
|
|
b3f318d8ab | ||
|
|
4a14788c9b | ||
|
|
5560da2934 | ||
|
|
43ce048f9e | ||
|
|
b045111a67 | ||
|
|
654571bd1c | ||
|
|
a3fd105acb | ||
|
|
97561bf064 | ||
|
|
a4820fc700 | ||
|
|
ee469eedaf | ||
|
|
a49d819437 | ||
|
|
cbb9288cb1 | ||
|
|
173efbc829 | ||
|
|
0fef3b02ec | ||
|
|
d1ee6689c4 | ||
|
|
b3eab9d78a | ||
|
|
defd05bdd7 | ||
|
|
a7e5cccf33 | ||
|
|
0f857ce423 | ||
|
|
83cf1882de | ||
|
|
e17543d6d8 | ||
|
|
dacf45fea9 | ||
|
|
13a20c5ee9 | ||
|
|
58dfe9d071 | ||
|
|
6c5cc885a6 | ||
|
|
2c44ab61ac | ||
|
|
0847ea57ae | ||
|
|
9af84c71f5 | ||
|
|
4ce77d3e68 | ||
|
|
3c67791624 | ||
|
|
a281c00752 | ||
|
|
2ca418288d | ||
|
|
bea34d0ced | ||
|
|
a5f2ce0dad | ||
|
|
07ae7146e3 | ||
|
|
8548ecfdac | ||
|
|
7e54ff1b37 | ||
|
|
a4b9745e6e | ||
|
|
8612ba2b8d | ||
|
|
fea6e047e2 | ||
|
|
01ef7122e9 | ||
|
|
ac43e7322b | ||
|
|
02a3f2089f | ||
|
|
33ad834106 | ||
|
|
efe739c52f | ||
|
|
5cd531a5e0 | ||
|
|
0e8dfdbb71 | ||
|
|
ec32a9b976 | ||
|
|
1aae6df669 | ||
|
|
f7641d2ecc | ||
|
|
5f27c41ee3 | ||
|
|
51df77099a | ||
|
|
b8b7e5c978 | ||
|
|
dddcfeb482 | ||
|
|
8d63f83177 | ||
|
|
d43e9aa2c5 | ||
|
|
a2c1b7f827 | ||
|
|
2fff92fe78 | ||
|
|
ba9af4aabf | ||
|
|
ef02678305 | ||
|
|
6990db70fa | ||
|
|
af5616c077 | ||
|
|
009f053d6e | ||
|
|
6903c52ef7 | ||
|
|
aa65dfb1bc | ||
|
|
84a2cd0ec7 | ||
|
|
8e7559c6c9 | ||
|
|
951521320a | ||
|
|
abc0eb92a0 | ||
|
|
c514bb26e8 | ||
|
|
5cb6474cc6 | ||
|
|
b8eb6368e9 | ||
|
|
6239deb1df | ||
|
|
89c2a6070a | ||
|
|
c53ea10c75 | ||
|
|
8fa54b1c4d | ||
|
|
e5fae03364 | ||
|
|
081fd3b789 | ||
|
|
0edd3c9e95 | ||
|
|
659c7b78d5 | ||
|
|
34ef3c9c38 | ||
|
|
90af180ec1 | ||
|
|
0d71c1154d | ||
|
|
5da5e32e86 | ||
|
|
ea59a39661 | ||
|
|
f5ca1a04cc | ||
|
|
b6c905dffc | ||
|
|
e4a3f9b38c | ||
|
|
b3e2d26e35 | ||
|
|
79e9fbaeb7 | ||
|
|
f5f5cd522b | ||
|
|
e713c8ce57 | ||
|
|
94ed817897 | ||
|
|
ff360738b5 | ||
|
|
f7f73a0825 | ||
|
|
2cedd14d43 | ||
|
|
77c2d49d1a | ||
|
|
dd8d5ef687 | ||
|
|
cfb05cd70a | ||
|
|
6f2f668449 | ||
|
|
6ffbb7cabf | ||
|
|
6c1782e4de | ||
|
|
10e3cc6e3b | ||
|
|
34424e70d8 | ||
|
|
38ad8727af | ||
|
|
4e115d4b69 | ||
|
|
f6f8073058 | ||
|
|
902ba752a3 | ||
|
|
97d9de3dad | ||
|
|
97fef7c60b | ||
|
|
a58e7d94ec | ||
|
|
c0be8bcefb | ||
|
|
8846b365f4 | ||
|
|
72eb361131 | ||
|
|
b83b606267 | ||
|
|
59d7d9e8c3 | ||
|
|
3411279294 | ||
|
|
8d6bea8975 | ||
|
|
01725f662f | ||
|
|
d841e68f4f | ||
|
|
13ecb8e177 | ||
|
|
26436cf4dd | ||
|
|
96c70ea2df | ||
|
|
c8849094fc | ||
|
|
afea6d84e3 | ||
|
|
1fb0af7fba | ||
|
|
8ad1a68420 | ||
|
|
6ef7d5f0fd | ||
|
|
d0fbdfac07 | ||
|
|
16997d153f | ||
|
|
7777d10e9b | ||
|
|
00214f738f | ||
|
|
07e6bc17db | ||
|
|
afdfa4df87 | ||
|
|
1f714c6813 | ||
|
|
5df3032b11 | ||
|
|
eac3458647 | ||
|
|
00efa05b50 | ||
|
|
cc1d380864 | ||
|
|
f96942a526 | ||
|
|
b23fc06388 | ||
|
|
f818ddc71c | ||
|
|
37c8cc82b2 | ||
|
|
03ebd5554f | ||
|
|
a2a7021914 | ||
|
|
c6650f88e1 | ||
|
|
55a25674a2 | ||
|
|
05c3d520a6 | ||
|
|
6b3304320b | ||
|
|
8d15276625 | ||
|
|
354f107fed | ||
|
|
1ff55c20e0 | ||
|
|
9583f0d3cc | ||
|
|
3acb85a005 | ||
|
|
08d041cb93 | ||
|
|
274b2002c2 | ||
|
|
681e91f9d8 | ||
|
|
6e333bd9ab | ||
|
|
6a331e37fc | ||
|
|
d8a020905a | ||
|
|
efa6f4cd95 | ||
|
|
ca537dc3ed | ||
|
|
3b64f54cea | ||
|
|
32c1e38b84 | ||
|
|
a7aa8820e1 | ||
|
|
2582a83376 | ||
|
|
0094cd7a81 | ||
|
|
d9b33d74a4 | ||
|
|
539a773ea7 | ||
|
|
b1831d7e33 | ||
|
|
b8ccb7a4c1 | ||
|
|
0eb75a41bb | ||
|
|
4cc47e3297 | ||
|
|
7bf3366041 | ||
|
|
c4b9f4bccf | ||
|
|
455c552132 | ||
|
|
f26fb51509 | ||
|
|
ab3c6576ed | ||
|
|
d1bd994113 | ||
|
|
d1548b1161 | ||
|
|
8a43f41ed6 | ||
|
|
42759e4011 | ||
|
|
27fa19eb94 | ||
|
|
426ed8589b | ||
|
|
44e53129a0 | ||
|
|
cf2e8f7a9c | ||
|
|
46be6d32c9 | ||
|
|
93d1fd6bb5 | ||
|
|
f700a73b3e | ||
|
|
abd69167ef | ||
|
|
60f2f176a2 | ||
|
|
3a51e84ebc | ||
|
|
a2a09253a2 | ||
|
|
ef884143d1 | ||
|
|
62a7d713a7 | ||
|
|
aaf5b7c2c0 | ||
|
|
30aa180211 | ||
|
|
0d4270c979 | ||
|
|
3505486ec8 | ||
|
|
9b0f2cce86 | ||
|
|
0e1f8db0d1 | ||
|
|
8a4aeddbb0 | ||
|
|
e8636f987f | ||
|
|
0198a2e9f3 | ||
|
|
db92ab47ba | ||
|
|
47107a5a36 | ||
|
|
e01c9df35e | ||
|
|
8f16557499 | ||
|
|
89fb57e54f | ||
|
|
8a3e9748b3 | ||
|
|
66b23be746 | ||
|
|
f0cdae129e | ||
|
|
ede7236945 | ||
|
|
a226111829 | ||
|
|
49edcbc2ac | ||
|
|
6050ab311e | ||
|
|
83b5c981d0 | ||
|
|
2685037ca2 | ||
|
|
940dc98c66 | ||
|
|
49353784fd | ||
|
|
2e5919549c | ||
|
|
8170391573 | ||
|
|
61e4b0a472 | ||
|
|
15af706286 | ||
|
|
2a43410fa6 | ||
|
|
5cc11839b5 | ||
|
|
d1bfeae026 | ||
|
|
e0b2c46664 | ||
|
|
ea61559ab5 | ||
|
|
6a5a2a56d7 | ||
|
|
5cbf80918f | ||
|
|
196e3a9712 | ||
|
|
3798b80091 | ||
|
|
689e4cf1d3 | ||
|
|
64f11251b6 | ||
|
|
6cd2bd2972 | ||
|
|
d396c55e34 | ||
|
|
45c9939a5e | ||
|
|
ad2929dff0 | ||
|
|
d3e1dfd3f5 | ||
|
|
14b48140bd | ||
|
|
7be1678fb0 | ||
|
|
d464ce1477 | ||
|
|
0a04f79576 | ||
|
|
b8098098d8 | ||
|
|
dc26815b1c | ||
|
|
f2028b60af | ||
|
|
06c7d8ce3b | ||
|
|
160505c5a4 | ||
|
|
3df9b4230b | ||
|
|
13163aef24 | ||
|
|
5c2b5bd782 | ||
|
|
da1ebcb4e4 | ||
|
|
8dbfc940ba | ||
|
|
e0654dc218 | ||
|
|
74a92e739f | ||
|
|
304a24d03a | ||
|
|
5ae1ce90ad | ||
|
|
d87b9d25ca | ||
|
|
9bc8d77f39 | ||
|
|
b7e4083e70 | ||
|
|
595419b370 | ||
|
|
442e4f35f0 | ||
|
|
e8b8b33ff6 | ||
|
|
e4d638c73d | ||
|
|
bccb9f794c | ||
|
|
fe0dae74c1 | ||
|
|
b59c23d346 | ||
|
|
6047049fc7 | ||
|
|
08e650a2b4 | ||
|
|
11d4d6562f | ||
|
|
5c9da65606 | ||
|
|
97d89cce35 | ||
|
|
cc45a3dd72 | ||
|
|
870918a788 | ||
|
|
41be66af95 | ||
|
|
9ad252be34 | ||
|
|
1f344ac99e | ||
|
|
8b738c0022 | ||
|
|
57fbf38fb2 | ||
|
|
4cd01bc99a | ||
|
|
fc0cf00b1d | ||
|
|
4333c201f1 | ||
|
|
1f5913a83c | ||
|
|
159c653b4b | ||
|
|
47a2e2aeb9 | ||
|
|
98b0d19363 | ||
|
|
24a0873f6d | ||
|
|
c5fee7c456 | ||
|
|
d11592cadd | ||
|
|
8ef9ac7dba | ||
|
|
a5aa0e2b0a | ||
|
|
f8ae08c0c2 | ||
|
|
72f5d39ace | ||
|
|
5c9801d42c | ||
|
|
c9ee425ed5 | ||
|
|
1871e2b541 | ||
|
|
3e39c55a97 | ||
|
|
e4d6fa0e3b | ||
|
|
9f8dbc91f2 | ||
|
|
0e37747d2c | ||
|
|
a8519a7a53 | ||
|
|
d4159811d2 | ||
|
|
b2ca4995ab | ||
|
|
7876fe94ad | ||
|
|
cc9f7d1ac3 | ||
|
|
94c295f26a | ||
|
|
8c51b5a980 | ||
|
|
4f98f84da9 | ||
|
|
63a429dd64 | ||
|
|
9c3331927b | ||
|
|
3a6edae59d | ||
|
|
75794e2eaa | ||
|
|
24efa6c19a | ||
|
|
7a8c5ecfe1 | ||
|
|
4684f1d4cc | ||
|
|
ef5c31b4c9 | ||
|
|
9d21c5441b | ||
|
|
24fe724e0b | ||
|
|
acf4a3fa99 | ||
|
|
3ed8d968ff | ||
|
|
45c09f3fae | ||
|
|
c93d28050e | ||
|
|
15abb4d590 | ||
|
|
ae98e87222 | ||
|
|
77f6b8cf5f | ||
|
|
573e79a329 | ||
|
|
aaac5d4685 | ||
|
|
b02e353ad1 | ||
|
|
80a269f49a | ||
|
|
75f28fd446 | ||
|
|
ec538c02d8 | ||
|
|
f7b93c8718 | ||
|
|
18ae08e14a | ||
|
|
bffe658026 | ||
|
|
789917cd06 | ||
|
|
8f838433df | ||
|
|
0b84222500 | ||
|
|
aad5c3ae75 | ||
|
|
b586e071fb | ||
|
|
c8e437c45c | ||
|
|
4d034d774d | ||
|
|
4627716aa4 | ||
|
|
847dbbbaf0 | ||
|
|
c011842edf | ||
|
|
aabb7394c3 | ||
|
|
d90064eaee | ||
|
|
ec8dbbffed | ||
|
|
0070520edb | ||
|
|
8e646bc55f | ||
|
|
e97dbf9537 | ||
|
|
0ef3baa87d | ||
|
|
3a777c2a37 | ||
|
|
237f4806bf | ||
|
|
8ec8c0ea76 | ||
|
|
dfe66a2b77 | ||
|
|
a18d6c8159 | ||
|
|
a0b09b6450 | ||
|
|
ca24357611 | ||
|
|
78c16081a4 | ||
|
|
e37dce9d85 | ||
|
|
43694ec87c | ||
|
|
22939d7473 | ||
|
|
9e3a88c41d | ||
|
|
cf4bf9b7a5 | ||
|
|
d065662afc | ||
|
|
70e2538436 | ||
|
|
338ebcd6f0 | ||
|
|
ea8b416e91 | ||
|
|
de81593e98 | ||
|
|
84562f98de | ||
|
|
5520759d9e | ||
|
|
9156a0e400 | ||
|
|
736bf75a50 | ||
|
|
81ef9b5dd2 | ||
|
|
2f18a52118 | ||
|
|
f3ed36840e | ||
|
|
129610821f | ||
|
|
4cd0310516 | ||
|
|
8b245138ee | ||
|
|
4f962bddd8 | ||
|
|
02738ec4ea | ||
|
|
e8a23cf8bc | ||
|
|
39ecfd9900 | ||
|
|
d6a7073a2b | ||
|
|
45eddfb335 | ||
|
|
d4b9b5aba6 | ||
|
|
b1bf742544 | ||
|
|
ebab30d864 | ||
|
|
cdd70ff8fc | ||
|
|
ad4c8ee955 | ||
|
|
2edfe7b8a8 | ||
|
|
3444dad9ce | ||
|
|
b8842f7e55 | ||
|
|
86d85412e1 | ||
|
|
2b56acb39a | ||
|
|
35a40b4930 | ||
|
|
c1f2b2cf93 | ||
|
|
011e9f3b0a | ||
|
|
dddc51b75c | ||
|
|
5187096bf9 | ||
|
|
ae33a1ceb1 | ||
|
|
d225e46e4a | ||
|
|
dcf946b437 | ||
|
|
2a5123f318 | ||
|
|
43d07235c9 | ||
|
|
1fad055286 | ||
|
|
e89cb1b9f7 | ||
|
|
4c7a397dc4 | ||
|
|
047a08c999 | ||
|
|
1d74657bbb | ||
|
|
7085fdbc27 | ||
|
|
4c9c39bd08 | ||
|
|
ec82243ee6 | ||
|
|
65bb93a6c5 | ||
|
|
6e7f28785e | ||
|
|
35654b5355 | ||
|
|
efb2801eeb | ||
|
|
9f5a4c9b22 | ||
|
|
7fc565a1bd | ||
|
|
0eb1d0a84e | ||
|
|
5d26bca55c | ||
|
|
ba69297c33 | ||
|
|
8b5dc0b678 | ||
|
|
5988bba9fb | ||
|
|
a15e6f68dd | ||
|
|
77e7e2bf1c | ||
|
|
1c5c9e2435 | ||
|
|
adfb903469 | ||
|
|
3e739db7fa | ||
|
|
c124fe6d0c | ||
|
|
f0ed4346b2 | ||
|
|
94c8064798 | ||
|
|
95da5f90c7 | ||
|
|
e4a79d643d | ||
|
|
27c7d0c95b | ||
|
|
cf0464c263 | ||
|
|
05a8a9ee28 | ||
|
|
6268db643c | ||
|
|
fd98d231e4 | ||
|
|
b1ab48b9fc | ||
|
|
e4e3294363 | ||
|
|
92649ba494 | ||
|
|
9afa1f7fb9 | ||
|
|
c253b7769e | ||
|
|
0efe343494 | ||
|
|
f3c9b4fb03 | ||
|
|
26c31db75e | ||
|
|
84335b9580 | ||
|
|
e8b2c57610 | ||
|
|
3d49136e27 | ||
|
|
5e22ca77ec | ||
|
|
b6e8133a4d | ||
|
|
02a22c12ea | ||
|
|
cd4e6b35b3 | ||
|
|
4abf5be9ce | ||
|
|
9ba6fc9279 | ||
|
|
fe917ba7f4 | ||
|
|
2c568603f6 | ||
|
|
05db8ce6c8 | ||
|
|
51422e3ee8 | ||
|
|
489f58011b | ||
|
|
0ef3c10931 | ||
|
|
1759b0826e | ||
|
|
35be80f789 | ||
|
|
5f3c9cca11 | ||
|
|
c29e7619eb | ||
|
|
a265417727 | ||
|
|
b69af164f7 | ||
|
|
ff61bb509c | ||
|
|
f02b99c709 | ||
|
|
c8ba51581f | ||
|
|
29f1a9208e | ||
|
|
542cf9b6e1 | ||
|
|
8b954dc381 | ||
|
|
2f7002c5ec | ||
|
|
767ac2547d | ||
|
|
a46aa2d62b | ||
|
|
9219ddaece | ||
|
|
c7c99d8553 | ||
|
|
422c915c1d | ||
|
|
1f04d17e77 | ||
|
|
e3354a0191 | ||
|
|
df3d1a4da9 | ||
|
|
3963fe4384 | ||
|
|
38261ac649 | ||
|
|
e49539fb4c | ||
|
|
3cd96cf558 | ||
|
|
02f18fc21b | ||
|
|
1bcaaa0f0d | ||
|
|
7922a1de28 | ||
|
|
e897c862f2 | ||
|
|
f55040a38b | ||
|
|
2d580e6939 | ||
|
|
fc48008c1c | ||
|
|
4cf2e4024f | ||
|
|
57c7d77af3 | ||
|
|
5652867316 | ||
|
|
c8cf2afb15 | ||
|
|
d08a91b71e | ||
|
|
2c30aecc5b | ||
|
|
770045676f | ||
|
|
68cca0e114 | ||
|
|
0a1b775ed6 | ||
|
|
54a101acbe | ||
|
|
db1af07d72 | ||
|
|
ff82f75023 | ||
|
|
9ae54786e4 | ||
|
|
22ff760f0b | ||
|
|
86fe6ac3a8 | ||
|
|
3dccd89c18 | ||
|
|
9f52e23158 | ||
|
|
aed3307214 | ||
|
|
ef3c7bb6a2 | ||
|
|
0a887c29f1 | ||
|
|
e1410775fb | ||
|
|
f0ba17a19b | ||
|
|
a7a790416e | ||
|
|
fe5c4df079 | ||
|
|
1376e5de92 | ||
|
|
7f5b1a402c | ||
|
|
22573d238b | ||
|
|
32859d9fc2 | ||
|
|
597d28b505 | ||
|
|
94e8cf1de9 | ||
|
|
33d6205e20 | ||
|
|
1b12800b8f | ||
|
|
13d11b037a | ||
|
|
0ca0854cac | ||
|
|
1726c71649 | ||
|
|
fd8c29f981 | ||
|
|
e07ee559a0 | ||
|
|
097107bd0b | ||
|
|
b40b152b87 | ||
|
|
3c7fef68c0 | ||
|
|
b2322ae873 | ||
|
|
e3f137875b | ||
|
|
71fcf45d73 | ||
|
|
652b68a5a0 | ||
|
|
3e0401de1c | ||
|
|
c164024f38 | ||
|
|
bd1f1e8699 | ||
|
|
7ee6efab74 | ||
|
|
3788e90644 | ||
|
|
8e65d93d6d | ||
|
|
4901668f13 | ||
|
|
f98940e40a | ||
|
|
49fe4d081c | ||
|
|
3054b36a8d | ||
|
|
b888158907 | ||
|
|
173f71dca6 | ||
|
|
37a931feb4 | ||
|
|
79f5c7fbda | ||
|
|
bf3f111ca4 | ||
|
|
9a2a5d3155 | ||
|
|
2a7c61cd6d | ||
|
|
51787d68b9 | ||
|
|
33eb0db6f8 | ||
|
|
a0b2727c59 | ||
|
|
d1b8f53711 | ||
|
|
27b5bfe9b1 | ||
|
|
ea91b10086 | ||
|
|
08da777b33 | ||
|
|
345657ab32 | ||
|
|
1b605ade94 | ||
|
|
b11fa372b1 | ||
|
|
662ebece71 | ||
|
|
6b6e8dc83e | ||
|
|
d215149c7c | ||
|
|
895fc0911a | ||
|
|
754527edfd | ||
|
|
f0217edef1 | ||
|
|
8f1798cc6f | ||
|
|
631bda395d | ||
|
|
791d02a753 | ||
|
|
54b3f92951 | ||
|
|
45de0599d7 | ||
|
|
331ecdc2e7 | ||
|
|
339a7640a8 | ||
|
|
0478dbdd1f | ||
|
|
38b0e8a777 | ||
|
|
fe9f1add6f | ||
|
|
ae9179f412 | ||
|
|
4c35a76cdb | ||
|
|
8ca3428fb6 | ||
|
|
7369500bb7 | ||
|
|
45702e319b | ||
|
|
813468bfe6 | ||
|
|
78192308e1 | ||
|
|
cb72390b57 | ||
|
|
71b2eeef67 | ||
|
|
57c8590b21 | ||
|
|
f8ad0a0923 | ||
|
|
7c443ab108 | ||
|
|
0d645757e7 | ||
|
|
dd37c2ea86 | ||
|
|
d3032bfc21 | ||
|
|
bd6ecdfa6f | ||
|
|
3558e70722 | ||
|
|
a579e9273b | ||
|
|
21369bec95 | ||
|
|
d119d10569 | ||
|
|
38988c005c | ||
|
|
8cc4b588b2 | ||
|
|
12607abb33 | ||
|
|
562f17ea4b | ||
|
|
0aea9b7709 | ||
|
|
c0afe96b80 | ||
|
|
5c919cd0de | ||
|
|
f555c93c11 | ||
|
|
cbb7cd16d0 | ||
|
|
4d074b5414 | ||
|
|
dfd22b2b07 | ||
|
|
6edaef9598 | ||
|
|
f63e946f04 | ||
|
|
add5cc8b56 | ||
|
|
2a4e830bee | ||
|
|
eb87232472 | ||
|
|
52c3031a82 | ||
|
|
df471e87eb | ||
|
|
ec6fae5d1a | ||
|
|
cb422a9a02 | ||
|
|
f91bac7b31 | ||
|
|
d542921ff7 | ||
|
|
ad693d67b2 | ||
|
|
350932e9c0 | ||
|
|
4e98d96755 | ||
|
|
c17a9eb5f1 | ||
|
|
252ed4c1ae | ||
|
|
f9fd634fae | ||
|
|
c17c81254e | ||
|
|
5ead61dc7b | ||
|
|
e403db5877 | ||
|
|
32874fa848 | ||
|
|
b90f383cfe | ||
|
|
eb65984368 | ||
|
|
10e0d34140 | ||
|
|
f4b00d3c64 | ||
|
|
cc0b780412 | ||
|
|
fbbbe4ec87 | ||
|
|
1372d62186 | ||
|
|
a69936de74 | ||
|
|
f5dfa1e9c3 | ||
|
|
5fb21c2159 | ||
|
|
132f61e900 | ||
|
|
0e9be8eea0 | ||
|
|
96f5f66c26 | ||
|
|
bbed4d50ab | ||
|
|
4b7ee8267b | ||
|
|
f6a745a4c2 | ||
|
|
a23a5505c4 | ||
|
|
21030f0a4f | ||
|
|
d21824cbae | ||
|
|
124786ad1b | ||
|
|
f81daac9c0 | ||
|
|
db8e8392fa | ||
|
|
5bc2f87d3e | ||
|
|
de35c90847 | ||
|
|
bc813fddcc | ||
|
|
13c91f5fce | ||
|
|
ac4690d74b | ||
|
|
a1a8f17617 | ||
|
|
12be852a43 | ||
|
|
440fbef79b | ||
|
|
e1c221a4d5 | ||
|
|
e1f1c82d4e | ||
|
|
3c1b82255e | ||
|
|
6bd47b54df | ||
|
|
3261a45ec1 | ||
|
|
0ac116bb4e | ||
|
|
221e4ff6fe | ||
|
|
fe80499f9c | ||
|
|
d3d1f3ab60 | ||
|
|
264b888ef2 | ||
|
|
ba270e09a4 | ||
|
|
8281ee1520 | ||
|
|
75aab4e9d2 | ||
|
|
b532a47e4a | ||
|
|
77a3d683e3 | ||
|
|
c132d0e1fe | ||
|
|
1a6348f113 | ||
|
|
89ac6ab594 | ||
|
|
3d1012b73b | ||
|
|
c98ad79e68 | ||
|
|
82460b0da3 | ||
|
|
0bdc57a14a | ||
|
|
33780a09df | ||
|
|
a9c9d5ca4b | ||
|
|
ab07dbdb9d | ||
|
|
6dd6750985 | ||
|
|
59aa0f43d5 | ||
|
|
04ca6a4307 | ||
|
|
c7cbe11ba4 | ||
|
|
4794093aba | ||
|
|
46e300b2c5 | ||
|
|
c693e52f6c | ||
|
|
4e2ec09f9a | ||
|
|
cdbae456d5 | ||
|
|
379177d2f4 | ||
|
|
fb193d6172 | ||
|
|
16234bb713 | ||
|
|
3f14e649b5 | ||
|
|
c2e8062f84 | ||
|
|
5d3fef21b0 | ||
|
|
b64e1b4a49 | ||
|
|
89f414b185 | ||
|
|
47e13cfdf4 | ||
|
|
48d3ce46d8 | ||
|
|
89c8449ec0 | ||
|
|
331fcb633e | ||
|
|
bffc2233a0 | ||
|
|
393b5d48b2 | ||
|
|
6006cdff2c | ||
|
|
d6b10465f3 | ||
|
|
b3cf5c4f5f | ||
|
|
3862f2f022 | ||
|
|
38ab22bf1d | ||
|
|
ce16f7689d | ||
|
|
b06a329466 | ||
|
|
c5b24f3850 | ||
|
|
103b956581 | ||
|
|
63361fc56e | ||
|
|
1e9e334929 | ||
|
|
f30d71b0c5 | ||
|
|
fee4aba9ec | ||
|
|
f1960273a0 | ||
|
|
778564e63b | ||
|
|
cf6a69da27 | ||
|
|
960b2ed023 | ||
|
|
74420550e6 | ||
|
|
cb5887b376 | ||
|
|
41b40157d8 | ||
|
|
b11b693c08 | ||
|
|
256eb4bba0 | ||
|
|
77804b4d38 | ||
|
|
8c9ca7a1b3 | ||
|
|
9d055f8c13 | ||
|
|
3dacd87dfb | ||
|
|
691fbb0c42 | ||
|
|
c28a6eef3b | ||
|
|
17fed3fedd | ||
|
|
1448cc56fc | ||
|
|
074689b5de | ||
|
|
8dd612a0a0 | ||
|
|
22fdbba0b5 | ||
|
|
39b787670b | ||
|
|
a221278c05 | ||
|
|
5f26b9ec66 | ||
|
|
48778d0a77 | ||
|
|
42d2cbad41 | ||
|
|
cb82c42e35 | ||
|
|
f13fb330ed | ||
|
|
d4bae48ca2 | ||
|
|
590ad964b1 | ||
|
|
d4595df8a4 | ||
|
|
7b642bcbb4 | ||
|
|
ca26596695 | ||
|
|
88cf5e5d98 | ||
|
|
13f790360d | ||
|
|
70daadf987 | ||
|
|
9d5004db1c | ||
|
|
ea82bfcced | ||
|
|
00a502942e | ||
|
|
2031bc7fc4 | ||
|
|
3adb22e971 | ||
|
|
331ea5116f | ||
|
|
1da5a33f88 | ||
|
|
6c87724af8 | ||
|
|
c7a5ff5e82 | ||
|
|
abf2fcf820 | ||
|
|
644c22b08f | ||
|
|
c54024a5e6 | ||
|
|
97093fdf81 | ||
|
|
50c4f60c68 | ||
|
|
f0fb3b78d1 | ||
|
|
9b06178f35 | ||
|
|
a01c96140b | ||
|
|
02530172e7 | ||
|
|
447d803800 | ||
|
|
6b04901c4d | ||
|
|
7fb29621c3 | ||
|
|
b032fce962 | ||
|
|
ce879122bb | ||
|
|
2fa16708b7 | ||
|
|
54bc8608e3 | ||
|
|
706a7802cc | ||
|
|
9dc01cf540 | ||
|
|
8943ad5966 | ||
|
|
deb7a1c9c0 | ||
|
|
96a5445d44 | ||
|
|
d693065afb | ||
|
|
bdeee35669 | ||
|
|
62b3deb90d | ||
|
|
9df9ff59e0 | ||
|
|
23a3271c06 | ||
|
|
f4a5aa2e94 | ||
|
|
bdd54eed1c | ||
|
|
c6a20a72f2 | ||
|
|
d7a54b3632 | ||
|
|
be6a3d0f10 | ||
|
|
e9125a3a22 | ||
|
|
c27a60658f | ||
|
|
8f2bc6e028 | ||
|
|
a6b78cbbee | ||
|
|
182a7076fd | ||
|
|
17a9b22dce | ||
|
|
f190d12802 | ||
|
|
b12dd526f9 | ||
|
|
473d555dc1 | ||
|
|
fa9208ccdd | ||
|
|
4aa088eb2f | ||
|
|
8f8147d646 | ||
|
|
e637dd2390 | ||
|
|
c90960fc88 | ||
|
|
da86a1c9f2 | ||
|
|
0adb789238 | ||
|
|
15082a178b | ||
|
|
4a0db26c36 | ||
|
|
ad3ea636d5 | ||
|
|
6a238b0514 | ||
|
|
e6d7e7e329 | ||
|
|
f942aba855 | ||
|
|
2f34132275 | ||
|
|
663b2be065 | ||
|
|
a1e4d676c3 | ||
|
|
6f28d21207 | ||
|
|
9f115e056e | ||
|
|
8352ba4af4 | ||
|
|
9b06310cbe | ||
|
|
77fe33e57f | ||
|
|
df58eb9bc7 | ||
|
|
2d0084308d | ||
|
|
7efa40966a | ||
|
|
6d644dc764 | ||
|
|
b0de0b1176 | ||
|
|
c72d473e96 | ||
|
|
c8a91bd46f | ||
|
|
498f19a6a1 | ||
|
|
c7a2138ece | ||
|
|
4078902543 | ||
|
|
9e38ed9a39 | ||
|
|
183cabc77d | ||
|
|
b582e481c6 | ||
|
|
ad39931e87 | ||
|
|
1ae22e1365 | ||
|
|
b748ddfe06 | ||
|
|
e52f5f1b63 | ||
|
|
bda4b326ab | ||
|
|
70ddf32719 | ||
|
|
3edba7b662 | ||
|
|
f74ef650ac | ||
|
|
f093c3d78b | ||
|
|
d933f33bdb | ||
|
|
813d62005d | ||
|
|
411de9bddf | ||
|
|
bd28945374 | ||
|
|
1e4c3751e1 | ||
|
|
5b6f47cd0f | ||
|
|
bec8c5bf4c | ||
|
|
15495bb200 | ||
|
|
999f278971 | ||
|
|
7ca1d35a4e | ||
|
|
2117fe414e | ||
|
|
7d8c51181d | ||
|
|
c30211cb27 | ||
|
|
901da118e5 | ||
|
|
f11757e43a | ||
|
|
3f143317a6 | ||
|
|
45d7312dfc | ||
|
|
26774eb045 | ||
|
|
6789d247e2 | ||
|
|
462bc3d707 | ||
|
|
e1755ea6a8 | ||
|
|
b4a7e4697e | ||
|
|
cd61b1d045 | ||
|
|
24dc36ba4c | ||
|
|
e8e4f1777d | ||
|
|
ae38a26af3 | ||
|
|
8ee94dd7aa | ||
|
|
e741a29d36 | ||
|
|
be1d275151 | ||
|
|
31c9e26e2e | ||
|
|
20ed1ada03 | ||
|
|
891214fa72 | ||
|
|
e819e285e2 | ||
|
|
171c175e54 | ||
|
|
675cbce8cb | ||
|
|
4f1398f773 | ||
|
|
ae89e399a3 | ||
|
|
2c9716c64c | ||
|
|
bc58245abf | ||
|
|
8c4aa8517e | ||
|
|
c0b7a54bb9 | ||
|
|
6b32bb635d | ||
|
|
691de22ae3 | ||
|
|
e64b2d3372 | ||
|
|
e190af9d87 | ||
|
|
8d14463b18 | ||
|
|
04977ef721 | ||
|
|
d84e6875c5 | ||
|
|
80678ae7bc | ||
|
|
482bdab0e0 | ||
|
|
b2623b9841 | ||
|
|
9ae40d64f0 | ||
|
|
cef097b7b7 | ||
|
|
b840334ad2 | ||
|
|
acff683e8e | ||
|
|
c5332de86d | ||
|
|
90ecf14a0a | ||
|
|
4945282369 | ||
|
|
ca532d23f0 | ||
|
|
a509b6a21c | ||
|
|
46229473cb | ||
|
|
65be2448dc | ||
|
|
be74806044 | ||
|
|
b488666c1e | ||
|
|
d1acaea611 | ||
|
|
db6e5ce7cf | ||
|
|
d56179df17 | ||
|
|
850100c9c2 | ||
|
|
0725999f0a | ||
|
|
cb2d8259f2 | ||
|
|
61a1f3d817 | ||
|
|
63f111b7f3 | ||
|
|
e061eb3003 | ||
|
|
29daa58222 | ||
|
|
340cc02171 | ||
|
|
b738d1960a | ||
|
|
38f5b780d7 | ||
|
|
fa9dac29e8 | ||
|
|
afc432042f | ||
|
|
21cb29baf0 | ||
|
|
e8b5001cfe | ||
|
|
849c1e46a2 | ||
|
|
ebad6cde36 | ||
|
|
f920b3945e | ||
|
|
178028a70a | ||
|
|
5e54d3e41a | ||
|
|
f0af8726e3 | ||
|
|
57f2fe77ea | ||
|
|
d56ca25089 | ||
|
|
d39ce17dea | ||
|
|
373a68ec8b | ||
|
|
5613758ee3 | ||
|
|
2102f86909 | ||
|
|
d5ea785de7 | ||
|
|
9edd28d2ed | ||
|
|
7698af5178 | ||
|
|
52ae451f5c | ||
|
|
9254443cd4 | ||
|
|
4e4bc7b90f | ||
|
|
c7e0f2e196 | ||
|
|
acabaab6ac | ||
|
|
b0a249f338 | ||
|
|
0cb5d5cc5a | ||
|
|
9208c87f91 | ||
|
|
0081ce4a75 | ||
|
|
7850f49963 | ||
|
|
c72ee41142 | ||
|
|
bf5dee955d | ||
|
|
3df23a148a | ||
|
|
0a1b55c296 | ||
|
|
14b8efe4bb | ||
|
|
64162efebd | ||
|
|
faf5e1de51 | ||
|
|
0d7b1a7dc7 | ||
|
|
fa63bc6b78 | ||
|
|
379bfd062f | ||
|
|
49108c23f0 | ||
|
|
4475060268 | ||
|
|
4f269e336d | ||
|
|
4464b13163 | ||
|
|
215d5f68b0 | ||
|
|
281f4e04ee | ||
|
|
17a3f9691d | ||
|
|
4fde6ee7af | ||
|
|
040b1b06d5 | ||
|
|
b16ea8b719 | ||
|
|
cc22847bc3 | ||
|
|
3702e17b2e | ||
|
|
7abc220fb3 | ||
|
|
4fc9a906f6 | ||
|
|
5de83c9805 | ||
|
|
f71d904a9b | ||
|
|
318ded4198 | ||
|
|
f1874b211f | ||
|
|
c60ffd7fd9 | ||
|
|
dc57282168 | ||
|
|
3c336e179f | ||
|
|
6bda57da5d | ||
|
|
9a16001e51 | ||
|
|
34870e899f | ||
|
|
d0653f72e2 | ||
|
|
64748b7b1d | ||
|
|
7163c8d048 | ||
|
|
d0ec991bb2 | ||
|
|
d458af4454 | ||
|
|
9e9e7c33ae | ||
|
|
ce7de5ed30 | ||
|
|
776d8edf52 | ||
|
|
5f21385e41 | ||
|
|
94fed93f54 | ||
|
|
a950e4816d | ||
|
|
c87c66efb1 | ||
|
|
5a5a0006fe | ||
|
|
60b48a6830 | ||
|
|
5e41350588 | ||
|
|
ff9f5b62ac | ||
|
|
882913f0ca | ||
|
|
2062f7e97b | ||
|
|
445c83a60d | ||
|
|
1891cfd79a | ||
|
|
06d5a7b2bf | ||
|
|
5af8a8aa4c | ||
|
|
dc6b085d8b | ||
|
|
00759f777e | ||
|
|
95ac0e61b2 | ||
|
|
6c5884853f | ||
|
|
7578ef889f | ||
|
|
da254af8d5 | ||
|
|
98123dc422 | ||
|
|
466909b3d9 | ||
|
|
0d4305192a | ||
|
|
9e61b9f696 | ||
|
|
491539ff32 | ||
|
|
4c29a13a6e | ||
|
|
b66e1bdb9e | ||
|
|
7312de6bc2 | ||
|
|
1d6bcda014 | ||
|
|
5a747bad7d | ||
|
|
9542783a7e | ||
|
|
a59639413d | ||
|
|
d5eb92a071 | ||
|
|
994cde57af | ||
|
|
238a5809bf | ||
|
|
49fa65c0dd | ||
|
|
49123f169c | ||
|
|
4dc64c387f | ||
|
|
98a63711dd | ||
|
|
cb95cf4745 | ||
|
|
acd48fa61d | ||
|
|
cb7abcbaea | ||
|
|
793c974480 | ||
|
|
78a321925f | ||
|
|
643572595e | ||
|
|
fb4d462325 | ||
|
|
c0df07c86f | ||
|
|
e918d945f2 | ||
|
|
0ee5743853 | ||
|
|
486d69da5f | ||
|
|
005b4b7609 | ||
|
|
a0fd065dcf | ||
|
|
751384cb5c | ||
|
|
6ac672b4a3 | ||
|
|
a89502be9f | ||
|
|
04e7b3bd4d | ||
|
|
9ebb37b6a5 | ||
|
|
052a7e3deb | ||
|
|
108c0f6bb8 | ||
|
|
6ed89b6ca5 | ||
|
|
27ccaffb37 | ||
|
|
a001babad2 | ||
|
|
32a76c5255 | ||
|
|
099f797975 | ||
|
|
b7df3e24b4 | ||
|
|
8323092a0c | ||
|
|
e5af46d3fb | ||
|
|
a6743588b6 | ||
|
|
90cbcd2dfd | ||
|
|
a36b7afba5 | ||
|
|
4c91ade61d | ||
|
|
f2a17b9b70 | ||
|
|
b71b9ccb57 | ||
|
|
8b0af19351 | ||
|
|
9f7c473376 | ||
|
|
0206767478 | ||
|
|
1a3378e0f5 | ||
|
|
5c3eee34a1 | ||
|
|
2b5017e610 | ||
|
|
e755c7fdcc | ||
|
|
8d463b33cd | ||
|
|
7d9b21a874 | ||
|
|
a118921b21 | ||
|
|
a1aefd2330 | ||
|
|
8b511379ac | ||
|
|
c1593f856d | ||
|
|
93f1d7643d | ||
|
|
ce4dfb4296 | ||
|
|
2e5f5010f7 | ||
|
|
7c588c2e30 | ||
|
|
43be4cf2b5 | ||
|
|
8b457b9b66 | ||
|
|
25efee2e62 | ||
|
|
546c91a940 | ||
|
|
85ebc5f7bd | ||
|
|
e002b0e25f | ||
|
|
4944383769 | ||
|
|
68c6f0ff07 | ||
|
|
5078152292 | ||
|
|
9837b40330 | ||
|
|
cb645c9a74 | ||
|
|
87573a9fef | ||
|
|
7c486e27ba | ||
|
|
4a3bdc340d | ||
|
|
903ee0622d | ||
|
|
d33ad7600b | ||
|
|
9ec35a2348 | ||
|
|
6da13c6486 | ||
|
|
87a47a5ca0 | ||
|
|
c682f1c16a | ||
|
|
591075a8ed | ||
|
|
41701673a0 | ||
|
|
55f0d4ddd8 | ||
|
|
6d66fcaa57 | ||
|
|
26e79ca889 | ||
|
|
62eb247c1e | ||
|
|
c5fd583b2c | ||
|
|
117db3e11c | ||
|
|
3f82fd2f37 | ||
|
|
e9c46afcf7 | ||
|
|
3234fa15ef | ||
|
|
7ef84df852 | ||
|
|
4e2884b509 | ||
|
|
03100020ab | ||
|
|
8bfb5cc5e9 | ||
|
|
cf6d07aafa | ||
|
|
85c3179dbd | ||
|
|
bfbca34eb0 | ||
|
|
b73edc0564 | ||
|
|
6ba90e3a50 | ||
|
|
e8edbad18c | ||
|
|
c86fec5307 | ||
|
|
6e476255ca | ||
|
|
27af9b6b06 | ||
|
|
f8208fa961 | ||
|
|
87b9cb49ad | ||
|
|
b2da0772e6 | ||
|
|
4f73e0850e | ||
|
|
b6a39db627 | ||
|
|
3a83b06572 | ||
|
|
fe5bf01b25 | ||
|
|
5559ec903b | ||
|
|
18750028b2 | ||
|
|
6b88648c67 | ||
|
|
58ee803cb4 | ||
|
|
894ff73c7d | ||
|
|
8031f0ed7f | ||
|
|
3a56b5da47 | ||
|
|
fedcb6d26a | ||
|
|
eed3c5e543 | ||
|
|
e26ab67e25 | ||
|
|
e77b7427b4 | ||
|
|
475e4207cc | ||
|
|
71b2eed32c | ||
|
|
6cf50e6579 | ||
|
|
69468708e2 | ||
|
|
5da5678e64 | ||
|
|
a428e7f618 | ||
|
|
0eb5a0a539 | ||
|
|
a1c1ff9981 | ||
|
|
2029ade18c | ||
|
|
5f8f474c0c | ||
|
|
f705f9b275 | ||
|
|
91e706ec1f | ||
|
|
dcf351f847 | ||
|
|
06744b664a | ||
|
|
d3049d9c89 | ||
|
|
1f2abb9c0f | ||
|
|
9f0d7e50a5 | ||
|
|
5f262a8f11 | ||
|
|
f62bc6a2e5 | ||
|
|
d7e4bc1379 | ||
|
|
cd2d6575c6 | ||
|
|
b46f656d17 | ||
|
|
58fd602bbd | ||
|
|
9cc95704cd | ||
|
|
5f5a3dbb0a | ||
|
|
f8f53df4ec | ||
|
|
56b85cc63c | ||
|
|
90aca97e66 | ||
|
|
6ce2a52c5f | ||
|
|
1f56312132 | ||
|
|
3aa290cddb | ||
|
|
1d1eb4fedb | ||
|
|
266ff41386 | ||
|
|
02331e5536 | ||
|
|
621c51589a | ||
|
|
4a58e859a4 | ||
|
|
48d393d8f5 | ||
|
|
321552d998 | ||
|
|
a985a1f9f5 | ||
|
|
d532a36739 | ||
|
|
b631b5927b | ||
|
|
adb39ceb98 | ||
|
|
84b91b19ca | ||
|
|
aaea68d3d6 | ||
|
|
2accba2e71 | ||
|
|
8f4f4eb5ae | ||
|
|
c5aabb3c6e | ||
|
|
60c2d136e1 | ||
|
|
cae6ec16ba | ||
|
|
30601c77d4 | ||
|
|
b0f4cf3c9c | ||
|
|
c41dfcf6ad | ||
|
|
2e10555f03 | ||
|
|
6b2ee0fcf3 | ||
|
|
0dbdbffba7 | ||
|
|
9c5dd8d767 | ||
|
|
fff0ebb5f3 | ||
|
|
d34275150c | ||
|
|
d04eb977c2 | ||
|
|
fb4928b2f5 | ||
|
|
5c39420d91 | ||
|
|
14fcfd8a40 | ||
|
|
ff19dd94f9 | ||
|
|
b6913ff9b3 | ||
|
|
4573fd3069 | ||
|
|
6cf6d9f7e1 | ||
|
|
28e35a64ea | ||
|
|
091818483a | ||
|
|
3b43556c41 | ||
|
|
ed39c66715 | ||
|
|
446b0e4e5e | ||
|
|
6e3e8318d0 | ||
|
|
17b8b660f0 | ||
|
|
40bceea68a | ||
|
|
b655c17c09 | ||
|
|
a3813f94fc | ||
|
|
c70540a825 | ||
|
|
9caffe330b | ||
|
|
8d8c5da812 | ||
|
|
55bb766c15 | ||
|
|
c18df68ead | ||
|
|
3996e94c39 | ||
|
|
1bdf017f9e | ||
|
|
93790c1dc6 | ||
|
|
ba8c11b25d | ||
|
|
ca57edfa0b | ||
|
|
ccb6545c32 | ||
|
|
d146dbc9d7 | ||
|
|
b4eaaccc88 | ||
|
|
c9ed9e74f2 | ||
|
|
587c7c70f5 | ||
|
|
749ff021b6 | ||
|
|
85c5765c00 | ||
|
|
9e76078939 | ||
|
|
334e0e1ca6 | ||
|
|
dce4519995 | ||
|
|
45bbae80e7 | ||
|
|
d37709a922 | ||
|
|
2560ae9bc1 | ||
|
|
2bdd3ca353 | ||
|
|
8a8aab1aae | ||
|
|
85d790ff79 | ||
|
|
68afc96a9f | ||
|
|
94efaa7675 | ||
|
|
180af74a50 | ||
|
|
88af0d3509 | ||
|
|
97633f7bed | ||
|
|
053e016388 | ||
|
|
2d61e0270e | ||
|
|
3a23afb0bc | ||
|
|
470f12ff46 | ||
|
|
4422de0c6c | ||
|
|
8a708f52f7 | ||
|
|
bcefc17631 | ||
|
|
daf19e241e | ||
|
|
b5f5b1fdf9 | ||
|
|
801b718953 | ||
|
|
f571658aa4 | ||
|
|
5d233b8c09 | ||
|
|
00724597f4 | ||
|
|
c659940ea8 | ||
|
|
23539eb55c | ||
|
|
e69bf418de | ||
|
|
0e1fcd38bb | ||
|
|
e74186565d | ||
|
|
7e54281e26 | ||
|
|
15f512bdee | ||
|
|
ecfe0283e2 | ||
|
|
3b874f759c | ||
|
|
9c9b4ed4e0 | ||
|
|
4f6d80c602 | ||
|
|
b50542531d | ||
|
|
8ab28d1d12 | ||
|
|
9567da22f8 | ||
|
|
36814b7681 | ||
|
|
82235e6c6f | ||
|
|
a8310f35f2 | ||
|
|
85989af031 | ||
|
|
cf9ffd16dd | ||
|
|
0602537cce | ||
|
|
24e32420b7 | ||
|
|
39c494260b | ||
|
|
761b9c9290 | ||
|
|
27686d8c2f | ||
|
|
d2b007005d | ||
|
|
f1ef30a5bb | ||
|
|
f1d9437c55 | ||
|
|
bcba5075e8 | ||
|
|
d6e8b0263c | ||
|
|
9aba617bad | ||
|
|
c24f7b1391 | ||
|
|
d4e27b635f | ||
|
|
c996d2870c | ||
|
|
bbd59f8a22 | ||
|
|
d3d359e757 | ||
|
|
ae763ea93d | ||
|
|
236b9e9761 | ||
|
|
e42c9dfd84 | ||
|
|
bebf5b291b | ||
|
|
1e3dcd203d | ||
|
|
cc7da63dec | ||
|
|
1baa2a2558 | ||
|
|
e63ff77b15 | ||
|
|
6cf9468477 | ||
|
|
b277bc8750 | ||
|
|
ba9da64207 | ||
|
|
9cb9f9c80b | ||
|
|
7a65df7636 | ||
|
|
eab46d547d | ||
|
|
3dd552c4a2 | ||
|
|
23bb045a72 | ||
|
|
7c834ad118 | ||
|
|
8e2617ab8d | ||
|
|
24fcae4f49 | ||
|
|
ce18674d88 | ||
|
|
6b8d9b5c36 | ||
|
|
81bf95763c | ||
|
|
2d64077fd0 | ||
|
|
38faebcf20 | ||
|
|
48d177a9d0 | ||
|
|
3b3a7f7354 | ||
|
|
99cd2818a1 | ||
|
|
5765e099a6 | ||
|
|
175d59ecba | ||
|
|
3bd3d01968 | ||
|
|
85e2a6bb45 | ||
|
|
84efd239a5 | ||
|
|
6a69813326 | ||
|
|
2c9dcc3913 | ||
|
|
20ea1ca018 | ||
|
|
0abde90933 | ||
|
|
e01b69198a | ||
|
|
53cd9d2403 | ||
|
|
3d0f5fc078 | ||
|
|
54eedcc739 | ||
|
|
ae6f5844da | ||
|
|
1bea845ceb | ||
|
|
d581582339 | ||
|
|
4eabc1992e | ||
|
|
316eb24bbb | ||
|
|
f0a8824efc | ||
|
|
345a5d5646 | ||
|
|
464679c78b | ||
|
|
28eeec1cf4 | ||
|
|
7d0dce3267 | ||
|
|
9e29625207 | ||
|
|
a767da4f3f | ||
|
|
7bd96c2876 | ||
|
|
70fd64dcd6 | ||
|
|
bb2822f4b5 | ||
|
|
ad21108b63 | ||
|
|
e6808a787c | ||
|
|
1fb2762725 | ||
|
|
cce55941d3 | ||
|
|
6c8d95e0e2 | ||
|
|
216a178b28 | ||
|
|
6594a54a95 | ||
|
|
a9a4cf061a | ||
|
|
b7f0e204cb | ||
|
|
e6a15f233b | ||
|
|
e0edb596ea | ||
|
|
f2fb77c15a | ||
|
|
772a3a97eb | ||
|
|
6c310836a1 | ||
|
|
75416a3016 | ||
|
|
ebef78a13e | ||
|
|
e71baca39b | ||
|
|
18eb210313 | ||
|
|
7d38a5e1f9 | ||
|
|
4386077e2d | ||
|
|
49dbfd2131 | ||
|
|
a80fce5ac1 | ||
|
|
891b981cab | ||
|
|
2dd87b8384 | ||
|
|
062eb85075 | ||
|
|
e1f6802f5f | ||
|
|
6cfcd50f12 | ||
|
|
bcadb0b3b3 | ||
|
|
0df561f873 | ||
|
|
238fc24684 | ||
|
|
936855c81c | ||
|
|
61ad9d4651 | ||
|
|
f07f6a26a8 | ||
|
|
4a5a56f8ef | ||
|
|
7d44bba95c | ||
|
|
6e6f1045b8 | ||
|
|
5dd3221759 | ||
|
|
09edb467f6 | ||
|
|
ffb187ae15 | ||
|
|
b4a8be07f3 | ||
|
|
4968a2abc5 | ||
|
|
91159da30d | ||
|
|
c9ad61b4fb | ||
|
|
3f0dcd8c0e | ||
|
|
e1eb41fe77 | ||
|
|
498ab23355 | ||
|
|
5d6a053f98 | ||
|
|
929aeebf12 | ||
|
|
00bd947385 | ||
|
|
d4ef86afc0 | ||
|
|
1856cad816 | ||
|
|
91e2d1d2a0 | ||
|
|
f29f30dce0 | ||
|
|
e7ba6ef492 | ||
|
|
de4016dcff | ||
|
|
bbeb382cbb | ||
|
|
385c166830 | ||
|
|
410e6ff203 | ||
|
|
8b47c4e307 | ||
|
|
6d1b42bedb | ||
|
|
f0a4bd28b6 | ||
|
|
2879684f21 | ||
|
|
0437d0abea | ||
|
|
0286f588bf | ||
|
|
042fb76837 | ||
|
|
795e66eac9 | ||
|
|
aae0615ffd | ||
|
|
8127a79cb1 | ||
|
|
057ca497dd | ||
|
|
66b1611649 | ||
|
|
7f5220a6ca | ||
|
|
e41e26717b | ||
|
|
7a8184d206 | ||
|
|
13bf2f19ac | ||
|
|
1d5ebfd0b1 | ||
|
|
dfc11da2ce | ||
|
|
191af2e87b | ||
|
|
0985b82760 | ||
|
|
26f4b5a69a | ||
|
|
5c7a6e278f | ||
|
|
ae1ab8aaaa | ||
|
|
18c25d1b6f | ||
|
|
5888a2c399 | ||
|
|
c00603704e | ||
|
|
786bc4b04f | ||
|
|
5eca20f849 | ||
|
|
0a3a582949 | ||
|
|
08fec0534d | ||
|
|
5bf92c9d3a | ||
|
|
a8bbf7231b | ||
|
|
83c171012d | ||
|
|
229d854607 | ||
|
|
562460606f | ||
|
|
46f70b1cbb | ||
|
|
a547133efe | ||
|
|
cf445898ce | ||
|
|
98f68e46d6 | ||
|
|
27660b271d | ||
|
|
895e374860 | ||
|
|
4c7f051247 | ||
|
|
e68afa53a8 | ||
|
|
cc47ba2404 | ||
|
|
2238fa46ed | ||
|
|
de8b040e31 | ||
|
|
4ffc48d194 | ||
|
|
2433848408 | ||
|
|
e602f7febc | ||
|
|
f607b32938 | ||
|
|
c7a088faa5 | ||
|
|
30f6c0e105 | ||
|
|
38b9fa7b93 | ||
|
|
39a31fc17f | ||
|
|
899a7df14a | ||
|
|
7a8c425103 | ||
|
|
0e8ce59022 | ||
|
|
77ac76a158 | ||
|
|
8108b97050 | ||
|
|
a1c3491dea | ||
|
|
8bba96a84e | ||
|
|
6cd9b25a53 | ||
|
|
0431b1909c | ||
|
|
907665e2e8 | ||
|
|
61e8836fbd | ||
|
|
0e921b5dff | ||
|
|
7ef37d6e17 | ||
|
|
dce227684a | ||
|
|
158e112752 | ||
|
|
ec992c7f5e | ||
|
|
e7d63c7644 | ||
|
|
6464e8fee6 | ||
|
|
047d66a657 | ||
|
|
55c23360d9 | ||
|
|
c378d32c85 | ||
|
|
3d9540c58c | ||
|
|
39724eb916 | ||
|
|
48dddd4ae7 | ||
|
|
9c00fd10de | ||
|
|
9309d0b00f | ||
|
|
038b5d32a3 | ||
|
|
706920ba19 | ||
|
|
39492a0726 | ||
|
|
df1170fea9 | ||
|
|
f0e1d204fa | ||
|
|
8ece0a8a5f | ||
|
|
1373b81e7c | ||
|
|
d3601dd561 | ||
|
|
f685cf1d0c | ||
|
|
d5fcf0c153 | ||
|
|
5f9810070d | ||
|
|
923efa004b | ||
|
|
869e8eab3c | ||
|
|
b51d197117 | ||
|
|
e4f0a8952c | ||
|
|
072ee425f4 | ||
|
|
a4c2819be2 | ||
|
|
2a274f9c19 | ||
|
|
b4d5a20670 | ||
|
|
6339159b04 | ||
|
|
aec019991c | ||
|
|
33e6a17747 | ||
|
|
ecf508ec23 | ||
|
|
a5bcfc0509 | ||
|
|
1899096ff4 | ||
|
|
6e219f5831 | ||
|
|
de1bb5aeb6 | ||
|
|
b52d94273c | ||
|
|
e655c85489 | ||
|
|
dee7210231 | ||
|
|
cbd073ed08 | ||
|
|
09ebc0c163 | ||
|
|
d2ede75c71 | ||
|
|
3e03fef3e3 | ||
|
|
0f583f4b33 | ||
|
|
f175db74a5 | ||
|
|
8d5e37a413 | ||
|
|
8b9b7178a2 | ||
|
|
a2f49063e2 | ||
|
|
f3f34baa73 | ||
|
|
abe9ecd225 | ||
|
|
67409af38d | ||
|
|
b7d1c34aa6 | ||
|
|
92809b95c9 | ||
|
|
b18690cbe2 | ||
|
|
96155365b2 | ||
|
|
3e5067feb1 | ||
|
|
3ec687a0cf | ||
|
|
365034d7dd | ||
|
|
09aa9f87d8 | ||
|
|
97963fb8c9 | ||
|
|
ee1643ce39 | ||
|
|
a82cdcfe48 | ||
|
|
1b439703ff | ||
|
|
4cc5943f90 | ||
|
|
5fad666678 | ||
|
|
e12bf35996 | ||
|
|
d34fccec22 | ||
|
|
429437f1b9 | ||
|
|
c6e7d87960 | ||
|
|
716320f3ca | ||
|
|
1d12b47cb8 | ||
|
|
1bc1ee9e08 | ||
|
|
53f50463bc | ||
|
|
7ab91e660f | ||
|
|
2f0e230522 | ||
|
|
280f674ce9 | ||
|
|
a92c66d512 | ||
|
|
c45eedcb02 | ||
|
|
a9a49345ba | ||
|
|
8d960a2eb9 | ||
|
|
3e623b8959 | ||
|
|
1b1991d53d | ||
|
|
6d0f39d841 | ||
|
|
3087501b6c | ||
|
|
b429319bc0 | ||
|
|
247e855dbf | ||
|
|
1aec645510 | ||
|
|
3ea2038d3d | ||
|
|
942cb5e87e | ||
|
|
37a3a7cdce | ||
|
|
435a27b66a | ||
|
|
b31a7cdcbf | ||
|
|
ac61548e6a | ||
|
|
f5ace0f72a | ||
|
|
e498b73933 | ||
|
|
ff69bdbc6f | ||
|
|
0c1e184cb7 | ||
|
|
e97541dcbc | ||
|
|
7b3eb22865 | ||
|
|
d55f065ce2 | ||
|
|
86af244636 | ||
|
|
2c9e2b2e3c | ||
|
|
33c8bf886e | ||
|
|
ef71a089a6 | ||
|
|
5fc98cce0d | ||
|
|
b9101c3d6a | ||
|
|
6aab0f627c | ||
|
|
6b97673d0a | ||
|
|
5d8c1ce84e | ||
|
|
33c9591a4b | ||
|
|
87e8736823 | ||
|
|
c0da16bfcd | ||
|
|
a4ddc5b3ac | ||
|
|
91e4010039 | ||
|
|
486b6580d8 | ||
|
|
9c4ef27d49 | ||
|
|
33577eaa68 | ||
|
|
d5e19661bd | ||
|
|
799afac05b | ||
|
|
3ba36dc30c | ||
|
|
641024c235 | ||
|
|
d9598db117 | ||
|
|
2e4da07a15 | ||
|
|
40f4411b69 | ||
|
|
c75de0f37c | ||
|
|
74c4c1bf44 | ||
|
|
60a637921c | ||
|
|
22312b3c9c | ||
|
|
2e26e44538 | ||
|
|
24e79ecc68 | ||
|
|
5b532a1812 | ||
|
|
f3867d7f80 | ||
|
|
fb90e47e70 | ||
|
|
68046244dd | ||
|
|
b1507060ad | ||
|
|
ffbd595d88 | ||
|
|
ed5bc1e69c | ||
|
|
9734931f67 | ||
|
|
0048b04540 | ||
|
|
c361932fe2 | ||
|
|
2d8feabe54 | ||
|
|
1b511dd130 | ||
|
|
52024f4d80 | ||
|
|
735fa6287f | ||
|
|
7eb407fe2b | ||
|
|
897d5c58b3 | ||
|
|
dc9086512b | ||
|
|
0029d068c7 | ||
|
|
de388b3dc8 | ||
|
|
fb904d53cd | ||
|
|
600cc02de3 | ||
|
|
946d0cd219 | ||
|
|
4d0b964e36 | ||
|
|
2b12ab4d5a | ||
|
|
8114957e6d | ||
|
|
50edef4ab2 | ||
|
|
e5a991988f | ||
|
|
e85eb6d0f4 | ||
|
|
6949f35f22 | ||
|
|
e0391b93c4 | ||
|
|
4a5e775a2b | ||
|
|
323f019350 | ||
|
|
98053c2d4c | ||
|
|
aab338760c | ||
|
|
ab9a2b1728 | ||
|
|
6a38d3bcf3 | ||
|
|
76f3cbdf4c | ||
|
|
d45d58b6bf | ||
|
|
f32a422330 | ||
|
|
74d4be28dd | ||
|
|
b4a31bd292 | ||
|
|
cc1adf9b38 | ||
|
|
1601b3b6b0 | ||
|
|
61cbdd1a19 | ||
|
|
a3ee6131a3 | ||
|
|
6dfddaa453 | ||
|
|
de696b7092 | ||
|
|
9165233657 | ||
|
|
aa3a417e97 | ||
|
|
996f48fcf0 | ||
|
|
81d83f629f | ||
|
|
5e3b0bf348 | ||
|
|
4a31463299 | ||
|
|
8a5471e175 | ||
|
|
605fd9f8e1 | ||
|
|
2bda43875d | ||
|
|
11edc9e7a7 | ||
|
|
3b9b823511 | ||
|
|
da0ecf59c6 | ||
|
|
e5b1fdf668 | ||
|
|
204fb82975 | ||
|
|
37839e2709 | ||
|
|
dbaedb5995 | ||
|
|
0a832e90bd | ||
|
|
b4e908d04d | ||
|
|
4619d29b78 | ||
|
|
c63b697636 | ||
|
|
06d29d6fda | ||
|
|
c0f7bc4b5e | ||
|
|
7139c9ae59 | ||
|
|
0ae00fc921 | ||
|
|
fe456cb83d | ||
|
|
a8432ed4a4 | ||
|
|
04f910b747 | ||
|
|
1c3de70155 | ||
|
|
b73642f8a8 | ||
|
|
479b497528 | ||
|
|
31b55d3844 | ||
|
|
dbf4e08d09 | ||
|
|
274359e6ee | ||
|
|
8687dcbce1 | ||
|
|
03dfbdb7b1 | ||
|
|
3c8519f245 | ||
|
|
4d2cc3ebdd | ||
|
|
6e2758ae26 | ||
|
|
4637e06ad2 | ||
|
|
764399256c | ||
|
|
f4ca4edc64 | ||
|
|
872a1216a7 | ||
|
|
8c75674591 | ||
|
|
e6244ca204 | ||
|
|
f540362e36 | ||
|
|
2be6699a6a | ||
|
|
09c10492ab | ||
|
|
c8e4b1fc84 | ||
|
|
0de7cece5b | ||
|
|
a3413a6749 | ||
|
|
b104ab9491 | ||
|
|
269c5dce60 | ||
|
|
a39c81c63f | ||
|
|
d699247269 | ||
|
|
7caafb4014 | ||
|
|
f1546abf09 | ||
|
|
3083562f6f | ||
|
|
da2ee70462 | ||
|
|
7e9dda3c5e | ||
|
|
0b96f88875 | ||
|
|
f13ffe2098 | ||
|
|
bca5d26583 | ||
|
|
660bc757f1 | ||
|
|
ca927fe587 | ||
|
|
9df8966f4a | ||
|
|
3429f41489 | ||
|
|
0c7c4924ee | ||
|
|
8f40d6617e | ||
|
|
af9e85bda1 | ||
|
|
717f45d117 | ||
|
|
35c53865fb | ||
|
|
a1d1d6d3d4 | ||
|
|
d17f812827 | ||
|
|
3916758529 | ||
|
|
2396181bc5 | ||
|
|
6e8640bf1b | ||
|
|
c2c7c7bd9a | ||
|
|
071a1c4adb | ||
|
|
d5b2dda2e8 | ||
|
|
2ac281eb3e | ||
|
|
5e81543448 | ||
|
|
b32f925468 | ||
|
|
fdeb6bcae0 | ||
|
|
76232cd9e7 | ||
|
|
4da9b5e491 | ||
|
|
c4504a9221 | ||
|
|
65de8359e7 | ||
|
|
f6fab74436 | ||
|
|
350ba264e8 | ||
|
|
29e24818a1 | ||
|
|
71cd6f7b90 | ||
|
|
84ba253791 | ||
|
|
fce158b8ad | ||
|
|
da13ba6c67 | ||
|
|
7618133298 | ||
|
|
0d1698f81d | ||
|
|
362d642c87 | ||
|
|
e4c96d5be5 | ||
|
|
f488701adc | ||
|
|
8ff2bf51c5 | ||
|
|
a2490a55a9 | ||
|
|
20189f5191 | ||
|
|
06b796c6bd | ||
|
|
ad4edf6c68 | ||
|
|
4100f20a69 | ||
|
|
bedf946fb2 | ||
|
|
b9e67157c6 | ||
|
|
b30b2a183b | ||
|
|
9ab3bcdde3 | ||
|
|
5df3bbe188 | ||
|
|
8cf12416c0 | ||
|
|
b7c2c83c88 | ||
|
|
3b6da93331 | ||
|
|
b4642d3fd4 | ||
|
|
88a2b0b911 | ||
|
|
954e127f1d | ||
|
|
7654add5e5 | ||
|
|
85a37ea53f | ||
|
|
b337acebcc | ||
|
|
fb9ca54c95 | ||
|
|
1a15d41523 | ||
|
|
e378cc5791 | ||
|
|
748c189c79 | ||
|
|
b89be6c4b9 | ||
|
|
df207807b6 | ||
|
|
1f2b40cff1 | ||
|
|
734400fd37 | ||
|
|
f19979d928 | ||
|
|
19be7a53da | ||
|
|
e56af34fb0 | ||
|
|
7737aa20e8 | ||
|
|
ead046201c | ||
|
|
0aa7c3f659 | ||
|
|
4aa7222022 | ||
|
|
86e3c78776 | ||
|
|
40076287ea | ||
|
|
ca81db8edf | ||
|
|
ae68a80e98 | ||
|
|
beb7c58375 | ||
|
|
e080b9d565 | ||
|
|
ca2db37039 | ||
|
|
194825f78e | ||
|
|
55bd765ea0 | ||
|
|
b03d61e2cf | ||
|
|
6fc0e5167b | ||
|
|
0065be011f | ||
|
|
3f7cbce58c | ||
|
|
246b62e322 | ||
|
|
7c2fdd1ee9 | ||
|
|
f77aa2623c | ||
|
|
20847a3ff5 | ||
|
|
eb6d42acf9 | ||
|
|
094d676a8b | ||
|
|
71306ceb1d | ||
|
|
8bbfc7fc22 | ||
|
|
19baba12b1 | ||
|
|
15b8819136 | ||
|
|
3fae8ade05 | ||
|
|
f9bbf31d65 | ||
|
|
df1da3dda9 | ||
|
|
c83f2a4abd | ||
|
|
ad53833040 | ||
|
|
bc8c85668a | ||
|
|
d12a3dde45 | ||
|
|
301c878c0f | ||
|
|
bd55bfa071 | ||
|
|
6d2f09b579 | ||
|
|
4bfea7f54d | ||
|
|
55906486d8 | ||
|
|
d5478e6e08 | ||
|
|
d88d85c172 | ||
|
|
59c3c536c7 | ||
|
|
a007458cb8 | ||
|
|
d051912f21 | ||
|
|
a547158a50 | ||
|
|
95f2351aa0 | ||
|
|
698aaffb0b | ||
|
|
73eccecbf8 | ||
|
|
ae4a261463 | ||
|
|
c9f0d0cec2 | ||
|
|
4fa1e45d45 | ||
|
|
1b3d252bfe | ||
|
|
a9ba4a9fcd | ||
|
|
7f49619875 | ||
|
|
696660639a | ||
|
|
da4323062d | ||
|
|
a901e171b2 | ||
|
|
6e41d532fe | ||
|
|
4fc78ffb58 | ||
|
|
8137f41fc3 | ||
|
|
2e9471797d | ||
|
|
344248cea0 | ||
|
|
2789e3dba5 | ||
|
|
cca759a41e | ||
|
|
4f7b3d8882 | ||
|
|
2b330b78b7 | ||
|
|
d47ca1912b | ||
|
|
3fd2108b10 | ||
|
|
96e2a407f4 | ||
|
|
cdf18c96f4 | ||
|
|
53acaa05b8 | ||
|
|
fb85679068 | ||
|
|
9558e14479 | ||
|
|
4af0af93bf | ||
|
|
df4bc950fe | ||
|
|
250394f72b | ||
|
|
ca83fd6dc1 | ||
|
|
d5e9e7cd2b | ||
|
|
9a96f621ef | ||
|
|
5d7ce096c6 | ||
|
|
c9f8109c06 | ||
|
|
a20b4f2864 | ||
|
|
44a19d2a0a | ||
|
|
02f3beb8db | ||
|
|
3269cc3d90 | ||
|
|
fb70a1f4ab | ||
|
|
df0aa483ce | ||
|
|
c83f12a55c | ||
|
|
9704f59566 | ||
|
|
2923893d34 | ||
|
|
890dab0742 | ||
|
|
607e26b041 | ||
|
|
ea75290f65 | ||
|
|
a176054118 | ||
|
|
9a697dc5f5 | ||
|
|
cfdb852843 | ||
|
|
2e67a91982 | ||
|
|
074ca9330d | ||
|
|
f0d7cdcb20 | ||
|
|
40d961e059 | ||
|
|
e5de759236 | ||
|
|
e26a75c59d | ||
|
|
8701145b40 | ||
|
|
a2558886c8 | ||
|
|
f818ee86ae | ||
|
|
ad0dbdaa9c | ||
|
|
a9f14b294f | ||
|
|
a435ae98f9 | ||
|
|
481b261458 | ||
|
|
48df52d743 | ||
|
|
0af0d3b171 | ||
|
|
8287cf35e7 | ||
|
|
fab7924cc2 | ||
|
|
0ab739e8b1 | ||
|
|
2dcd4d171b | ||
|
|
e7f4d18c3d | ||
|
|
1611362c22 | ||
|
|
2327698160 | ||
|
|
71c1f00ec2 | ||
|
|
6574a126ef | ||
|
|
1e68086355 | ||
|
|
326cc8fd67 | ||
|
|
4afcb421bd | ||
|
|
8d21917035 | ||
|
|
4ca7f8834c | ||
|
|
b43299c8da | ||
|
|
b763809f5e | ||
|
|
2cb97f7475 | ||
|
|
6283df7491 | ||
|
|
acc4490370 | ||
|
|
f85c1a995a | ||
|
|
809e5fda8a | ||
|
|
dce245da5a | ||
|
|
d261c4cd27 | ||
|
|
c33299d542 | ||
|
|
ebdf8a5f3c | ||
|
|
c8852d183f | ||
|
|
9f161b20ef | ||
|
|
40f9d64973 | ||
|
|
4a2e68a0fd | ||
|
|
bcd90d3401 | ||
|
|
114af7d33f | ||
|
|
7b83d2de49 | ||
|
|
850de5913d | ||
|
|
bb9ee46f40 | ||
|
|
e94fc1305b | ||
|
|
3e4e8feb29 | ||
|
|
fedf347b1a | ||
|
|
285277a50b | ||
|
|
323c96f42f | ||
|
|
7dee344ea9 | ||
|
|
65bce588e4 | ||
|
|
233ff1b744 | ||
|
|
0837e39787 | ||
|
|
86db565a21 | ||
|
|
d6ac5e5001 | ||
|
|
e6443f1981 | ||
|
|
d13e6c73db | ||
|
|
79ca7f3cb5 | ||
|
|
cfd07ccd34 | ||
|
|
48047d523a | ||
|
|
eeb8fc2626 | ||
|
|
3d1baf3f2f | ||
|
|
4e382d6765 | ||
|
|
582963375d | ||
|
|
56c7c1bcc8 | ||
|
|
f88e57ddb8 | ||
|
|
9d98e012e4 | ||
|
|
d305a774f0 | ||
|
|
16b0c8d353 | ||
|
|
55da4fdbf6 | ||
|
|
ed2fbd8f25 | ||
|
|
42199bc8e5 | ||
|
|
7c5318768c | ||
|
|
aba25aab19 | ||
|
|
f99bd33f91 | ||
|
|
a6a6ce83f0 | ||
|
|
f4908a9758 | ||
|
|
5e4ca4b76a | ||
|
|
1e938d0e90 | ||
|
|
f3704f4c05 | ||
|
|
8800efe953 | ||
|
|
a320c4584e | ||
|
|
3841850168 | ||
|
|
beb3885840 | ||
|
|
06967c0c46 | ||
|
|
9a382c572c | ||
|
|
44b6c371db | ||
|
|
00970be996 | ||
|
|
aca4ab015f | ||
|
|
68b63d5783 | ||
|
|
4b499f2bb1 | ||
|
|
ed17581f92 | ||
|
|
a46c4ec912 | ||
|
|
930cbeec17 | ||
|
|
10689ffaba | ||
|
|
29b0ea0af9 | ||
|
|
57d00946be | ||
|
|
ef51de72c9 | ||
|
|
c807bf1e0e | ||
|
|
2525b3fb05 | ||
|
|
9163ce0f6e | ||
|
|
d776638f53 | ||
|
|
83fff41312 | ||
|
|
dd7d9bc95b | ||
|
|
f8eabbc100 | ||
|
|
7ed18ac62d | ||
|
|
3ac707c645 | ||
|
|
8e9a1e0bf3 | ||
|
|
bc31b5d27a | ||
|
|
936738b750 | ||
|
|
7c3048ab9c | ||
|
|
64719f3ace | ||
|
|
a11a5f04d5 | ||
|
|
eb5c035dde | ||
|
|
c3887efbf3 | ||
|
|
495585830d | ||
|
|
6715cb9880 | ||
|
|
41b167d23c | ||
|
|
7ea8b54210 | ||
|
|
bcea39a858 | ||
|
|
fb560abac4 | ||
|
|
ba93a08b40 | ||
|
|
2be6b3481c | ||
|
|
6ef44a6fbb | ||
|
|
2afe40a0b5 | ||
|
|
e57d004718 | ||
|
|
d780d0aabb | ||
|
|
0f9e3f0767 | ||
|
|
381972c923 | ||
|
|
845d7ad718 | ||
|
|
f1b6c0c559 | ||
|
|
e39eddf3fe | ||
|
|
72218fb475 | ||
|
|
9a3e497c22 | ||
|
|
85d510cd48 | ||
|
|
786c65ea5f | ||
|
|
10e6f61125 | ||
|
|
cdd06e7236 | ||
|
|
48603c0ee2 | ||
|
|
63f30492be | ||
|
|
0e8772290d | ||
|
|
6cfc5798b0 | ||
|
|
6be275f5d4 | ||
|
|
716f237c4c | ||
|
|
2a192be4f5 | ||
|
|
2679185a09 | ||
|
|
b85e7ab0b1 | ||
|
|
29c9804843 | ||
|
|
56d8ddbaaf | ||
|
|
8b324249b1 | ||
|
|
59cc61529b | ||
|
|
3912e5ef0b | ||
|
|
e40fbf1470 | ||
|
|
56a03e1a10 | ||
|
|
5d5952d354 | ||
|
|
53fda88d4c | ||
|
|
c4f306c145 | ||
|
|
e01d7fcefc | ||
|
|
aec04b07e0 | ||
|
|
b1872a8e21 | ||
|
|
634816d378 | ||
|
|
2fd5a6d47f | ||
|
|
8dca56521b | ||
|
|
a41aefe77d | ||
|
|
46dbc7157d | ||
|
|
59261113d8 | ||
|
|
fc2834cf04 | ||
|
|
a15633053b | ||
|
|
60a06eef19 | ||
|
|
7fd6ddc25b | ||
|
|
c49e0ac5c8 | ||
|
|
a51e95d052 | ||
|
|
4df9d70e4a | ||
|
|
78d490d5e4 | ||
|
|
2f6002b197 | ||
|
|
abcb95b8a1 | ||
|
|
bf435cae7c | ||
|
|
4b38acd540 | ||
|
|
f71749c3c4 | ||
|
|
cbc90e7ffb | ||
|
|
62866dc8be | ||
|
|
11e702c430 | ||
|
|
3e6e6ec0a5 | ||
|
|
898c08c8e0 | ||
|
|
88fba101a3 | ||
|
|
b0f431e1a2 | ||
|
|
42a7aca504 | ||
|
|
c017f2e7c4 | ||
|
|
d17bcd8afe | ||
|
|
874673f64f | ||
|
|
e052d73321 | ||
|
|
58efab5cdf | ||
|
|
4360fe492e | ||
|
|
295faf726b | ||
|
|
2da9d46ca6 | ||
|
|
e4f1e5f4c3 | ||
|
|
c695af31b8 | ||
|
|
24753c8c6a | ||
|
|
6196cf09ff | ||
|
|
28eb5b9bc4 | ||
|
|
bb20331f9e | ||
|
|
d2bce042a5 | ||
|
|
5d57263a15 | ||
|
|
bded8755a1 | ||
|
|
2e9ade61b2 | ||
|
|
89e03a86b7 | ||
|
|
48e88e4e74 | ||
|
|
d182ecb2d3 | ||
|
|
27e4503dc6 | ||
|
|
72b596efb3 | ||
|
|
0d1de96dbc | ||
|
|
788f69a8c9 | ||
|
|
08b63b4f01 | ||
|
|
ba07dc1804 | ||
|
|
d46074e0ad | ||
|
|
d651063749 | ||
|
|
f60f8396bb | ||
|
|
919fdd70b8 | ||
|
|
ab2702070b | ||
|
|
057e1a1aff | ||
|
|
a2af4e1284 | ||
|
|
97adede70b | ||
|
|
b6447a9032 | ||
|
|
e40b5819bd | ||
|
|
16926edf18 | ||
|
|
8203c79f76 | ||
|
|
43e1b27d16 | ||
|
|
d1cb3b0d15 | ||
|
|
266b3b8678 | ||
|
|
a2629c4929 | ||
|
|
c1fc629c54 | ||
|
|
0d12fe43a0 | ||
|
|
6aec0ce702 | ||
|
|
32c30c34e9 | ||
|
|
6b7b2612a9 | ||
|
|
0b9c6ed178 | ||
|
|
d903855aa3 | ||
|
|
89234bcd42 | ||
|
|
85ba590fa9 | ||
|
|
2950f77dbc | ||
|
|
a94f5ba200 | ||
|
|
0c4e40102f | ||
|
|
27e8126b18 | ||
|
|
bf860b21d7 | ||
|
|
a03a540156 | ||
|
|
eb63c8dcb8 | ||
|
|
cdcb94751e | ||
|
|
cd5d8cceb8 | ||
|
|
8fbc87be46 | ||
|
|
06fba42858 | ||
|
|
0f8a1e3901 | ||
|
|
729dfdfed7 | ||
|
|
1b8051dfe5 | ||
|
|
be6454193b | ||
|
|
f3347be629 | ||
|
|
dbce06500d | ||
|
|
7a81dd3378 | ||
|
|
57dd9c9e01 | ||
|
|
ef4e52a60e | ||
|
|
e7cbefa316 | ||
|
|
b4f805b4e9 | ||
|
|
9b0d26aedd | ||
|
|
f6758c397d | ||
|
|
ef3ed6e338 | ||
|
|
45aa8742d8 | ||
|
|
ebe8f554c6 | ||
|
|
45b0e63be2 | ||
|
|
934dc842e0 | ||
|
|
deda877355 | ||
|
|
2dba8404eb | ||
|
|
f581b4e92c | ||
|
|
02c74b5bee | ||
|
|
df69439b9c | ||
|
|
eb4a686b14 | ||
|
|
3386466e7a | ||
|
|
6a2aa7e4f0 | ||
|
|
735871d501 | ||
|
|
097f3590ae | ||
|
|
17bf13fcb6 | ||
|
|
2dc7b7ad78 | ||
|
|
a3c1724d17 | ||
|
|
5a9309de78 | ||
|
|
a40fae04ce | ||
|
|
f8cb6979d7 | ||
|
|
fc70ae180e | ||
|
|
66b5fa821c | ||
|
|
2f2f416bea | ||
|
|
1da07a3b86 | ||
|
|
ad0fcb745e | ||
|
|
5a502d451d | ||
|
|
955824e634 | ||
|
|
3b62f3c9c0 | ||
|
|
d2a27a84cf | ||
|
|
c7d8eb126f | ||
|
|
d608fd77b9 | ||
|
|
af5aa38bc3 | ||
|
|
2f2f367c0b | ||
|
|
d7a2362a76 | ||
|
|
e479c8a553 | ||
|
|
62f707f501 | ||
|
|
19d62b7a68 | ||
|
|
103bda04d9 | ||
|
|
8e6846d9da | ||
|
|
fd38216eda | ||
|
|
ae27b8944e | ||
|
|
bb6b825836 | ||
|
|
3fc55bba8e | ||
|
|
92819f5082 | ||
|
|
736b9074c8 | ||
|
|
376147911f | ||
|
|
4281690021 | ||
|
|
65714165f9 | ||
|
|
82d917c2c5 | ||
|
|
8487d67f00 | ||
|
|
67d1dad77c | ||
|
|
3b39c3391d | ||
|
|
8a55c6fd9f | ||
|
|
68567e763c | ||
|
|
bc2d3a13f4 | ||
|
|
e0bca07e06 | ||
|
|
377f194837 | ||
|
|
de9989d5a2 | ||
|
|
50db34457c | ||
|
|
b1ce6bd5cc | ||
|
|
81915540de | ||
|
|
0d65f08b1d | ||
|
|
ffbd1fd474 | ||
|
|
700c1f836d | ||
|
|
db2c6820ee | ||
|
|
3236607be4 | ||
|
|
3edbeb8902 | ||
|
|
f59467b897 | ||
|
|
6bc81d3d26 | ||
|
|
4c26792c9b | ||
|
|
9a133ced2d | ||
|
|
18bebaf5c3 | ||
|
|
f7efae93d5 | ||
|
|
7b4d2118ea | ||
|
|
26eb7c9375 | ||
|
|
e4d5367ead | ||
|
|
47b5157f01 | ||
|
|
39444d83c5 | ||
|
|
350028553b | ||
|
|
7392add8e0 | ||
|
|
e14695c96e | ||
|
|
b4d3806f10 | ||
|
|
996afe7d95 | ||
|
|
905cadc00e | ||
|
|
6634751303 | ||
|
|
64b57fa907 | ||
|
|
dd4059beb8 | ||
|
|
fe3b54bc2e | ||
|
|
1b5e1943f5 | ||
|
|
b1e6fe7139 | ||
|
|
92718a819c | ||
|
|
ceb2f6894f | ||
|
|
c42612abac | ||
|
|
7069d7d802 | ||
|
|
9aaa6d5df1 | ||
|
|
3eb155cf2a | ||
|
|
7c8d914711 | ||
|
|
4d1f8bd057 | ||
|
|
b883ce95b2 | ||
|
|
546e7c0c1f | ||
|
|
4f2dc0ecff | ||
|
|
03c5d06107 | ||
|
|
9499047f8e | ||
|
|
db5674cb08 | ||
|
|
66d000f4ba | ||
|
|
2c3c990019 | ||
|
|
807aecdb11 | ||
|
|
ea1b705c1c | ||
|
|
cb8b0d3597 | ||
|
|
7a86514505 | ||
|
|
3a0babb47d | ||
|
|
b085b34a69 | ||
|
|
abc738b6f1 | ||
|
|
d37cc5a160 | ||
|
|
1a0de753e9 | ||
|
|
b798f4fe71 | ||
|
|
0c0a588b55 | ||
|
|
faa5ef193b | ||
|
|
4c7b5005a6 | ||
|
|
9cf61cef9d | ||
|
|
28c61b548b | ||
|
|
0b24e62d43 | ||
|
|
b19dd49fc9 | ||
|
|
91b1e66933 | ||
|
|
eea2712eac | ||
|
|
b19a4b6956 | ||
|
|
a01c995a53 | ||
|
|
59b491e3a8 | ||
|
|
c44febe85e | ||
|
|
15b3c9797b | ||
|
|
584cfa4d4a | ||
|
|
b92f57eacb | ||
|
|
aeeaaa53d4 | ||
|
|
a532fce0e4 | ||
|
|
510fe8e634 | ||
|
|
556d90a1b4 | ||
|
|
4dde1ede0e | ||
|
|
1c833f8a9a | ||
|
|
6a36bd8514 | ||
|
|
12cb819adc | ||
|
|
0607edd191 | ||
|
|
96c7abdb39 | ||
|
|
6835aecdce | ||
|
|
8174c1ad02 | ||
|
|
6129452681 | ||
|
|
be1a3f427e | ||
|
|
18dc947fa9 | ||
|
|
348c43de63 | ||
|
|
cd9b15b2a6 | ||
|
|
8b20d777b0 | ||
|
|
ec0947ef7e | ||
|
|
02e6005fa9 | ||
|
|
a32caac3c1 | ||
|
|
2aa618ce98 | ||
|
|
96b23f6edd | ||
|
|
02d162858f | ||
|
|
82844a5591 | ||
|
|
46fb5a852f | ||
|
|
10a3aa18bc | ||
|
|
3c395c26be | ||
|
|
ea78520220 | ||
|
|
92fbec2294 | ||
|
|
b9be4ae4e8 | ||
|
|
e9a7f60fa7 | ||
|
|
0a02d1f336 | ||
|
|
663f3592ba | ||
|
|
f9484a894f | ||
|
|
4e522ab7f5 | ||
|
|
96d150e92d | ||
|
|
592b2e76a8 | ||
|
|
a3e463030d | ||
|
|
4569278c53 | ||
|
|
851b022c7a | ||
|
|
0985f675e3 | ||
|
|
7df730cedd | ||
|
|
314ffd9353 | ||
|
|
2c953dc37f | ||
|
|
9b9e4e5a3f | ||
|
|
50f835c701 | ||
|
|
cbb3351d97 | ||
|
|
fb81721e7e | ||
|
|
2cedef1333 | ||
|
|
4a1697a1b5 | ||
|
|
86f08a341c | ||
|
|
3d85cbe6b5 | ||
|
|
6d3dd98e77 | ||
|
|
9b2004d6b7 | ||
|
|
eb072da81c | ||
|
|
38669d0a10 | ||
|
|
202a8bc3bb | ||
|
|
45e8ed6b49 | ||
|
|
96692e8a5b | ||
|
|
ecb08b0cf3 | ||
|
|
71bdfd9710 | ||
|
|
193dcf38f4 | ||
|
|
09091781cf | ||
|
|
023519c8f6 | ||
|
|
d60d0a60c7 | ||
|
|
8fe0c3dd84 | ||
|
|
85419f01a9 | ||
|
|
a199f4a849 | ||
|
|
290795a76b | ||
|
|
c2cf2bc0ba | ||
|
|
2224918730 | ||
|
|
c4e69daecd | ||
|
|
9162e68d82 | ||
|
|
08f736ae33 | ||
|
|
81092edab4 | ||
|
|
21b5a4e9e4 | ||
|
|
057928b079 | ||
|
|
4beaa45199 | ||
|
|
8f88fa45f1 | ||
|
|
13e8176884 | ||
|
|
aac0130613 | ||
|
|
0877f44cb5 | ||
|
|
59159b4811 | ||
|
|
12bd12e112 | ||
|
|
0e4f9170fa | ||
|
|
6f81a9cb1e | ||
|
|
41555e5aa3 | ||
|
|
3d06720628 | ||
|
|
c1d2b98386 | ||
|
|
1a60723d77 | ||
|
|
cc31ab84d7 | ||
|
|
a07a234761 | ||
|
|
0bb4ccd7cd | ||
|
|
74cf205bcf | ||
|
|
77405ddded | ||
|
|
6b46da0240 | ||
|
|
0815812546 | ||
|
|
0fed1d34d1 | ||
|
|
a1e091cff7 | ||
|
|
adebc99e49 | ||
|
|
d3d1291d5a | ||
|
|
de61015e08 | ||
|
|
9d856ec1bf | ||
|
|
ad19d32a66 | ||
|
|
5bdb8674ed | ||
|
|
5563c9666c | ||
|
|
30ad20be52 | ||
|
|
314c9de845 | ||
|
|
41dbfc9e1c | ||
|
|
b07dd622fa | ||
|
|
6ad21b3b3b | ||
|
|
a242c1019d | ||
|
|
c595d67311 | ||
|
|
8b77379e2c | ||
|
|
7ad29c6329 | ||
|
|
14756fa131 | ||
|
|
ddbfc176b6 | ||
|
|
ab668b066f | ||
|
|
a4bcb3de4a | ||
|
|
211894cb3e | ||
|
|
7565b1f4f2 | ||
|
|
b75ff3652c | ||
|
|
13f6c5a934 | ||
|
|
2e0f6e2b13 | ||
|
|
c5d41ee2d9 | ||
|
|
5f70c1aa68 | ||
|
|
d2105ba390 | ||
|
|
e46e7bbf99 | ||
|
|
4eeeb72dd5 | ||
|
|
adefa45fb4 | ||
|
|
cfc06ab2a7 | ||
|
|
f3a4752799 | ||
|
|
3d788b4b93 | ||
|
|
5d2675e38a | ||
|
|
288d7bd9dc | ||
|
|
3e8cf26c1a | ||
|
|
ce212722ad | ||
|
|
5c127daeb4 | ||
|
|
e49fc945df | ||
|
|
384807ebbd | ||
|
|
ac619ef3d8 | ||
|
|
a348bd3458 | ||
|
|
bcc7045fc9 | ||
|
|
3b1929259a | ||
|
|
cdd6ea8e60 | ||
|
|
4b8927af75 | ||
|
|
0fba25c1b3 | ||
|
|
f19ba9d54d | ||
|
|
8e9a0121ac | ||
|
|
bd6e8d808c | ||
|
|
11b9a631d4 | ||
|
|
f197dd29cb | ||
|
|
daf7f42138 | ||
|
|
dd487d4184 | ||
|
|
d90071637d | ||
|
|
d8efae2aba | ||
|
|
22543f3e19 | ||
|
|
6aaef67e73 | ||
|
|
82a934d6fb | ||
|
|
eca6f2ca05 | ||
|
|
ef69f36403 | ||
|
|
99cf981c2f | ||
|
|
fc7a449f6d | ||
|
|
b7fafdafaa | ||
|
|
8e180cfcde | ||
|
|
4770fd39d2 | ||
|
|
df107628c6 | ||
|
|
3463080a71 | ||
|
|
500dc2170f | ||
|
|
a76ae67a81 | ||
|
|
1d091e49e1 | ||
|
|
2b63219cc6 | ||
|
|
f1b7762bef | ||
|
|
043ad86482 | ||
|
|
74ca9578ed | ||
|
|
d499161446 | ||
|
|
34e8de56bc | ||
|
|
8a7864ebaa | ||
|
|
9e5fb5467f | ||
|
|
fb34bf7222 | ||
|
|
4591f35b7c | ||
|
|
f0a06182ca | ||
|
|
d9e47a6293 | ||
|
|
a555f87705 | ||
|
|
826b997166 | ||
|
|
d34bc6f304 | ||
|
|
5771ea48ef | ||
|
|
a4f3199427 | ||
|
|
e6a43fc127 | ||
|
|
701bd38d01 | ||
|
|
1a8c8bec0d | ||
|
|
20aa21d4b6 | ||
|
|
8c6adeb85a | ||
|
|
09b7ba1317 | ||
|
|
0703843ac1 | ||
|
|
d962dfe48c | ||
|
|
d6884db439 | ||
|
|
fdcbedef8f | ||
|
|
8afd19648f | ||
|
|
3017f12238 | ||
|
|
23ee0342c6 | ||
|
|
499f98a51c | ||
|
|
3073db4e81 | ||
|
|
5703377a5f | ||
|
|
b85aa872cc | ||
|
|
5a1a5a7d97 | ||
|
|
52912c6329 | ||
|
|
056f72f27f | ||
|
|
bb038e86a2 | ||
|
|
cc6c71eb37 | ||
|
|
de4358f8d8 | ||
|
|
d6e9c72424 | ||
|
|
96608fb18d | ||
|
|
280b826d6d | ||
|
|
538d3d46f4 | ||
|
|
66b8ec8935 | ||
|
|
4f30025aa0 | ||
|
|
faad36a3ef | ||
|
|
0b461599d1 | ||
|
|
0cbab84143 | ||
|
|
a4e2a770f6 | ||
|
|
36e84973ec | ||
|
|
f6c8888ee2 | ||
|
|
f2bf6a037b | ||
|
|
9dade8fbd9 | ||
|
|
d2d38edf06 | ||
|
|
e0abd238e3 | ||
|
|
7edcc08886 | ||
|
|
0c73b547f1 | ||
|
|
73c3d4bb50 | ||
|
|
77f063367a | ||
|
|
8e812058cb | ||
|
|
506c36beed | ||
|
|
0110f0193e | ||
|
|
7b870f4b2a | ||
|
|
aa2630f837 | ||
|
|
e137e93f94 | ||
|
|
215bdfccc2 | ||
|
|
956a0a9c99 | ||
|
|
ab83717b7d | ||
|
|
61e876e4bf | ||
|
|
9ca3dbc140 | ||
|
|
a02e2e25bb | ||
|
|
a9281f2c37 | ||
|
|
95395a8b87 | ||
|
|
ecdbd72fa1 | ||
|
|
3a2f8224e4 | ||
|
|
15841fe5f6 | ||
|
|
7e5a7b65a0 | ||
|
|
549bf876e4 | ||
|
|
bd60cf12f8 | ||
|
|
61fbab1910 | ||
|
|
957f495314 | ||
|
|
280eb48ba4 | ||
|
|
ebe5711b40 | ||
|
|
a16477d84f | ||
|
|
f6fb2362c6 | ||
|
|
170427bba1 | ||
|
|
93531e520a | ||
|
|
aa2db8fdde | ||
|
|
7c3c2af90b | ||
|
|
6dca9b4ba4 | ||
|
|
ede37bb9d8 | ||
|
|
4a1729eaab | ||
|
|
b1565f5b89 | ||
|
|
4fb8dcfd4e | ||
|
|
16d1f2b835 | ||
|
|
73594e5aa5 | ||
|
|
c0a365bd34 | ||
|
|
45940ff820 | ||
|
|
d545ae242c | ||
|
|
e862aaf2e1 | ||
|
|
30c3540086 | ||
|
|
663a084ca4 | ||
|
|
b4d9ccd9af | ||
|
|
98fff6a4ce | ||
|
|
4977a5e1d9 | ||
|
|
e4297486ef | ||
|
|
ad591767c9 | ||
|
|
8bc1e75d9f | ||
|
|
a1c7adcffc | ||
|
|
8867169957 | ||
|
|
79eac1e6b0 | ||
|
|
87533b13e1 | ||
|
|
a2ffe86a36 | ||
|
|
22bde7d461 |
+115
@@ -0,0 +1,115 @@
|
|||||||
|
---
|
||||||
|
Language: Cpp
|
||||||
|
# BasedOnStyle: LLVM
|
||||||
|
AccessModifierOffset: -4
|
||||||
|
AlignAfterOpenBracket: Align
|
||||||
|
AlignConsecutiveAssignments: false
|
||||||
|
AlignConsecutiveDeclarations: false
|
||||||
|
AlignEscapedNewlines: DontAlign
|
||||||
|
AlignOperands: true
|
||||||
|
AlignTrailingComments: false
|
||||||
|
AllowAllParametersOfDeclarationOnNextLine: true
|
||||||
|
AllowShortBlocksOnASingleLine: true
|
||||||
|
AllowShortCaseLabelsOnASingleLine: true
|
||||||
|
AllowShortFunctionsOnASingleLine: All
|
||||||
|
AllowShortIfStatementsOnASingleLine: true
|
||||||
|
AllowShortLoopsOnASingleLine: false
|
||||||
|
AlwaysBreakAfterDefinitionReturnType: None
|
||||||
|
AlwaysBreakAfterReturnType: None
|
||||||
|
AlwaysBreakBeforeMultilineStrings: false
|
||||||
|
AlwaysBreakTemplateDeclarations: false
|
||||||
|
BinPackArguments: true
|
||||||
|
BinPackParameters: true
|
||||||
|
BraceWrapping:
|
||||||
|
AfterClass: false
|
||||||
|
AfterControlStatement: false
|
||||||
|
AfterEnum: false
|
||||||
|
AfterFunction: false
|
||||||
|
AfterNamespace: false
|
||||||
|
AfterObjCDeclaration: false
|
||||||
|
AfterStruct: false
|
||||||
|
AfterUnion: false
|
||||||
|
AfterExternBlock: false
|
||||||
|
BeforeCatch: false
|
||||||
|
BeforeElse: false
|
||||||
|
IndentBraces: false
|
||||||
|
SplitEmptyFunction: true
|
||||||
|
SplitEmptyRecord: true
|
||||||
|
SplitEmptyNamespace: true
|
||||||
|
BreakBeforeBinaryOperators: All
|
||||||
|
BreakBeforeBraces: Attach
|
||||||
|
BreakBeforeInheritanceComma: false
|
||||||
|
BreakBeforeTernaryOperators: true
|
||||||
|
BreakConstructorInitializersBeforeComma: false
|
||||||
|
BreakConstructorInitializers: BeforeComma
|
||||||
|
BreakAfterJavaFieldAnnotations: false
|
||||||
|
BreakStringLiterals: true
|
||||||
|
ColumnLimit: 99
|
||||||
|
CommentPragmas: '^ IWYU pragma:'
|
||||||
|
CompactNamespaces: false
|
||||||
|
ConstructorInitializerAllOnOneLineOrOnePerLine: false
|
||||||
|
ConstructorInitializerIndentWidth: 4
|
||||||
|
ContinuationIndentWidth: 4
|
||||||
|
Cpp11BracedListStyle: true
|
||||||
|
DerivePointerAlignment: false
|
||||||
|
DisableFormat: false
|
||||||
|
ExperimentalAutoDetectBinPacking: false
|
||||||
|
FixNamespaceComments: true
|
||||||
|
ForEachMacros:
|
||||||
|
- foreach
|
||||||
|
- Q_FOREACH
|
||||||
|
- BOOST_FOREACH
|
||||||
|
IncludeBlocks: Preserve
|
||||||
|
IncludeCategories:
|
||||||
|
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
|
||||||
|
Priority: 2
|
||||||
|
- Regex: '^(<|"(gtest|gmock|isl|json)/)'
|
||||||
|
Priority: 3
|
||||||
|
- Regex: '.*'
|
||||||
|
Priority: 1
|
||||||
|
IncludeIsMainRegex: '(Test)?$'
|
||||||
|
IndentCaseLabels: false
|
||||||
|
IndentPPDirectives: None
|
||||||
|
IndentWidth: 4
|
||||||
|
IndentWrappedFunctionNames: false
|
||||||
|
JavaScriptQuotes: Leave
|
||||||
|
JavaScriptWrapImports: true
|
||||||
|
KeepEmptyLinesAtTheStartOfBlocks: true
|
||||||
|
MacroBlockBegin: ''
|
||||||
|
MacroBlockEnd: ''
|
||||||
|
MaxEmptyLinesToKeep: 1
|
||||||
|
NamespaceIndentation: None
|
||||||
|
ObjCBlockIndentWidth: 2
|
||||||
|
ObjCSpaceAfterProperty: false
|
||||||
|
ObjCSpaceBeforeProtocolList: true
|
||||||
|
PenaltyBreakAssignment: 2
|
||||||
|
PenaltyBreakBeforeFirstCallParameter: 19
|
||||||
|
PenaltyBreakComment: 300
|
||||||
|
PenaltyBreakFirstLessLess: 120
|
||||||
|
PenaltyBreakString: 1000
|
||||||
|
PenaltyExcessCharacter: 1000000
|
||||||
|
PenaltyReturnTypeOnItsOwnLine: 60
|
||||||
|
PointerAlignment: Left
|
||||||
|
RawStringFormats:
|
||||||
|
- Delimiter: pb
|
||||||
|
Language: TextProto
|
||||||
|
BasedOnStyle: google
|
||||||
|
ReflowComments: true
|
||||||
|
SortIncludes: false
|
||||||
|
SortUsingDeclarations: true
|
||||||
|
SpaceAfterCStyleCast: false
|
||||||
|
SpaceAfterTemplateKeyword: true
|
||||||
|
SpaceBeforeAssignmentOperators: true
|
||||||
|
SpaceBeforeParens: ControlStatements
|
||||||
|
SpaceInEmptyParentheses: false
|
||||||
|
SpacesBeforeTrailingComments: 2
|
||||||
|
SpacesInAngles: false
|
||||||
|
SpacesInContainerLiterals: true
|
||||||
|
SpacesInCStyleCastParentheses: false
|
||||||
|
SpacesInParentheses: false
|
||||||
|
SpacesInSquareBrackets: false
|
||||||
|
Standard: Cpp11
|
||||||
|
TabWidth: 8
|
||||||
|
UseTab: Never
|
||||||
|
...
|
||||||
|
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
Checks: 'clang-diagnostic-*,clang-analyzer-*,*,-modernize*,-hicpp*,-android-cloexec-fopen,-cert-dcl50-cpp,-cert-env33-c,-cert-err34-c,-cert-err58-cpp,-clang-analyzer-core.UndefinedBinaryOperatorResult,-clang-analyzer-security*,-cppcoreguidelines-no-malloc,-cppcoreguidelines-owning-memory,-cppcoreguidelines-pro-bounds-array-to-pointer-decay,-cppcoreguidelines-pro-bounds-array-to-pointer-decay,-cppcoreguidelines-pro-bounds-constant-array-index,-cppcoreguidelines-pro-bounds-pointer-arithmetic,-cppcoreguidelines-pro-type-const-cast,-cppcoreguidelines-pro-type-reinterpret-cast,-cppcoreguidelines-pro-type-static-cast-downcast,-cppcoreguidelines-pro-type-union-access,-cppcoreguidelines-pro-type-vararg,-cppcoreguidelines-special-member-functions,-fuchsia-default-arguments,-fuchsia-overloaded-operator,-google-default-arguments,-google-readability-todo,-google-runtime-references,-llvm-header-guard,-llvm-include-order,-misc-string-integer-assignment,-misc-string-literal-with-embedded-nul,-readability-braces-around-statements,-readability-container-size-empty,-readability-delete-null-pointer,-readability-else-after-return,-readability-implicit-bool-conversion,-readability-named-parameter,-readability-static-accessed-through-instance'
|
||||||
|
WarningsAsErrors: ''
|
||||||
|
HeaderFilterRegex: ''
|
||||||
|
FormatStyle: none
|
||||||
|
CheckOptions:
|
||||||
|
- key: google-readability-braces-around-statements.ShortStatementLines
|
||||||
|
value: '2'
|
||||||
|
- key: google-readability-namespace-comments.SpacesBeforeComments
|
||||||
|
value: '2'
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
---
|
||||||
|
exclude_paths:
|
||||||
|
- 'ci/build_verilator.sh'
|
||||||
|
- 'include/vltstd/**'
|
||||||
-20
@@ -1,20 +0,0 @@
|
|||||||
*.old
|
|
||||||
*.gz
|
|
||||||
*.gz.uu
|
|
||||||
*.html
|
|
||||||
*.info
|
|
||||||
*.log
|
|
||||||
*.1
|
|
||||||
*.tmp
|
|
||||||
*.tex
|
|
||||||
Makefile
|
|
||||||
README
|
|
||||||
config.cache
|
|
||||||
config.status
|
|
||||||
configure
|
|
||||||
dddrun*
|
|
||||||
gdbrun*
|
|
||||||
verilator.txt
|
|
||||||
verilator.pdf
|
|
||||||
verilator_bin*
|
|
||||||
autom4te.cache
|
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
*.v linguist-language=SystemVerilog
|
||||||
|
*.vh linguist-language=SystemVerilog
|
||||||
|
*.sv linguist-language=SystemVerilog
|
||||||
|
nodist linguist-detectable=false
|
||||||
+35
@@ -0,0 +1,35 @@
|
|||||||
|
\#*
|
||||||
|
.#*
|
||||||
|
*~
|
||||||
|
*.tidy
|
||||||
|
*.old
|
||||||
|
*.gz
|
||||||
|
*.gz.uu
|
||||||
|
*.html
|
||||||
|
*.info
|
||||||
|
*.log
|
||||||
|
*.1
|
||||||
|
.*.swp
|
||||||
|
*.tmp
|
||||||
|
*.tex
|
||||||
|
*.pdf
|
||||||
|
/Makefile
|
||||||
|
README
|
||||||
|
TAGS
|
||||||
|
autom4te.cache
|
||||||
|
config.cache
|
||||||
|
config.status
|
||||||
|
configure
|
||||||
|
dddrun*
|
||||||
|
doxygen-doc
|
||||||
|
gdbrun*
|
||||||
|
gmon.out
|
||||||
|
ncverilog.history
|
||||||
|
internals.txt
|
||||||
|
verilator.txt
|
||||||
|
verilator_bin*
|
||||||
|
verilator_coverage_bin*
|
||||||
|
verilator.pc
|
||||||
|
verilator-config.cmake
|
||||||
|
verilator-config-version.cmake
|
||||||
|
**/obj_dir/*
|
||||||
+176
@@ -0,0 +1,176 @@
|
|||||||
|
# DESCRIPTION: Travis-CI config
|
||||||
|
#
|
||||||
|
# Copyright 2003-2019 by Todd Strader. Verilator is free software; you can
|
||||||
|
# redistribute it and/or modify it under the terms of either the GNU Lesser
|
||||||
|
# General Public License Version 3 or the Perl Artistic License Version 2.0.
|
||||||
|
|
||||||
|
version: ~> 1.0
|
||||||
|
|
||||||
|
os: linux
|
||||||
|
language: cpp
|
||||||
|
cache: ccache
|
||||||
|
|
||||||
|
env:
|
||||||
|
global:
|
||||||
|
- VERILATOR_CACHE=$HOME/verilator_cache
|
||||||
|
- VERILATOR_ROOT=$PWD
|
||||||
|
- VERILATOR_NUM_JOBS=$(echo `nproc` + 1 | bc)
|
||||||
|
- VERILATOR_CONFIG_FLAGS="--enable-maintainer-mode --enable-longtests"
|
||||||
|
- OBJCACHE=ccache
|
||||||
|
|
||||||
|
cache:
|
||||||
|
directories:
|
||||||
|
- $VERILATOR_CACHE
|
||||||
|
|
||||||
|
before_install:
|
||||||
|
# Perl modules needed for testing
|
||||||
|
- yes yes | sudo cpan -fi Unix::Processors Parallel::Forker Bit::Vector
|
||||||
|
- sudo apt-get install gdb gtkwave
|
||||||
|
before_script:
|
||||||
|
- bash -x ci/build_verilator.sh
|
||||||
|
after_script:
|
||||||
|
- ccache -s
|
||||||
|
|
||||||
|
stages:
|
||||||
|
- "Build Verilator"
|
||||||
|
- test
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
include:
|
||||||
|
- if: type != cron
|
||||||
|
stage: "Build Verilator"
|
||||||
|
name: Build Verilator
|
||||||
|
compiler: gcc
|
||||||
|
script: echo "Done building Verilator"
|
||||||
|
# Non-cron build will just run on whatever linux flavor we get
|
||||||
|
- if: type != cron
|
||||||
|
stage: test
|
||||||
|
name: Dist test
|
||||||
|
compiler: gcc
|
||||||
|
script: ci/test.sh dist
|
||||||
|
- if: type != cron
|
||||||
|
stage: test
|
||||||
|
name: Vlt test
|
||||||
|
compiler: gcc
|
||||||
|
script: ci/test.sh vlt
|
||||||
|
- if: type != cron
|
||||||
|
stage: test
|
||||||
|
name: Vltmt test
|
||||||
|
compiler: gcc
|
||||||
|
script: ci/test.sh vltmt
|
||||||
|
# Cron builds try different OS/compiler combinations
|
||||||
|
- if: type = cron
|
||||||
|
stage: "Build Verilator"
|
||||||
|
name: Build xenial gcc Verilator
|
||||||
|
os: linux
|
||||||
|
dist: xenial
|
||||||
|
compiler: gcc
|
||||||
|
script: echo "Done building Verilator"
|
||||||
|
- if: type = cron
|
||||||
|
stage: test
|
||||||
|
name: Xenial gcc dist test
|
||||||
|
os: linux
|
||||||
|
dist: xenial
|
||||||
|
compiler: gcc
|
||||||
|
script: ci/test.sh dist
|
||||||
|
- if: type = cron
|
||||||
|
stage: test
|
||||||
|
name: Xenial gcc vlt test
|
||||||
|
os: linux
|
||||||
|
dist: xenial
|
||||||
|
compiler: gcc
|
||||||
|
script: ci/test.sh vlt
|
||||||
|
- if: type = cron
|
||||||
|
stage: test
|
||||||
|
name: Xenial gcc vltmt test
|
||||||
|
os: linux
|
||||||
|
dist: xenial
|
||||||
|
compiler: gcc
|
||||||
|
script: ci/test.sh vltmt
|
||||||
|
- if: type = cron
|
||||||
|
stage: "Build Verilator"
|
||||||
|
name: Build xenial clang Verilator
|
||||||
|
os: linux
|
||||||
|
dist: xenial
|
||||||
|
compiler: clang
|
||||||
|
script: echo "Done building Verilator"
|
||||||
|
- if: type = cron
|
||||||
|
stage: test
|
||||||
|
name: Xenial clang dist test
|
||||||
|
os: linux
|
||||||
|
dist: xenial
|
||||||
|
compiler: clang
|
||||||
|
script: ci/test.sh dist
|
||||||
|
- if: type = cron
|
||||||
|
stage: test
|
||||||
|
name: Xenial clang vlt test
|
||||||
|
os: linux
|
||||||
|
dist: xenial
|
||||||
|
compiler: clang
|
||||||
|
script: ci/test.sh vlt
|
||||||
|
- if: type = cron
|
||||||
|
stage: test
|
||||||
|
name: Xenial clang vltmt test
|
||||||
|
os: linux
|
||||||
|
dist: xenial
|
||||||
|
compiler: clang
|
||||||
|
script: ci/test.sh vltmt
|
||||||
|
# - if: type = cron
|
||||||
|
# stage: "Build Verilator"
|
||||||
|
# name: Build OSX gcc Verilator
|
||||||
|
# os: osx
|
||||||
|
# compiler: gcc
|
||||||
|
# script: echo "Done building Verilator"
|
||||||
|
# - if: type = cron
|
||||||
|
# stage: test
|
||||||
|
# name: OSX gcc dist test
|
||||||
|
# os: osx
|
||||||
|
# compiler: gcc
|
||||||
|
# script: ci/test.sh dist
|
||||||
|
# - if: type = cron
|
||||||
|
# stage: test
|
||||||
|
# name: OSX gcc vlt test
|
||||||
|
# os: osx
|
||||||
|
# compiler: gcc
|
||||||
|
# script: ci/test.sh vlt
|
||||||
|
# - if: type = cron
|
||||||
|
# stage: test
|
||||||
|
# name: OSX gcc vltmt test
|
||||||
|
# os: osx
|
||||||
|
# compiler: gcc
|
||||||
|
# script: ci/test.sh vltmt
|
||||||
|
- if: type = cron
|
||||||
|
stage: "Build Verilator"
|
||||||
|
name: Build trusty gcc Verilator
|
||||||
|
os: linux
|
||||||
|
dist: trusty
|
||||||
|
compiler: gcc
|
||||||
|
script: echo "Done building Verilator"
|
||||||
|
- if: type = cron
|
||||||
|
stage: test
|
||||||
|
name: Trusty gcc dist test
|
||||||
|
os: linux
|
||||||
|
dist: trusty
|
||||||
|
compiler: gcc
|
||||||
|
script: ci/test.sh dist
|
||||||
|
- if: type = cron
|
||||||
|
stage: test
|
||||||
|
name: Trusty gcc vlt test
|
||||||
|
os: linux
|
||||||
|
dist: trusty
|
||||||
|
compiler: gcc
|
||||||
|
script: ci/test.sh vlt
|
||||||
|
- if: type = cron
|
||||||
|
stage: test
|
||||||
|
os: linux
|
||||||
|
dist: trusty
|
||||||
|
name: Trusty gcc vltmt test
|
||||||
|
compiler: gcc
|
||||||
|
script: ci/test.sh vltmt
|
||||||
|
|
||||||
|
notifications:
|
||||||
|
email:
|
||||||
|
if: repo = verilator/verilator
|
||||||
|
recipients:
|
||||||
|
- [email protected]
|
||||||
|
- [email protected]
|
||||||
@@ -0,0 +1,197 @@
|
|||||||
|
Artistic License 2.0
|
||||||
|
|
||||||
|
Copyright (c) 2000-2006, The Perl Foundation.
|
||||||
|
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies of this
|
||||||
|
license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
********
|
||||||
|
|
||||||
|
This license establishes the terms under which a given free software
|
||||||
|
Package may be copied, modified, distributed, and/or redistributed. The
|
||||||
|
intent is that the Copyright Holder maintains some artistic control over
|
||||||
|
the development of that Package while still keeping the Package
|
||||||
|
available as open source and free software.
|
||||||
|
|
||||||
|
You are always permitted to make arrangements wholly outside of this
|
||||||
|
license directly with the Copyright Holder of a given Package. If the
|
||||||
|
terms of this license do not permit the full use that you propose to
|
||||||
|
make of the Package, you should contact the Copyright Holder and seek a
|
||||||
|
different licensing arrangement.
|
||||||
|
|
||||||
|
Definitions
|
||||||
|
***********
|
||||||
|
|
||||||
|
"Copyright Holder" means the individual(s) or organization(s) named in
|
||||||
|
the copyright notice for the entire Package.
|
||||||
|
|
||||||
|
"Contributor" means any party that has contributed code or other
|
||||||
|
material to the Package, in accordance with the Copyright Holder's
|
||||||
|
procedures.
|
||||||
|
|
||||||
|
"You" and "your" means any person who would like to copy, distribute, or
|
||||||
|
modify the Package.
|
||||||
|
|
||||||
|
"Package" means the collection of files distributed by the Copyright
|
||||||
|
Holder, and derivatives of that collection and/or of those files. A
|
||||||
|
given Package may consist of either the Standard Version, or a Modified
|
||||||
|
Version.
|
||||||
|
|
||||||
|
"Distribute" means providing a copy of the Package or making it
|
||||||
|
accessible to anyone else, or in the case of a company or organization,
|
||||||
|
to others outside of your company or organization.
|
||||||
|
|
||||||
|
"Distributor Fee" means any fee that you charge for Distributing this
|
||||||
|
Package or providing support for this Package to another party. It does
|
||||||
|
not mean licensing fees.
|
||||||
|
|
||||||
|
"Standard Version" refers to the Package if it has not been modified, or
|
||||||
|
has been modified only in ways explicitly requested by the Copyright
|
||||||
|
Holder.
|
||||||
|
|
||||||
|
"Modified Version" means the Package, if it has been changed, and such
|
||||||
|
changes were not explicitly requested by the Copyright Holder.
|
||||||
|
|
||||||
|
"Original License" means this Artistic License as Distributed with the
|
||||||
|
Standard Version of the Package, in its current version or as it may be
|
||||||
|
modified by The Perl Foundation in the future.
|
||||||
|
|
||||||
|
"Source" form means the source code, documentation source, and
|
||||||
|
configuration files for the Package.
|
||||||
|
|
||||||
|
"Compiled" form means the compiled bytecode, object code, binary, or any
|
||||||
|
other form resulting from mechanical transformation or translation of
|
||||||
|
the Source form.
|
||||||
|
|
||||||
|
Permission for Use and Modification Without Distribution
|
||||||
|
********************************************************
|
||||||
|
|
||||||
|
(1) You are permitted to use the Standard Version and create and use
|
||||||
|
Modified Versions for any purpose without restriction, provided that you
|
||||||
|
do not Distribute the Modified Version.
|
||||||
|
|
||||||
|
Permissions for Redistribution of the Standard Version
|
||||||
|
******************************************************
|
||||||
|
|
||||||
|
(2) You may Distribute verbatim copies of the Source form of the
|
||||||
|
Standard Version of this Package in any medium without restriction,
|
||||||
|
either gratis or for a Distributor Fee, provided that you duplicate all
|
||||||
|
of the original copyright notices and associated disclaimers. At your
|
||||||
|
discretion, such verbatim copies may or may not include a Compiled form
|
||||||
|
of the Package.
|
||||||
|
|
||||||
|
(3) You may apply any bug fixes, portability changes, and other
|
||||||
|
modifications made available from the Copyright Holder. The resulting
|
||||||
|
Package will still be considered the Standard Version, and as such will
|
||||||
|
be subject to the Original License.
|
||||||
|
|
||||||
|
Distribution of Modified Versions of the Package as Source
|
||||||
|
**********************************************************
|
||||||
|
|
||||||
|
(4) You may Distribute your Modified Version as Source (either gratis or
|
||||||
|
for a Distributor Fee, and with or without a Compiled form of the
|
||||||
|
Modified Version) provided that you clearly document how it differs from
|
||||||
|
the Standard Version, including, but not limited to, documenting any
|
||||||
|
non-standard features, executables, or modules, and provided that you do
|
||||||
|
at least ONE of the following:
|
||||||
|
|
||||||
|
(a) make the Modified Version available to the Copyright Holder of the
|
||||||
|
Standard Version, under the Original License, so that the Copyright
|
||||||
|
Holder may include your modifications in the Standard Version.
|
||||||
|
|
||||||
|
(b) ensure that installation of your Modified Version does not prevent
|
||||||
|
the user installing or running the Standard Version. In addition, the
|
||||||
|
Modified Version must bear a name that is different from the name of the
|
||||||
|
Standard Version.
|
||||||
|
|
||||||
|
(c) allow anyone who receives a copy of the Modified Version to make the
|
||||||
|
Source form of the Modified Version available to others under
|
||||||
|
|
||||||
|
(i) the Original License or
|
||||||
|
|
||||||
|
(ii) a license that permits the licensee to freely copy, modify and
|
||||||
|
redistribute the Modified Version using the same licensing terms that
|
||||||
|
apply to the copy that the licensee received, and requires that the
|
||||||
|
Source form of the Modified Version, and of any works derived from it,
|
||||||
|
be made freely available in that license fees are prohibited but
|
||||||
|
Distributor Fees are allowed.
|
||||||
|
|
||||||
|
Distribution of Compiled Forms of the Standard Version or Modified
|
||||||
|
******************************************************************
|
||||||
|
Versions without the Source
|
||||||
|
***************************
|
||||||
|
|
||||||
|
(5) You may Distribute Compiled forms of the Standard Version without
|
||||||
|
the Source, provided that you include complete instructions on how to
|
||||||
|
get the Source of the Standard Version. Such instructions must be valid
|
||||||
|
at the time of your distribution. If these instructions, at any time
|
||||||
|
while you are carrying out such distribution, become invalid, you must
|
||||||
|
provide new instructions on demand or cease further distribution. If
|
||||||
|
you provide valid instructions or cease distribution within thirty days
|
||||||
|
after you become aware that the instructions are invalid, then you do
|
||||||
|
not forfeit any of your rights under this license.
|
||||||
|
|
||||||
|
(6) You may Distribute a Modified Version in Compiled form without the
|
||||||
|
Source, provided that you comply with Section 4 with respect to the
|
||||||
|
Source of the Modified Version.
|
||||||
|
|
||||||
|
Aggregating or Linking the Package
|
||||||
|
**********************************
|
||||||
|
|
||||||
|
(7) You may aggregate the Package (either the Standard Version or
|
||||||
|
Modified Version) with other packages and Distribute the resulting
|
||||||
|
aggregation provided that you do not charge a licensing fee for the
|
||||||
|
Package. Distributor Fees are permitted, and licensing fees for other
|
||||||
|
components in the aggregation are permitted. The terms of this license
|
||||||
|
apply to the use and Distribution of the Standard or Modified Versions
|
||||||
|
as included in the aggregation.
|
||||||
|
|
||||||
|
(8) You are permitted to link Modified and Standard Versions with other
|
||||||
|
works, to embed the Package in a larger work of your own, or to build
|
||||||
|
stand-alone binary or bytecode versions of applications that include the
|
||||||
|
Package, and Distribute the result without restriction, provided the
|
||||||
|
result does not expose a direct interface to the Package.
|
||||||
|
|
||||||
|
Items That are Not Considered Part of a Modified Version
|
||||||
|
********************************************************
|
||||||
|
|
||||||
|
(9) Works (including, but not limited to, modules and scripts) that
|
||||||
|
merely extend or make use of the Package, do not, by themselves, cause
|
||||||
|
the Package to be a Modified Version. In addition, such works are not
|
||||||
|
considered parts of the Package itself, and are not subject to the terms
|
||||||
|
of this license.
|
||||||
|
|
||||||
|
General Provisions
|
||||||
|
******************
|
||||||
|
|
||||||
|
(10) Any use, modification, and distribution of the Standard or Modified
|
||||||
|
Versions is governed by this Artistic License. By using, modifying or
|
||||||
|
distributing the Package, you accept this license. Do not use, modify,
|
||||||
|
or distribute the Package, if you do not accept this license.
|
||||||
|
|
||||||
|
(11) If your Modified Version has been derived from a Modified Version
|
||||||
|
made by someone other than you, you are nevertheless required to ensure
|
||||||
|
that your Modified Version complies with the requirements of this
|
||||||
|
license.
|
||||||
|
|
||||||
|
(12) This license does not grant you the right to use any trademark,
|
||||||
|
service mark, tradename, or logo of the Copyright Holder.
|
||||||
|
|
||||||
|
(13) This license includes the non-exclusive, worldwide, free-of-charge
|
||||||
|
patent license to make, have made, use, offer to sell, sell, import and
|
||||||
|
otherwise transfer the Package with respect to any patent claims
|
||||||
|
licensable by the Copyright Holder that are necessarily infringed by the
|
||||||
|
Package. If you institute patent litigation (including a cross-claim or
|
||||||
|
counterclaim) against any party alleging that the Package constitutes
|
||||||
|
direct or contributory patent infringement, then this Artistic License
|
||||||
|
to you shall terminate on the date that such litigation is filed.
|
||||||
|
|
||||||
|
(14) Disclaimer of Warranty: THE PACKAGE IS PROVIDED BY THE COPYRIGHT
|
||||||
|
HOLDER AND CONTRIBUTORS "AS IS' AND WITHOUT ANY EXPRESS OR IMPLIED
|
||||||
|
WARRANTIES. THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT
|
||||||
|
PERMITTED BY YOUR LOCAL LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT
|
||||||
|
HOLDER OR CONTRIBUTOR WILL BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THE PACKAGE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
@@ -1,339 +0,0 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 2, June 1991
|
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
|
||||||
License is intended to guarantee your freedom to share and change free
|
|
||||||
software--to make sure the software is free for all its users. This
|
|
||||||
General Public License applies to most of the Free Software
|
|
||||||
Foundation's software and to any other program whose authors commit to
|
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
|
||||||
the GNU Library General Public License instead.) You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
this service if you wish), that you receive source code or can get it
|
|
||||||
if you want it, that you can change the software or use pieces of it
|
|
||||||
in new free programs; and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
|
||||||
anyone to deny you these rights or to ask you to surrender the rights.
|
|
||||||
These restrictions translate to certain responsibilities for you if you
|
|
||||||
distribute copies of the software, or if you modify it.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must give the recipients all the rights that
|
|
||||||
you have. You must make sure that they, too, receive or can get the
|
|
||||||
source code. And you must show them these terms so they know their
|
|
||||||
rights.
|
|
||||||
|
|
||||||
We protect your rights with two steps: (1) copyright the software, and
|
|
||||||
(2) offer you this license which gives you legal permission to copy,
|
|
||||||
distribute and/or modify the software.
|
|
||||||
|
|
||||||
Also, for each author's protection and ours, we want to make certain
|
|
||||||
that everyone understands that there is no warranty for this free
|
|
||||||
software. If the software is modified by someone else and passed on, we
|
|
||||||
want its recipients to know that what they have is not the original, so
|
|
||||||
that any problems introduced by others will not reflect on the original
|
|
||||||
authors' reputations.
|
|
||||||
|
|
||||||
Finally, any free program is threatened constantly by software
|
|
||||||
patents. We wish to avoid the danger that redistributors of a free
|
|
||||||
program will individually obtain patent licenses, in effect making the
|
|
||||||
program proprietary. To prevent this, we have made it clear that any
|
|
||||||
patent must be licensed for everyone's free use or not licensed at all.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
|
||||||
a notice placed by the copyright holder saying it may be distributed
|
|
||||||
under the terms of this General Public License. The "Program", below,
|
|
||||||
refers to any such program or work, and a "work based on the Program"
|
|
||||||
means either the Program or any derivative work under copyright law:
|
|
||||||
that is to say, a work containing the Program or a portion of it,
|
|
||||||
either verbatim or with modifications and/or translated into another
|
|
||||||
language. (Hereinafter, translation is included without limitation in
|
|
||||||
the term "modification".) Each licensee is addressed as "you".
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running the Program is not restricted, and the output from the Program
|
|
||||||
is covered only if its contents constitute a work based on the
|
|
||||||
Program (independent of having been made by running the Program).
|
|
||||||
Whether that is true depends on what the Program does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Program's
|
|
||||||
source code as you receive it, in any medium, provided that you
|
|
||||||
conspicuously and appropriately publish on each copy an appropriate
|
|
||||||
copyright notice and disclaimer of warranty; keep intact all the
|
|
||||||
notices that refer to this License and to the absence of any warranty;
|
|
||||||
and give any other recipients of the Program a copy of this License
|
|
||||||
along with the Program.
|
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy, and
|
|
||||||
you may at your option offer warranty protection in exchange for a fee.
|
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Program or any portion
|
|
||||||
of it, thus forming a work based on the Program, and copy and
|
|
||||||
distribute such modifications or work under the terms of Section 1
|
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) You must cause the modified files to carry prominent notices
|
|
||||||
stating that you changed the files and the date of any change.
|
|
||||||
|
|
||||||
b) You must cause any work that you distribute or publish, that in
|
|
||||||
whole or in part contains or is derived from the Program or any
|
|
||||||
part thereof, to be licensed as a whole at no charge to all third
|
|
||||||
parties under the terms of this License.
|
|
||||||
|
|
||||||
c) If the modified program normally reads commands interactively
|
|
||||||
when run, you must cause it, when started running for such
|
|
||||||
interactive use in the most ordinary way, to print or display an
|
|
||||||
announcement including an appropriate copyright notice and a
|
|
||||||
notice that there is no warranty (or else, saying that you provide
|
|
||||||
a warranty) and that users may redistribute the program under
|
|
||||||
these conditions, and telling the user how to view a copy of this
|
|
||||||
License. (Exception: if the Program itself is interactive but
|
|
||||||
does not normally print such an announcement, your work based on
|
|
||||||
the Program is not required to print an announcement.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Program,
|
|
||||||
and can be reasonably considered independent and separate works in
|
|
||||||
themselves, then this License, and its terms, do not apply to those
|
|
||||||
sections when you distribute them as separate works. But when you
|
|
||||||
distribute the same sections as part of a whole which is a work based
|
|
||||||
on the Program, the distribution of the whole must be on the terms of
|
|
||||||
this License, whose permissions for other licensees extend to the
|
|
||||||
entire whole, and thus to each and every part regardless of who wrote it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
|
||||||
exercise the right to control the distribution of derivative or
|
|
||||||
collective works based on the Program.
|
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Program
|
|
||||||
with the Program (or with a work based on the Program) on a volume of
|
|
||||||
a storage or distribution medium does not bring the other work under
|
|
||||||
the scope of this License.
|
|
||||||
|
|
||||||
3. You may copy and distribute the Program (or a work based on it,
|
|
||||||
under Section 2) in object code or executable form under the terms of
|
|
||||||
Sections 1 and 2 above provided that you also do one of the following:
|
|
||||||
|
|
||||||
a) Accompany it with the complete corresponding machine-readable
|
|
||||||
source code, which must be distributed under the terms of Sections
|
|
||||||
1 and 2 above on a medium customarily used for software interchange; or,
|
|
||||||
|
|
||||||
b) Accompany it with a written offer, valid for at least three
|
|
||||||
years, to give any third party, for a charge no more than your
|
|
||||||
cost of physically performing source distribution, a complete
|
|
||||||
machine-readable copy of the corresponding source code, to be
|
|
||||||
distributed under the terms of Sections 1 and 2 above on a medium
|
|
||||||
customarily used for software interchange; or,
|
|
||||||
|
|
||||||
c) Accompany it with the information you received as to the offer
|
|
||||||
to distribute corresponding source code. (This alternative is
|
|
||||||
allowed only for noncommercial distribution and only if you
|
|
||||||
received the program in object code or executable form with such
|
|
||||||
an offer, in accord with Subsection b above.)
|
|
||||||
|
|
||||||
The source code for a work means the preferred form of the work for
|
|
||||||
making modifications to it. For an executable work, complete source
|
|
||||||
code means all the source code for all modules it contains, plus any
|
|
||||||
associated interface definition files, plus the scripts used to
|
|
||||||
control compilation and installation of the executable. However, as a
|
|
||||||
special exception, the source code distributed need not include
|
|
||||||
anything that is normally distributed (in either source or binary
|
|
||||||
form) with the major components (compiler, kernel, and so on) of the
|
|
||||||
operating system on which the executable runs, unless that component
|
|
||||||
itself accompanies the executable.
|
|
||||||
|
|
||||||
If distribution of executable or object code is made by offering
|
|
||||||
access to copy from a designated place, then offering equivalent
|
|
||||||
access to copy the source code from the same place counts as
|
|
||||||
distribution of the source code, even though third parties are not
|
|
||||||
compelled to copy the source along with the object code.
|
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
|
||||||
except as expressly provided under this License. Any attempt
|
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
|
||||||
void, and will automatically terminate your rights under this License.
|
|
||||||
However, parties who have received copies, or rights, from you under
|
|
||||||
this License will not have their licenses terminated so long as such
|
|
||||||
parties remain in full compliance.
|
|
||||||
|
|
||||||
5. You are not required to accept this License, since you have not
|
|
||||||
signed it. However, nothing else grants you permission to modify or
|
|
||||||
distribute the Program or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Program (or any work based on the
|
|
||||||
Program), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Program or works based on it.
|
|
||||||
|
|
||||||
6. Each time you redistribute the Program (or any work based on the
|
|
||||||
Program), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute or modify the Program subject to
|
|
||||||
these terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
You are not responsible for enforcing compliance by third parties to
|
|
||||||
this License.
|
|
||||||
|
|
||||||
7. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
infringement or for any other reason (not limited to patent issues),
|
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot
|
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you
|
|
||||||
may not distribute the Program at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the Program by
|
|
||||||
all those who receive copies directly or indirectly through you, then
|
|
||||||
the only way you could satisfy both it and this License would be to
|
|
||||||
refrain entirely from distribution of the Program.
|
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under
|
|
||||||
any particular circumstance, the balance of the section is intended to
|
|
||||||
apply and the section as a whole is intended to apply in other
|
|
||||||
circumstances.
|
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
|
||||||
patents or other property right claims or to contest validity of any
|
|
||||||
such claims; this section has the sole purpose of protecting the
|
|
||||||
integrity of the free software distribution system, which is
|
|
||||||
implemented by public license practices. Many people have made
|
|
||||||
generous contributions to the wide range of software distributed
|
|
||||||
through that system in reliance on consistent application of that
|
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
|
||||||
to distribute software through any other system and a licensee cannot
|
|
||||||
impose that choice.
|
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
|
||||||
be a consequence of the rest of this License.
|
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
original copyright holder who places the Program under this License
|
|
||||||
may add an explicit geographical distribution limitation excluding
|
|
||||||
those countries, so that distribution is permitted only in or among
|
|
||||||
countries not thus excluded. In such case, this License incorporates
|
|
||||||
the limitation as if written in the body of this License.
|
|
||||||
|
|
||||||
9. The Free Software Foundation may publish revised and/or new versions
|
|
||||||
of the General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Program
|
|
||||||
specifies a version number of this License which applies to it and "any
|
|
||||||
later version", you have the option of following the terms and conditions
|
|
||||||
either of that version or of any later version published by the Free
|
|
||||||
Software Foundation. If the Program does not specify a version number of
|
|
||||||
this License, you may choose any version ever published by the Free Software
|
|
||||||
Foundation.
|
|
||||||
|
|
||||||
10. If you wish to incorporate parts of the Program into other free
|
|
||||||
programs whose distribution conditions are different, write to the author
|
|
||||||
to ask for permission. For software which is copyrighted by the Free
|
|
||||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
|
||||||
make exceptions for this. Our decision will be guided by the two goals
|
|
||||||
of preserving the free status of all derivatives of our free software and
|
|
||||||
of promoting the sharing and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
|
||||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
|
||||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
|
||||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
|
||||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
|
||||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
|
||||||
REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
|
||||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
|
||||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
|
||||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
|
||||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|
||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
Appendix: How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
convey the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) 19yy <name of author>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
|
||||||
when it starts in an interactive mode:
|
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) 19yy name of author
|
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, the commands you use may
|
|
||||||
be called something other than `show w' and `show c'; they could even be
|
|
||||||
mouse-clicks or menu items--whatever suits your program.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
|
||||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
|
||||||
necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1989
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
|
||||||
consider it more useful to permit linking proprietary applications with the
|
|
||||||
library. If this is what you want to do, use the GNU Library General
|
|
||||||
Public License instead of this License.
|
|
||||||
@@ -0,0 +1,165 @@
|
|||||||
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
|
||||||
|
This version of the GNU Lesser General Public License incorporates
|
||||||
|
the terms and conditions of version 3 of the GNU General Public
|
||||||
|
License, supplemented by the additional permissions listed below.
|
||||||
|
|
||||||
|
0. Additional Definitions.
|
||||||
|
|
||||||
|
As used herein, "this License" refers to version 3 of the GNU Lesser
|
||||||
|
General Public License, and the "GNU GPL" refers to version 3 of the GNU
|
||||||
|
General Public License.
|
||||||
|
|
||||||
|
"The Library" refers to a covered work governed by this License,
|
||||||
|
other than an Application or a Combined Work as defined below.
|
||||||
|
|
||||||
|
An "Application" is any work that makes use of an interface provided
|
||||||
|
by the Library, but which is not otherwise based on the Library.
|
||||||
|
Defining a subclass of a class defined by the Library is deemed a mode
|
||||||
|
of using an interface provided by the Library.
|
||||||
|
|
||||||
|
A "Combined Work" is a work produced by combining or linking an
|
||||||
|
Application with the Library. The particular version of the Library
|
||||||
|
with which the Combined Work was made is also called the "Linked
|
||||||
|
Version".
|
||||||
|
|
||||||
|
The "Minimal Corresponding Source" for a Combined Work means the
|
||||||
|
Corresponding Source for the Combined Work, excluding any source code
|
||||||
|
for portions of the Combined Work that, considered in isolation, are
|
||||||
|
based on the Application, and not on the Linked Version.
|
||||||
|
|
||||||
|
The "Corresponding Application Code" for a Combined Work means the
|
||||||
|
object code and/or source code for the Application, including any data
|
||||||
|
and utility programs needed for reproducing the Combined Work from the
|
||||||
|
Application, but excluding the System Libraries of the Combined Work.
|
||||||
|
|
||||||
|
1. Exception to Section 3 of the GNU GPL.
|
||||||
|
|
||||||
|
You may convey a covered work under sections 3 and 4 of this License
|
||||||
|
without being bound by section 3 of the GNU GPL.
|
||||||
|
|
||||||
|
2. Conveying Modified Versions.
|
||||||
|
|
||||||
|
If you modify a copy of the Library, and, in your modifications, a
|
||||||
|
facility refers to a function or data to be supplied by an Application
|
||||||
|
that uses the facility (other than as an argument passed when the
|
||||||
|
facility is invoked), then you may convey a copy of the modified
|
||||||
|
version:
|
||||||
|
|
||||||
|
a) under this License, provided that you make a good faith effort to
|
||||||
|
ensure that, in the event an Application does not supply the
|
||||||
|
function or data, the facility still operates, and performs
|
||||||
|
whatever part of its purpose remains meaningful, or
|
||||||
|
|
||||||
|
b) under the GNU GPL, with none of the additional permissions of
|
||||||
|
this License applicable to that copy.
|
||||||
|
|
||||||
|
3. Object Code Incorporating Material from Library Header Files.
|
||||||
|
|
||||||
|
The object code form of an Application may incorporate material from
|
||||||
|
a header file that is part of the Library. You may convey such object
|
||||||
|
code under terms of your choice, provided that, if the incorporated
|
||||||
|
material is not limited to numerical parameters, data structure
|
||||||
|
layouts and accessors, or small macros, inline functions and templates
|
||||||
|
(ten or fewer lines in length), you do both of the following:
|
||||||
|
|
||||||
|
a) Give prominent notice with each copy of the object code that the
|
||||||
|
Library is used in it and that the Library and its use are
|
||||||
|
covered by this License.
|
||||||
|
|
||||||
|
b) Accompany the object code with a copy of the GNU GPL and this license
|
||||||
|
document.
|
||||||
|
|
||||||
|
4. Combined Works.
|
||||||
|
|
||||||
|
You may convey a Combined Work under terms of your choice that,
|
||||||
|
taken together, effectively do not restrict modification of the
|
||||||
|
portions of the Library contained in the Combined Work and reverse
|
||||||
|
engineering for debugging such modifications, if you also do each of
|
||||||
|
the following:
|
||||||
|
|
||||||
|
a) Give prominent notice with each copy of the Combined Work that
|
||||||
|
the Library is used in it and that the Library and its use are
|
||||||
|
covered by this License.
|
||||||
|
|
||||||
|
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
||||||
|
document.
|
||||||
|
|
||||||
|
c) For a Combined Work that displays copyright notices during
|
||||||
|
execution, include the copyright notice for the Library among
|
||||||
|
these notices, as well as a reference directing the user to the
|
||||||
|
copies of the GNU GPL and this license document.
|
||||||
|
|
||||||
|
d) Do one of the following:
|
||||||
|
|
||||||
|
0) Convey the Minimal Corresponding Source under the terms of this
|
||||||
|
License, and the Corresponding Application Code in a form
|
||||||
|
suitable for, and under terms that permit, the user to
|
||||||
|
recombine or relink the Application with a modified version of
|
||||||
|
the Linked Version to produce a modified Combined Work, in the
|
||||||
|
manner specified by section 6 of the GNU GPL for conveying
|
||||||
|
Corresponding Source.
|
||||||
|
|
||||||
|
1) Use a suitable shared library mechanism for linking with the
|
||||||
|
Library. A suitable mechanism is one that (a) uses at run time
|
||||||
|
a copy of the Library already present on the user's computer
|
||||||
|
system, and (b) will operate properly with a modified version
|
||||||
|
of the Library that is interface-compatible with the Linked
|
||||||
|
Version.
|
||||||
|
|
||||||
|
e) Provide Installation Information, but only if you would otherwise
|
||||||
|
be required to provide such information under section 6 of the
|
||||||
|
GNU GPL, and only to the extent that such information is
|
||||||
|
necessary to install and execute a modified version of the
|
||||||
|
Combined Work produced by recombining or relinking the
|
||||||
|
Application with a modified version of the Linked Version. (If
|
||||||
|
you use option 4d0, the Installation Information must accompany
|
||||||
|
the Minimal Corresponding Source and Corresponding Application
|
||||||
|
Code. If you use option 4d1, you must provide the Installation
|
||||||
|
Information in the manner specified by section 6 of the GNU GPL
|
||||||
|
for conveying Corresponding Source.)
|
||||||
|
|
||||||
|
5. Combined Libraries.
|
||||||
|
|
||||||
|
You may place library facilities that are a work based on the
|
||||||
|
Library side by side in a single library together with other library
|
||||||
|
facilities that are not Applications and are not covered by this
|
||||||
|
License, and convey such a combined library under terms of your
|
||||||
|
choice, if you do both of the following:
|
||||||
|
|
||||||
|
a) Accompany the combined library with a copy of the same work based
|
||||||
|
on the Library, uncombined with any other library facilities,
|
||||||
|
conveyed under the terms of this License.
|
||||||
|
|
||||||
|
b) Give prominent notice with the combined library that part of it
|
||||||
|
is a work based on the Library, and explaining where to find the
|
||||||
|
accompanying uncombined form of the same work.
|
||||||
|
|
||||||
|
6. Revised Versions of the GNU Lesser General Public License.
|
||||||
|
|
||||||
|
The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the GNU Lesser General Public License from time to time. Such new
|
||||||
|
versions will be similar in spirit to the present version, but may
|
||||||
|
differ in detail to address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the
|
||||||
|
Library as you received it specifies that a certain numbered version
|
||||||
|
of the GNU Lesser General Public License "or any later version"
|
||||||
|
applies to it, you have the option of following the terms and
|
||||||
|
conditions either of that published version or of any later version
|
||||||
|
published by the Free Software Foundation. If the Library as you
|
||||||
|
received it does not specify a version number of the GNU Lesser
|
||||||
|
General Public License, you may choose any version of the GNU Lesser
|
||||||
|
General Public License ever published by the Free Software Foundation.
|
||||||
|
|
||||||
|
If the Library as you received it specifies that a proxy can decide
|
||||||
|
whether future versions of the GNU Lesser General Public License shall
|
||||||
|
apply, that proxy's public statement of acceptance of any version is
|
||||||
|
permanent authorization for you to choose that version for the
|
||||||
|
Library.
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
\.clang-format
|
||||||
|
\.clang-tidy
|
||||||
|
\.git/
|
||||||
|
\.git$
|
||||||
|
\.svn/
|
||||||
|
\.(bak|old)/
|
||||||
|
\.(bak|old)$
|
||||||
|
\.tar\.
|
||||||
|
.*\.tgz
|
||||||
|
.*\.log
|
||||||
|
\..*\.swp
|
||||||
|
.*\.tmp
|
||||||
|
.*\.tidy
|
||||||
|
.*\.tex
|
||||||
|
.*\.key
|
||||||
|
.*\.vcd
|
||||||
|
.*\.1
|
||||||
|
\.codacy\.yml
|
||||||
|
\.travis\.yml
|
||||||
|
/build/
|
||||||
|
/obj_dir/
|
||||||
|
/obj_dbg/
|
||||||
|
/obj_nc/
|
||||||
|
/obj_opt/
|
||||||
|
/obj_vcs/
|
||||||
|
/obj_vlt/
|
||||||
|
/obj_vltmt/
|
||||||
|
/obj_dist/
|
||||||
|
/INCA_libs/
|
||||||
|
/cov_work/
|
||||||
|
/logs/
|
||||||
|
^Makefile$
|
||||||
|
README.html
|
||||||
|
bin/verilator_bin.*
|
||||||
|
bin/verilator_coverage_bin.*
|
||||||
|
docs/.*\.html$
|
||||||
|
docs/Makefile$
|
||||||
|
docs/doxygen-doc/.*
|
||||||
|
examples/xml_py/copied/
|
||||||
|
examples/xml_py/graph.*
|
||||||
|
src/Makefile$
|
||||||
|
src/Makefile_obj$
|
||||||
|
include/verilated.mk$
|
||||||
|
test_regress/.gdbinit$
|
||||||
|
config.cache$
|
||||||
|
config.status$
|
||||||
|
verilator\.log
|
||||||
|
verilator\.tex
|
||||||
|
verilator-config.cmake$
|
||||||
|
verilator-config-version.cmake$
|
||||||
|
verilator.pc$
|
||||||
|
verilator_bin.*
|
||||||
|
verilator_coverage_bin.*
|
||||||
|
.vcsmx_rebuild$
|
||||||
|
ncverilog.history
|
||||||
|
autom4te\.cache/
|
||||||
|
nodist/
|
||||||
|
ci/
|
||||||
|
/simv$
|
||||||
|
/simv.daidir/
|
||||||
|
/vc_hdrs.h$
|
||||||
|
/csrc/
|
||||||
|
obj_dir.*
|
||||||
|
TAGS
|
||||||
|
.*~
|
||||||
+382
-153
@@ -1,24 +1,22 @@
|
|||||||
# $Id$
|
|
||||||
#*****************************************************************************
|
#*****************************************************************************
|
||||||
# DESCRIPTION: Verilator top level: Makefile pre-configure version
|
# DESCRIPTION: Verilator top level: Makefile pre-configure version
|
||||||
#
|
#
|
||||||
# This file is part of Verilator.
|
# This file is part of Verilator.
|
||||||
#
|
#
|
||||||
# Author: Wilson Snyder <wsnyder@wsnyder.org>
|
# Code available from: https://verilator.org
|
||||||
#
|
#
|
||||||
# Code available from: http://www.veripool.com/verilator
|
|
||||||
#
|
|
||||||
#*****************************************************************************
|
#*****************************************************************************
|
||||||
#
|
#
|
||||||
# Copyright 2003-2007 by Wilson Snyder. This program is free software; you can
|
# Copyright 2003-2019 by Wilson Snyder. This program is free software; you can
|
||||||
# redistribute it and/or modify it under the terms of either the GNU
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
# General Public License or the Perl Artistic License.
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
#
|
# Version 2.0.
|
||||||
|
#
|
||||||
# Verilator is distributed in the hope that it will be useful,
|
# Verilator is distributed in the hope that it will be useful,
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
#****************************************************************************/
|
#****************************************************************************/
|
||||||
#
|
#
|
||||||
# make all to compile and build Verilator.
|
# make all to compile and build Verilator.
|
||||||
@@ -38,15 +36,12 @@
|
|||||||
# source and built the program without creating any other files,
|
# source and built the program without creating any other files,
|
||||||
# `make distclean' should leave only the files that were in the
|
# `make distclean' should leave only the files that were in the
|
||||||
# distribution.
|
# distribution.
|
||||||
#
|
#
|
||||||
# make maintainer-clean
|
# make maintainer-clean
|
||||||
# Delete everything from the current directory that can be
|
# Delete everything from the current directory that can be
|
||||||
# reconstructed with this Makefile. This typically includes
|
# reconstructed with this Makefile. This typically includes
|
||||||
# everything deleted by distclean, plus more: C source files
|
# everything deleted by distclean, plus more: C source files
|
||||||
# produced by Bison, tags tables, info files, and so on.
|
# produced by Bison, tags tables, info files, and so on.
|
||||||
#
|
|
||||||
# make extraclean
|
|
||||||
# Still more severe - delete backup and autosave files, too.
|
|
||||||
|
|
||||||
#### Start of system configuration section. ####
|
#### Start of system configuration section. ####
|
||||||
|
|
||||||
@@ -54,13 +49,19 @@ srcdir = @srcdir@
|
|||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
HOST = @HOST@
|
HOST = @HOST@
|
||||||
|
|
||||||
|
DOXYGEN = doxygen
|
||||||
INSTALL = @INSTALL@
|
INSTALL = @INSTALL@
|
||||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
MAKEINFO = makeinfo
|
MAKEINFO = makeinfo
|
||||||
TEXI2DVI = texi2dvi
|
POD2TEXT = pod2text
|
||||||
|
POD2LATEXFIX = $(srcdir)/src/pod2latexfix
|
||||||
|
MKINSTALLDIRS = $(SHELL) $(srcdir)/src/mkinstalldirs
|
||||||
PERL = @PERL@
|
PERL = @PERL@
|
||||||
|
|
||||||
|
# Destination prefix for RPMs
|
||||||
|
DESTDIR =
|
||||||
|
|
||||||
#### Don't edit: You're much better using configure switches to set these
|
#### Don't edit: You're much better using configure switches to set these
|
||||||
prefix = @prefix@
|
prefix = @prefix@
|
||||||
exec_prefix = @exec_prefix@
|
exec_prefix = @exec_prefix@
|
||||||
@@ -68,7 +69,7 @@ exec_prefix = @exec_prefix@
|
|||||||
# Directory in which to install scripts.
|
# Directory in which to install scripts.
|
||||||
bindir = @bindir@
|
bindir = @bindir@
|
||||||
|
|
||||||
# Directory in which to install scripts.
|
# Directory in which to install manpages.
|
||||||
mandir = @mandir@
|
mandir = @mandir@
|
||||||
|
|
||||||
# Directory in which to install library files.
|
# Directory in which to install library files.
|
||||||
@@ -78,252 +79,480 @@ datadir = @datadir@
|
|||||||
infodir = @infodir@
|
infodir = @infodir@
|
||||||
|
|
||||||
# Directory in which to install package specific files
|
# Directory in which to install package specific files
|
||||||
|
# Generally ${prefix}/share/verilator
|
||||||
pkgdatadir = @pkgdatadir@
|
pkgdatadir = @pkgdatadir@
|
||||||
|
|
||||||
|
# Directory in which to install pkgconfig file
|
||||||
|
# Generally ${prefix}/share/pkgconfig
|
||||||
|
pkgconfigdir = @pkgconfigdir@
|
||||||
|
|
||||||
|
# Directory in which to install data across multiple architectures
|
||||||
|
datarootdir = @datarootdir@
|
||||||
|
|
||||||
|
# Compile options
|
||||||
|
CFG_WITH_CCWARN = @CFG_WITH_CCWARN@
|
||||||
|
CFG_WITH_DEFENV = @CFG_WITH_DEFENV@
|
||||||
|
CFG_WITH_LONGTESTS = @CFG_WITH_LONGTESTS@
|
||||||
|
CFG_WITH_THREADED = @CFG_WITH_THREADED@
|
||||||
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
|
|
||||||
#### End of system configuration section. ####
|
#### End of system configuration section. ####
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
|
||||||
SHELL = /bin/sh
|
SHELL = /bin/sh
|
||||||
|
|
||||||
SUBDIRS = src test_verilated test_c test_sc test_sp test_regress test_vcs
|
SUBDIRS = src test_regress \
|
||||||
|
examples/cmake_hello_c \
|
||||||
|
examples/cmake_hello_sc \
|
||||||
|
examples/cmake_tracing_c \
|
||||||
|
examples/cmake_tracing_sc \
|
||||||
|
examples/cmake_protect_lib \
|
||||||
|
examples/make_hello_c \
|
||||||
|
examples/make_hello_sc \
|
||||||
|
examples/make_tracing_c \
|
||||||
|
examples/make_tracing_sc \
|
||||||
|
examples/make_protect_lib \
|
||||||
|
|
||||||
INFOS = README verilator.txt verilator.html verilator.1 verilator.pdf
|
INFOS = verilator.txt verilator.html verilator.pdf
|
||||||
|
|
||||||
|
INFOS_OLD = README README.html README.pdf
|
||||||
|
|
||||||
# Files that can be generated, but should be up to date for a distribution.
|
# Files that can be generated, but should be up to date for a distribution.
|
||||||
DISTDEP = info Makefile
|
DISTDEP = info Makefile
|
||||||
# Files to distribute.
|
|
||||||
DISTBIN = $(wildcard bin/verilator-*)
|
|
||||||
|
|
||||||
DISTFILES_INC = $(INFOS) .cvsignore COPYING *.in *.ac \
|
DISTFILES_INC = $(INFOS) .gitignore \
|
||||||
Changes README TODO \
|
*.in *.ac \
|
||||||
bin/* \
|
Artistic \
|
||||||
install-sh configure mkinstalldirs *.texi \
|
Changes \
|
||||||
include/verilated.[chv]* \
|
LICENSE \
|
||||||
include/verilatedos.[chv]* \
|
MANIFEST.SKIP \
|
||||||
|
README.adoc \
|
||||||
|
verilator-config.cmake.in \
|
||||||
|
verilator-config-version.cmake.in \
|
||||||
|
bin/verilator \
|
||||||
|
bin/verilator_coverage \
|
||||||
|
bin/verilator_difftree \
|
||||||
|
bin/verilator_gantt \
|
||||||
|
bin/verilator_includer \
|
||||||
|
bin/verilator_profcfunc \
|
||||||
|
docs/.gitignore \
|
||||||
|
docs/CONTRIBUTING.adoc \
|
||||||
|
docs/CONTRIBUTORS \
|
||||||
|
docs/Makefile.in \
|
||||||
|
docs/TODO \
|
||||||
|
docs/doxygen-mainpage \
|
||||||
|
docs/doxygen.config \
|
||||||
|
docs/install.adoc \
|
||||||
|
docs/internals.adoc \
|
||||||
|
docs/verilator_logo.png \
|
||||||
|
install-sh configure *.pod \
|
||||||
|
include/*.[chv]* \
|
||||||
include/*.in \
|
include/*.in \
|
||||||
src/.cvsignore src/*.in src/*.cpp src/*.[chly] src/astgen src/flexfix \
|
include/.*ignore \
|
||||||
src/*.pl \
|
include/gtkwave/*.[chv]* \
|
||||||
test_*/.cvsignore test_*/Makefile* test_*/*.cpp \
|
include/vltstd/*.[chv]* \
|
||||||
test_*/*.pl test_*/*.v test_*/*.vc test_*/vlint \
|
.*attributes */.*attributes */*/.*attributes \
|
||||||
test_verilated/vgen*.pl \
|
src/.*ignore src/*.in src/*.cpp src/*.[chly] \
|
||||||
test_regress/t/*.v* \
|
src/astgen src/bisonpre src/*fix src/cppcheck_filtered \
|
||||||
test_regress/t/*.pl \
|
src/vlcovgen src/mkinstalldirs \
|
||||||
|
src/.gdbinit \
|
||||||
|
src/*.pl src/*.pod \
|
||||||
|
examples/*/.*ignore examples/*/Makefile* \
|
||||||
|
examples/*/*.[chv]* examples/*/vl_* \
|
||||||
|
examples/*/CMakeLists.txt \
|
||||||
|
test_*/.*ignore test_*/Makefile* test_*/*.cpp \
|
||||||
|
test_*/*.pl test_*/*.v test_*/*.vc test_*/*.vh \
|
||||||
|
test_regress/*.pl \
|
||||||
|
test_regress/Makefile \
|
||||||
|
test_regress/Makefile_obj \
|
||||||
|
test_regress/input.vc \
|
||||||
|
test_regress/CMakeLists.txt \
|
||||||
|
test_regress/t/t*/*.sv* \
|
||||||
|
test_regress/t/t*/*.v* \
|
||||||
|
test_regress/t/t*/*/*.sv* \
|
||||||
|
test_regress/t/t*/*/*.v* \
|
||||||
|
test_regress/t/*.cpp \
|
||||||
|
test_regress/t/*.h \
|
||||||
|
test_regress/t/*.dat \
|
||||||
|
test_regress/t/*.mem \
|
||||||
test_regress/t/*.out \
|
test_regress/t/*.out \
|
||||||
verilator.* \
|
test_regress/t/*.pl \
|
||||||
|
test_regress/t/*.pf \
|
||||||
|
test_regress/t/*.v* \
|
||||||
|
|
||||||
INST_PROJ_FILES = \
|
INST_PROJ_FILES = \
|
||||||
bin/verilator \
|
bin/verilator \
|
||||||
|
bin/verilator_coverage \
|
||||||
|
bin/verilator_gantt \
|
||||||
bin/verilator_includer \
|
bin/verilator_includer \
|
||||||
include/verilated.[chv]* \
|
bin/verilator_profcfunc \
|
||||||
include/verilated.mk \
|
include/verilated.mk \
|
||||||
include/verilatedos.[chv]* \
|
include/*.[chv]* \
|
||||||
|
include/gtkwave/*.[chv]* \
|
||||||
|
include/vltstd/*.[chv]* \
|
||||||
|
|
||||||
INST_PROJ_BIN_FILES = \
|
INST_PROJ_BIN_FILES = \
|
||||||
verilator_bin \
|
bin/verilator_bin \
|
||||||
verilator_bin_dbg \
|
bin/verilator_bin_dbg \
|
||||||
|
bin/verilator_coverage_bin_dbg \
|
||||||
|
|
||||||
DISTFILES := $(DISTFILES_INC)
|
DISTFILES := $(DISTFILES_INC)
|
||||||
|
|
||||||
|
EXAMPLES_FIRST = \
|
||||||
|
examples/make_hello_c \
|
||||||
|
examples/make_hello_sc \
|
||||||
|
|
||||||
|
EXAMPLES = $(EXAMPLES_FIRST) $(filter-out $(EXAMPLES_FIRST), $(sort $(wildcard examples/*)))
|
||||||
|
|
||||||
|
ifeq ($(OBJCACHE_JOBS),)
|
||||||
|
ifneq ($(OBJCACHE_HOSTS),)
|
||||||
|
export OBJCACHE_JOBS := -j $(shell objcache --jobs "$(OBJCACHE_HOSTS)")
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
# See uninstall also - don't put wildcards in this variable, it might uninstall other stuff
|
||||||
|
VL_INST_MAN_FILES = verilator.1 verilator_coverage.1 verilator_gantt.1 verilator_profcfunc.1
|
||||||
|
|
||||||
|
default: all
|
||||||
all: all_nomsg msg_test
|
all: all_nomsg msg_test
|
||||||
all_nomsg: verilator_exe
|
all_nomsg: verilator_exe $(VL_INST_MAN_FILES)
|
||||||
|
|
||||||
.PHONY:verilator_exe
|
.PHONY:verilator_exe
|
||||||
verilator_exe verilator_bin verilator_bin_dbg:
|
.PHONY:verilator_bin
|
||||||
|
.PHONY:verilator_bin_dbg
|
||||||
|
.PHONY:verilator_coverage_bin_dbg
|
||||||
|
verilator_exe verilator_bin verilator_bin_dbg verilator_coverage_bin_dbg:
|
||||||
@echo ------------------------------------------------------------
|
@echo ------------------------------------------------------------
|
||||||
@echo "making verilator in src" ; \
|
@echo "making verilator in src"
|
||||||
(cd src && $(MAKE) )
|
$(MAKE) -C src $(OBJCACHE_JOBS)
|
||||||
|
|
||||||
.PHONY:msg_test
|
.PHONY:msg_test
|
||||||
msg_test:
|
msg_test: all_nomsg
|
||||||
@echo "Build complete!"
|
@echo "Build complete!"
|
||||||
@echo
|
@echo
|
||||||
@echo "Type 'make test' to test."
|
@echo "Now type 'make test' to test."
|
||||||
@echo
|
@echo
|
||||||
|
|
||||||
ifeq ($(VERILATOR_AUTHOR_SITE),1) # Local... Else don't burden users
|
.PHONY: test
|
||||||
test: test_vcs test_c test_sc test_sp test_verilated test_regress
|
ifeq ($(CFG_WITH_LONGTESTS),yes) # Local... Else don't burden users
|
||||||
|
test: smoke-test test_regress
|
||||||
|
# examples is part of test_regress's test_regress/t/t_a2_examples.pl
|
||||||
|
# (because that allows it to run in parallel with other test_regress's)
|
||||||
else
|
else
|
||||||
test: test_c test_sc test_sp
|
test: smoke-test examples
|
||||||
endif
|
endif
|
||||||
@echo "Tests passed!"
|
@echo "Tests passed!"
|
||||||
@echo
|
@echo
|
||||||
@echo "Type 'make install' to install documentation."
|
@echo "Now type 'make install' to install."
|
||||||
|
@echo "Or type 'make' inside an examples subdirectory."
|
||||||
@echo
|
@echo
|
||||||
|
|
||||||
test_vcs: all_nomsg
|
smoke-test: all_nomsg
|
||||||
@(cd test_vcs && $(MAKE))
|
test_regress/t/t_a1_first_cc.pl
|
||||||
test_c: all_nomsg
|
test_regress/t/t_a2_first_sc.pl
|
||||||
@(cd test_c && $(MAKE))
|
|
||||||
test_c_debug: all_nomsg
|
|
||||||
@(cd test_c && $(MAKE) test_debug)
|
|
||||||
test_sc: all_nomsg
|
|
||||||
@(cd test_sc && $(MAKE))
|
|
||||||
test_sc_debug: all_nomsg
|
|
||||||
@(cd test_sc && $(MAKE) test_debug)
|
|
||||||
test_sp: all_nomsg
|
|
||||||
@(cd test_sp && $(MAKE))
|
|
||||||
test_sp_debug: all_nomsg
|
|
||||||
@(cd test_sp && $(MAKE) test_debug)
|
|
||||||
test_verilated: all_nomsg
|
|
||||||
@(cd test_verilated && $(MAKE))
|
|
||||||
test_regress: all_nomsg
|
test_regress: all_nomsg
|
||||||
@(cd test_regress && $(MAKE))
|
$(MAKE) -C test_regress
|
||||||
|
|
||||||
|
examples: all_nomsg
|
||||||
|
for p in $(EXAMPLES) ; do \
|
||||||
|
$(MAKE) -C $$p VERILATOR_ROOT=`pwd` || exit 10; \
|
||||||
|
done
|
||||||
|
|
||||||
|
.PHONY: docs
|
||||||
|
docs: info
|
||||||
|
|
||||||
info: $(INFOS)
|
info: $(INFOS)
|
||||||
|
|
||||||
# Use --no-split to avoid creating filenames > 14 chars.
|
%.1: ${srcdir}/bin/%
|
||||||
verilator.1: bin/verilator
|
|
||||||
pod2man $< $@
|
pod2man $< $@
|
||||||
|
|
||||||
verilator.txt: bin/verilator
|
verilator.txt: ${srcdir}/bin/verilator
|
||||||
pod2text $< $@
|
$(POD2TEXT) $< $@
|
||||||
|
|
||||||
verilator.html: bin/verilator
|
verilator.html: ${srcdir}/bin/verilator
|
||||||
pod2html $< >$@
|
pod2html $< >$@
|
||||||
|
|
||||||
verilator.pdf: bin/verilator $(DISTCONFIG)
|
# PDF needs DIST variables; but having configure.ac as dependency isn't detected
|
||||||
pod2latex --full --out verilator.tex bin/verilator
|
verilator.pdf: ${srcdir}/bin/verilator Makefile $(POD2LATEXFIX)
|
||||||
cat < verilator.tex \
|
pod2latex --full --out verilator.tex $<
|
||||||
| sed 's/\\begin{document}/\\usepackage{fancyhdr} \\pagestyle{fancy}\n\\begin{document}/' \
|
$(PERL) $(POD2LATEXFIX) "$(DISTTITLE)" "${DISTDATE}" < verilator.tex > verilator2.tex
|
||||||
| sed 's/\\begin{document}/\\setlength{\\parindent}{0pt} \\setlength{\\parskip}{\\baselineskip}\n\\begin{document}/' \
|
|
||||||
| sed 's/\\begin{document}/\\title{$(DISTTITLE)} \\date{${DISTDATE}} \\author{Wilson Snyder\\\\ http:\/\/www.veripool.com}\n\\begin{document}/' \
|
|
||||||
| sed 's/\\begin{document}/\\lhead[$(DISTTITLE)]{$(DISTTITLE)}\n\\begin{document}/' \
|
|
||||||
| sed 's/\\tableofcontents/\\begin{titlepage} \\maketitle \\end{titlepage}\n\\tableofcontents/' \
|
|
||||||
> verilator2.tex
|
|
||||||
mv verilator2.tex verilator.tex
|
mv verilator2.tex verilator.tex
|
||||||
pdflatex verilator.tex
|
pdflatex verilator.tex
|
||||||
pdflatex verilator.tex
|
pdflatex verilator.tex
|
||||||
-rm -f verilator.toc verilator.aux verilator.idx
|
-rm -f verilator.toc verilator.aux verilator.idx verilator.out
|
||||||
|
|
||||||
INSTALL: install.texi
|
# See uninstall also - don't put wildcards in this variable, it might uninstall other stuff
|
||||||
$(MAKEINFO) -I$(srcdir) $(srcdir)/install.texi --output=$@ \
|
VL_INST_BIN_FILES = verilator verilator_bin verilator_bin_dbg verilator_coverage_bin_dbg \
|
||||||
--no-headers --no-validate
|
verilator_coverage verilator_gantt verilator_includer verilator_profcfunc
|
||||||
|
# Some scripts go into both the search path and pkgdatadir,
|
||||||
|
# so they can be found by the user, and under $VERILATOR_ROOT.
|
||||||
|
|
||||||
README: readme.texi
|
VL_INST_INC_BLDDIR_FILES = \
|
||||||
$(MAKEINFO) -I$(srcdir) $(srcdir)/readme.texi --output=$@ \
|
include/verilated_config.h \
|
||||||
--no-headers --no-validate
|
include/verilated.mk \
|
||||||
|
|
||||||
installdirs:
|
# Files under srcdir, instead of build time
|
||||||
$(SHELL) ${srcdir}/mkinstalldirs $(bindir) $(infodir)
|
VL_INST_INC_SRCDIR_FILES = \
|
||||||
|
include/*.[chv]* \
|
||||||
|
include/gtkwave/*.[chv]* \
|
||||||
|
include/vltstd/*.[chv]* \
|
||||||
|
|
||||||
|
VL_INST_DATA_SRCDIR_FILES = \
|
||||||
|
examples/*/*.[chv]* examples/*/Makefile* \
|
||||||
|
examples/*/CMakeLists.txt
|
||||||
|
|
||||||
# See uninstall also
|
|
||||||
VL_INST_BIN_FILES = verilator
|
|
||||||
installbin:
|
installbin:
|
||||||
( cd bin ; $(INSTALL_PROGRAM) verilator $(bindir)/verilator )
|
$(MKINSTALLDIRS) $(DESTDIR)$(bindir)
|
||||||
|
( cd ${srcdir}/bin ; $(INSTALL_PROGRAM) verilator $(DESTDIR)$(bindir)/verilator )
|
||||||
|
( cd ${srcdir}/bin ; $(INSTALL_PROGRAM) verilator_coverage $(DESTDIR)$(bindir)/verilator_coverage )
|
||||||
|
( cd ${srcdir}/bin ; $(INSTALL_PROGRAM) verilator_gantt $(DESTDIR)$(bindir)/verilator_gantt )
|
||||||
|
( cd ${srcdir}/bin ; $(INSTALL_PROGRAM) verilator_profcfunc $(DESTDIR)$(bindir)/verilator_profcfunc )
|
||||||
|
( cd bin ; $(INSTALL_PROGRAM) verilator_bin $(DESTDIR)$(bindir)/verilator_bin )
|
||||||
|
( cd bin ; $(INSTALL_PROGRAM) verilator_bin_dbg $(DESTDIR)$(bindir)/verilator_bin_dbg )
|
||||||
|
( cd bin ; $(INSTALL_PROGRAM) verilator_coverage_bin_dbg $(DESTDIR)$(bindir)/verilator_coverage_bin_dbg )
|
||||||
|
$(MKINSTALLDIRS) $(DESTDIR)$(pkgdatadir)/bin
|
||||||
|
( cd ${srcdir}/bin ; $(INSTALL_PROGRAM) verilator_includer $(DESTDIR)$(pkgdatadir)/bin/verilator_includer )
|
||||||
|
|
||||||
VL_INST_MAN_FILES = verilator.1
|
# Man files can either be part of the original kit, or built in current directory
|
||||||
installman:
|
# So important we use $^ so VPATH is searched
|
||||||
for p in $(VL_INST_MAN_FILES) ; do \
|
installman: $(VL_INST_MAN_FILES)
|
||||||
$(INSTALL_PROGRAM) $$p $(mandir)/man1/$$p; \
|
$(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man1
|
||||||
|
for p in $^ ; do \
|
||||||
|
$(INSTALL_DATA) $$p $(DESTDIR)$(mandir)/man1/$$p; \
|
||||||
done
|
done
|
||||||
|
|
||||||
install: all_nomsg installdirs installbin installman install-msg
|
installdata:
|
||||||
|
$(MKINSTALLDIRS) $(DESTDIR)$(pkgdatadir)/include/gtkwave
|
||||||
|
$(MKINSTALLDIRS) $(DESTDIR)$(pkgdatadir)/include/vltstd
|
||||||
|
for p in $(VL_INST_INC_BLDDIR_FILES) ; do \
|
||||||
|
$(INSTALL_DATA) $$p $(DESTDIR)$(pkgdatadir)/$$p; \
|
||||||
|
done
|
||||||
|
cd $(srcdir) \
|
||||||
|
; for p in $(VL_INST_INC_SRCDIR_FILES) ; do \
|
||||||
|
$(INSTALL_DATA) $$p $(DESTDIR)$(pkgdatadir)/$$p; \
|
||||||
|
done
|
||||||
|
$(MKINSTALLDIRS) $(DESTDIR)$(pkgdatadir)/examples/make_hello_c
|
||||||
|
$(MKINSTALLDIRS) $(DESTDIR)$(pkgdatadir)/examples/make_hello_sc
|
||||||
|
$(MKINSTALLDIRS) $(DESTDIR)$(pkgdatadir)/examples/make_tracing_c
|
||||||
|
$(MKINSTALLDIRS) $(DESTDIR)$(pkgdatadir)/examples/make_tracing_sc
|
||||||
|
$(MKINSTALLDIRS) $(DESTDIR)$(pkgdatadir)/examples/make_protect_lib
|
||||||
|
$(MKINSTALLDIRS) $(DESTDIR)$(pkgdatadir)/examples/cmake_hello_c
|
||||||
|
$(MKINSTALLDIRS) $(DESTDIR)$(pkgdatadir)/examples/cmake_hello_sc
|
||||||
|
$(MKINSTALLDIRS) $(DESTDIR)$(pkgdatadir)/examples/cmake_tracing_c
|
||||||
|
$(MKINSTALLDIRS) $(DESTDIR)$(pkgdatadir)/examples/cmake_tracing_sc
|
||||||
|
$(MKINSTALLDIRS) $(DESTDIR)$(pkgdatadir)/examples/cmake_protect_lib
|
||||||
|
cd $(srcdir) \
|
||||||
|
; for p in $(VL_INST_DATA_SRCDIR_FILES) ; do \
|
||||||
|
$(INSTALL_DATA) $$p $(DESTDIR)$(pkgdatadir)/$$p; \
|
||||||
|
done
|
||||||
|
$(MKINSTALLDIRS) $(DESTDIR)$(pkgconfigdir)
|
||||||
|
$(INSTALL_DATA) verilator.pc $(DESTDIR)$(pkgconfigdir)
|
||||||
|
$(INSTALL_DATA) verilator-config.cmake $(DESTDIR)$(pkgdatadir)
|
||||||
|
$(INSTALL_DATA) verilator-config-version.cmake $(DESTDIR)$(pkgdatadir)
|
||||||
|
|
||||||
|
# We don't trust rm -rf, so rmdir instead as it will fail if user put in other files
|
||||||
|
uninstall:
|
||||||
|
-cd $(DESTDIR)$(bindir) && rm -f $(VL_INST_BIN_FILES)
|
||||||
|
-cd $(DESTDIR)$(pkgdatadir)/bin && rm -f $(VL_INST_BIN_FILES)
|
||||||
|
-cd $(DESTDIR)$(mandir)/man1 && rm -f $(VL_INST_MAN_FILES)
|
||||||
|
-cd $(DESTDIR)$(pkgdatadir) && rm -f $(VL_INST_INC_BLDDIR_FILES)
|
||||||
|
-cd $(DESTDIR)$(pkgdatadir) && rm -f $(VL_INST_INC_SRCDIR_FILES)
|
||||||
|
-cd $(DESTDIR)$(pkgdatadir) && rm -f $(VL_INST_DATA_SRCDIR_FILES)
|
||||||
|
-rm $(DESTDIR)$(pkgconfigdir)/verilator.pc
|
||||||
|
-rm $(DESTDIR)$(pkgdatadir)/verilator-config.cmake
|
||||||
|
-rm $(DESTDIR)$(pkgdatadir)/verilator-config-version.cmake
|
||||||
|
-rmdir $(DESTDIR)$(pkgdatadir)/bin
|
||||||
|
-rmdir $(DESTDIR)$(pkgdatadir)/include/gtkwave
|
||||||
|
-rmdir $(DESTDIR)$(pkgdatadir)/include/vltstd
|
||||||
|
-rmdir $(DESTDIR)$(pkgdatadir)/include
|
||||||
|
-rmdir $(DESTDIR)$(pkgdatadir)/examples/make_hello_c
|
||||||
|
-rmdir $(DESTDIR)$(pkgdatadir)/examples/make_hello_sc
|
||||||
|
-rmdir $(DESTDIR)$(pkgdatadir)/examples/make_tracing_c
|
||||||
|
-rmdir $(DESTDIR)$(pkgdatadir)/examples/make_tracing_sc
|
||||||
|
-rmdir $(DESTDIR)$(pkgdatadir)/examples/make_protect_lib
|
||||||
|
-rmdir $(DESTDIR)$(pkgdatadir)/examples/cmake_hello_c
|
||||||
|
-rmdir $(DESTDIR)$(pkgdatadir)/examples/cmake_hello_sc
|
||||||
|
-rmdir $(DESTDIR)$(pkgdatadir)/examples/cmake_tracing_c
|
||||||
|
-rmdir $(DESTDIR)$(pkgdatadir)/examples/cmake_tracing_sc
|
||||||
|
-rmdir $(DESTDIR)$(pkgdatadir)/examples/cmake_protect_lib
|
||||||
|
-rmdir $(DESTDIR)$(pkgdatadir)/examples
|
||||||
|
-rmdir $(DESTDIR)$(pkgdatadir)/cmake
|
||||||
|
-rmdir $(DESTDIR)$(pkgdatadir)
|
||||||
|
-rmdir $(DESTDIR)$(pkgconfigdir)
|
||||||
|
|
||||||
|
install: all_nomsg install-all
|
||||||
|
install-all: installbin installman installdata install-msg
|
||||||
|
|
||||||
install-here: installman ftp
|
install-here: installman ftp
|
||||||
|
|
||||||
ifeq ($(VERILATOR_AUTHOR_SITE),1) # Local... Else don't burden users
|
ifeq ($(VERILATOR_AUTHOR_SITE),1) # Local... Else don't burden users
|
||||||
DIRPROJECT := $(shell project_dir --project)
|
DISTNAMEREV = $(shell sed -e '/DTVERSION/!d' -e 's/.*verilator_\([^"]*\).*/\1/' -e q ${srcdir}/src/config_rev.h)
|
||||||
|
|
||||||
|
VERILATOR_CAD_DIR = $(CAD_DIR)/verilator/$(DISTNAMEREV)/$(DIRPROJECT_ARCH)
|
||||||
INST_PROJ_CVS = cp_if_cvs_diff
|
INST_PROJ_CVS = cp_if_cvs_diff
|
||||||
|
|
||||||
install-project: dist
|
install-cadtools: dist
|
||||||
@echo "Install-project to $(DIRPROJECT)"
|
@echo "Install-project to $(CAD_DIR)"
|
||||||
strip verilator_bin*
|
strip bin/verilator_bin*
|
||||||
$(MAKE) install-project-quick
|
strip bin/verilator_coverage_bin*
|
||||||
for p in verilator.1 ; do \
|
$(MAKE) install-cadtools-quick
|
||||||
$(INSTALL_PROGRAM) -m 0666 $$p $(DIRPROJECT_PREFIX)/man/man1/$$p; \
|
$(MKINSTALLDIRS) $(VERILATOR_CAD_DIR)/man/man1
|
||||||
|
for p in $(VL_INST_MAN_FILES) ; do \
|
||||||
|
$(INSTALL_DATA) $$p $(VERILATOR_CAD_DIR)/man/man1/$$p; \
|
||||||
done
|
done
|
||||||
$(INST_PROJ_CVS) $(DISTNAME).tar.gz $(DIRPROJECT)/hw/utils/verilator/verilator.tgz
|
$(INST_PROJ_CVS) $(DISTNAME).tgz $(VERILATOR_CAD_DIR)/verilator.tgz
|
||||||
rm $(DISTNAME).tar.gz
|
rm $(DISTNAME).tgz
|
||||||
|
|
||||||
install-project-quick:
|
install-cadtools-quick:
|
||||||
@echo "Install-project-quick (no strip) to $(DIRPROJECT)"
|
ifeq ($(CFG_WITH_DEFENV),yes)
|
||||||
|
@echo "%Error: Reconfigure with './configure --disable-defenv' to avoid hardcoded paths."
|
||||||
|
false
|
||||||
|
endif
|
||||||
|
@echo "Install-cadtools-quick (no strip) to $(VERILATOR_CAD_DIR)"
|
||||||
|
$(MKINSTALLDIRS) $(VERILATOR_CAD_DIR)/include/gtkwave
|
||||||
|
$(MKINSTALLDIRS) $(VERILATOR_CAD_DIR)/include/vltstd
|
||||||
|
$(MKINSTALLDIRS) $(VERILATOR_CAD_DIR)/bin
|
||||||
for p in $(INST_PROJ_FILES) ; do \
|
for p in $(INST_PROJ_FILES) ; do \
|
||||||
$(INST_PROJ_CVS) $$p $(DIRPROJECT)/hw/utils/verilator/$$p; \
|
$(INST_PROJ_CVS) $$p $(VERILATOR_CAD_DIR)/$$p; \
|
||||||
done
|
done
|
||||||
for p in $(INST_PROJ_BIN_FILES) ; do \
|
for p in $(INST_PROJ_BIN_FILES) ; do \
|
||||||
$(INST_PROJ_CVS) $$p $(DIRPROJECT)/hw/utils/verilator/$$p-$(DIRPROJECT_ARCH); \
|
$(INST_PROJ_CVS) $$p $(VERILATOR_CAD_DIR)/$$p; \
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# VERILATOR_AUTHOR_SITE
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# Use --xml flag to see the cppcheck code to use for suppression
|
||||||
|
CPPCHECK_CPP = $(wildcard \
|
||||||
|
$(srcdir)/include/*.cpp \
|
||||||
|
$(srcdir)/src/*.cpp )
|
||||||
|
CPPCHECK_H = $(wildcard \
|
||||||
|
$(srcdir)/include/*.h \
|
||||||
|
$(srcdir)/src/*.h )
|
||||||
|
CPPCHECK = src/cppcheck_filtered
|
||||||
|
CPPCHECK_FLAGS = --enable=all --inline-suppr \
|
||||||
|
--suppress=unusedScopedObject --suppress=cstyleCast --suppress=useInitializationList \
|
||||||
|
--suppress=nullPointerRedundantCheck
|
||||||
|
CPPCHECK_FLAGS += --xml
|
||||||
|
CPPCHECK_DEP = $(subst .cpp,.cppcheck,$(CPPCHECK_CPP))
|
||||||
|
CPPCHECK_INC = -I$(srcdir)/include -I$(srcdir)/src/obj_dbg -I$(srcdir)/src
|
||||||
|
|
||||||
|
cppcheck: $(CPPCHECK_DEP)
|
||||||
|
%.cppcheck: %.cpp
|
||||||
|
$(CPPCHECK) $(CPPCHECK_FLAGS) -DVL_DEBUG=1 -DVL_CPPCHECK=1 $(CPPCHECK_INC) $<
|
||||||
|
|
||||||
|
CLANGTIDY = clang-tidy
|
||||||
|
CLANGTIDY_FLAGS = -config=''
|
||||||
|
CLANGTIDY_DEP = $(subst .h,.h.tidy,$(CPPCHECK_H)) \
|
||||||
|
$(subst .cpp,.cpp.tidy,$(CPPCHECK_CPP))
|
||||||
|
|
||||||
|
clangtidy: $(CLANGTIDY_DEP)
|
||||||
|
%.cpp.tidy: %.cpp
|
||||||
|
$(CLANGTIDY) $(CLANGTIDY_FLAGS) $< -- -DVL_DEBUG=1 -DVL_CPPCHECK=1 $(CPPCHECK_INC) | 2>&1 tee $@
|
||||||
|
%.h.tidy: %.h
|
||||||
|
$(CLANGTIDY) $(CLANGTIDY_FLAGS) $< -- -DVL_DEBUG=1 -DVL_CPPCHECK=1 $(CPPCHECK_INC) | 2>&1 tee $@
|
||||||
|
|
||||||
|
analyzer-src:
|
||||||
|
-rm -rf src/obj_dbg
|
||||||
|
scan-build $(MAKE) -k verilator_coverage_bin_dbg verilator_bin_dbg
|
||||||
|
|
||||||
|
analyzer-include:
|
||||||
|
-rm -rf examples/*/obj*
|
||||||
|
scan-build $(MAKE) -k examples
|
||||||
|
|
||||||
ftp: info
|
ftp: info
|
||||||
echo "http://www.veripool.com/verilator3.html"
|
|
||||||
cp verilator.html verilator_man.html
|
|
||||||
ftp_tree --password $(VERIPOOL_PW) --user $(VERIPOOL_USER) verilator_man.html webftp.veripool.com:/web
|
|
||||||
|
|
||||||
install-msg:
|
install-msg:
|
||||||
@echo "Installed!"
|
|
||||||
@echo
|
@echo
|
||||||
@echo "Add to your startup file (for bash or csh, as appropriate):"
|
@echo "Installed binaries to $(DESTDIR)$(bindir)/verilator"
|
||||||
@echo " export VERILATOR_ROOT="`pwd`
|
@echo "Installed man to $(DESTDIR)$(mandir)/man1"
|
||||||
@echo " setenv VERILATOR_ROOT "`pwd` " ; export VERILATOR_ROOT "
|
@echo "Installed examples to $(DESTDIR)$(pkgdatadir)/examples"
|
||||||
@echo
|
@echo
|
||||||
@echo "See 'verilator.txt' for documentation."
|
@echo "For documentation see 'man verilator' or 'verilator --help'"
|
||||||
|
@echo "For forums and to report bugs see https://verilator.org"
|
||||||
@echo
|
@echo
|
||||||
|
|
||||||
uninstall:
|
IN_WILD := ${srcdir}/*.in ${srcdir}/*/*.in
|
||||||
-cd $(mandir)/man1 && rm -f $(VL_INST_MAN_FILES)
|
|
||||||
-cd $(bindir) && rm -f $(VL_INST_BIN_FILES)
|
|
||||||
|
|
||||||
# autoheader might not change config_build.h.in, so touch a stamp file.
|
# autoheader might not change config_build.h.in, so touch it
|
||||||
IN_WILD := ${srcdir}/*.in ${srcdir}/*/*.in ${srcdir}/*/*/*.in \
|
${srcdir}/config_build.h: ${srcdir}/config_build.h.in configure
|
||||||
*.in */*.in */*.in
|
|
||||||
|
|
||||||
${srcdir}/config_build.h.in: stamp-h.in
|
|
||||||
${srcdir}/stamp-h.in: configure.ac $(wildcard $(IN_WILD))
|
|
||||||
cd ${srcdir} && autoheader
|
cd ${srcdir} && autoheader
|
||||||
echo timestamp > ${srcdir}/stamp-h.in
|
touch $@
|
||||||
config_build.h: stamp-h
|
Makefile: Makefile.in config.status $(IN_WILD)
|
||||||
stamp-h: config_build.h.in config.status
|
|
||||||
./config.status
|
|
||||||
Makefile: Makefile.in config.status
|
|
||||||
./config.status
|
|
||||||
src/Makefile: src/Makefile.in config.status
|
|
||||||
./config.status
|
./config.status
|
||||||
|
src/Makefile: src/Makefile.in Makefile
|
||||||
config.status: configure
|
config.status: configure
|
||||||
./config.status --recheck
|
./config.status --recheck
|
||||||
|
|
||||||
configure: configure.ac
|
configure: configure.ac
|
||||||
|
ifeq ($(CFG_WITH_CCWARN),yes) # Local... Else don't burden users
|
||||||
|
autoconf --warnings=all
|
||||||
|
else
|
||||||
autoconf
|
autoconf
|
||||||
|
endif
|
||||||
|
|
||||||
maintainer-clean::
|
maintainer-clean::
|
||||||
@echo "This command is intended for maintainers to use;"
|
@echo "This command is intended for maintainers to use;"
|
||||||
@echo "rebuilding the deleted files requires makeinfo."
|
@echo "rebuilding the deleted files requires autoconf."
|
||||||
rm -f *.info* $(INFOS) faq.html verilator.html configure bin/*
|
rm -f configure
|
||||||
|
|
||||||
clean mostlyclean distclean maintainer-clean maintainer-copy::
|
clean mostlyclean distclean maintainer-clean maintainer-copy::
|
||||||
for dir in $(SUBDIRS); do \
|
for dir in $(SUBDIRS); do \
|
||||||
echo making $@ in $$dir ; \
|
echo making $@ in $$dir ; \
|
||||||
(cd $$dir && $(MAKE) $@) ; \
|
$(MAKE) -C $$dir $@ ; \
|
||||||
done
|
done
|
||||||
|
|
||||||
clean mostlyclean distclean maintainer-clean::
|
clean mostlyclean distclean maintainer-clean::
|
||||||
rm -f $(SCRIPTS) *.tmp
|
rm -f $(SCRIPTS) *.tmp
|
||||||
rm -f *.aux *.cp *.cps *.dvi *.fn *.fns *.ky *.kys *.log
|
rm -f *.aux *.cp *.cps *.dvi *.fn *.fns *.ky *.kys *.log
|
||||||
rm -f *.pg *.pgs *.toc *.tp *.tps *.vr *.vrs *.idx
|
rm -f *.pg *.pgs *.toc *.tp *.tps *.vr *.vrs *.idx
|
||||||
rm -f *.ev *.evs *.ov *.ovs *.cv *.cvs *.ma *.mas
|
rm -f *.ev *.evs *.ov *.ovs *.cv *.cvs *.ma *.mas
|
||||||
rm -f *.tex
|
rm -f *.tex
|
||||||
|
rm -rf examples/*/obj_dir* examples/*/logs
|
||||||
|
rm -rf test_*/obj_dir
|
||||||
|
rm -rf nodist/obj_dir
|
||||||
|
|
||||||
distclean maintainer-clean::
|
distclean maintainer-clean::
|
||||||
rm -f Makefile config.status config.cache config.log verilator_bin* TAGS
|
rm -f *.info* *.1 $(INFOS) $(INFOS_OLD) $(VL_INST_MAN_FILES)
|
||||||
rm -f include/verilated.mk
|
rm -f Makefile config.status config.cache config.log TAGS
|
||||||
|
rm -f verilator_bin* verilator_coverage_bin*
|
||||||
|
rm -f bin/verilator_bin* bin/verilator_coverage_bin*
|
||||||
|
rm -f include/verilated.mk include/verilated_config.h
|
||||||
|
|
||||||
TAGFILES=${srcdir}/*/*.cpp ${srcdir}/*/*.h ${srcdir}/*/[a-z]*.in \
|
TAGFILES=${srcdir}/*/*.cpp ${srcdir}/*/*.h ${srcdir}/*/*.in \
|
||||||
${srcdir}/[a-z]*.in ${srcdir}/*.texi
|
${srcdir}/*.in ${srcdir}/*.pod
|
||||||
|
|
||||||
TAGS: $(TAGFILES)
|
TAGS: $(TAGFILES)
|
||||||
etags $(TAGFILES)
|
etags $(TAGFILES)
|
||||||
|
|
||||||
|
.PHONY: doxygen
|
||||||
|
|
||||||
|
doxygen:
|
||||||
|
$(MAKE) -C docs doxygen
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Test targets
|
||||||
|
|
||||||
|
dist-file-list:
|
||||||
|
@echo "begin-dist-file-list:"; # Scripts look for this
|
||||||
|
@echo $(wildcard $(DISTFILES))
|
||||||
|
@echo "end-dist-file-list:"; # Scripts look for this
|
||||||
|
|
||||||
|
print-cfg-with-threaded:
|
||||||
|
@echo $(CFG_WITH_THREADED)
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
# Distributions
|
# Distributions
|
||||||
|
|
||||||
DISTCONFIG = src/config_build.h.in
|
DISTTITLE := Verilator $(word 1,$(PACKAGE_VERSION))
|
||||||
|
DISTNAME := verilator-$(word 1,$(PACKAGE_VERSION))
|
||||||
DISTTITLE := $(shell sed -e '/DTVERSION/!d' -e 's/[^0-9]*\([0-9.a-z]*\).*/verilator-\1/' -e 's/v/V/' -e q $(DISTCONFIG))
|
DISTDATEPRE := $(word 2,$(PACKAGE_VERSION))
|
||||||
DISTNAME := $(shell sed -e '/DTVERSION/!d' -e 's/[^0-9]*\([0-9.a-z]*\).*/verilator-\1/' -e q $(DISTCONFIG))
|
DISTDATE := $(subst /,-,$(DISTDATEPRE))
|
||||||
DISTDATEPRE := $(shell sed -e '/DTVERSION/!d' -e 's/.*\([0-3]\?[0-9].[0-3]\?[0-9].[1-2][0-9][0-9][0-9]\).*/\1/' -e q $(DISTCONFIG))
|
|
||||||
|
|
||||||
DISTTAGNAME := $(subst .,_,$(subst -,_,$(DISTNAME)))
|
DISTTAGNAME := $(subst .,_,$(subst -,_,$(DISTNAME)))
|
||||||
DISTDATE := $(subst /,-,$(DISTDATEPRE))
|
|
||||||
|
|
||||||
tag:
|
tag:
|
||||||
svnorcvs tag $(DISTTAGNAME)
|
svnorcvs tag $(DISTTAGNAME)
|
||||||
@@ -339,14 +568,14 @@ dist: $(DISTDEP) maintainer-copy
|
|||||||
chmod -R a+r $(DISTNAME)
|
chmod -R a+r $(DISTNAME)
|
||||||
tar chf $(DISTNAME).tar $(DISTNAME)
|
tar chf $(DISTNAME).tar $(DISTNAME)
|
||||||
gzip --force --best $(DISTNAME).tar
|
gzip --force --best $(DISTNAME).tar
|
||||||
|
mv $(DISTNAME).tar.gz $(DISTNAME).tgz
|
||||||
rm -fr $(DISTNAME)
|
rm -fr $(DISTNAME)
|
||||||
|
|
||||||
maintainer-diff:
|
maintainer-diff:
|
||||||
svnorcvs diff $(DISTTAGNAME)
|
svnorcvs diff $(DISTTAGNAME)
|
||||||
|
|
||||||
preexist:
|
preexist:
|
||||||
test ! -r ~/src/kits/$(DISTNAME).tar.gz
|
svnorcvs nexists $(DISTTAGNAME)
|
||||||
|
|
||||||
maintainer-dist: preexist dist tag
|
maintainer-dist: preexist dist tag
|
||||||
cp *.gz ~/backpack
|
svnorcvs release $(DISTNAME).tgz
|
||||||
cp *.gz ~/src/kits
|
|
||||||
|
|||||||
@@ -1,167 +0,0 @@
|
|||||||
1 Verilator
|
|
||||||
***********
|
|
||||||
|
|
||||||
This is the Verilator Package.
|
|
||||||
|
|
||||||
1.1 Copyright
|
|
||||||
=============
|
|
||||||
|
|
||||||
This package is Copyright 2003-2007 by Wilson Snyder
|
|
||||||
<[email protected]>.
|
|
||||||
|
|
||||||
You may distribute under the terms of either the GNU General Public
|
|
||||||
License or the Artistic License, as specified in the Perl README file.
|
|
||||||
|
|
||||||
This code is provided with no warranty of any kind, and is used
|
|
||||||
entirely at your own risk.
|
|
||||||
|
|
||||||
1.2 Description
|
|
||||||
===============
|
|
||||||
|
|
||||||
Verilator converts synthesizable (not behavioral) Verilog code into C++
|
|
||||||
or SystemC code. It is not a complete simulator, just a translator.
|
|
||||||
|
|
||||||
Verilator is invoked with parameters similar to GCC or Synopsys's
|
|
||||||
VCS. It reads the specified Verilog code, lints it, and optionally
|
|
||||||
adds coverage code. For C++ format, it outputs .cpp and .h files. For
|
|
||||||
SystemC format, it outputs .sp files for the SystemPerl preprocessor
|
|
||||||
available at http://veripool.com.
|
|
||||||
|
|
||||||
The resulting files are then compiled with C++. The user writes a
|
|
||||||
little C++ wrapper file, which instantiates the top level module. This
|
|
||||||
is compiled in C++, and linked with the Verilated files.
|
|
||||||
|
|
||||||
The resulting executable will perform the actual simulation.
|
|
||||||
|
|
||||||
1.3 Obtaining Distribution
|
|
||||||
==========================
|
|
||||||
|
|
||||||
The latest version is available at `http://veripool.com/verilator.htm'
|
|
||||||
|
|
||||||
Download the latest package from that site, and decompress. `gunzip
|
|
||||||
verilator_version.tar.gz ; tar xvf verilator_version.tar'
|
|
||||||
|
|
||||||
1.4 Directory Structure
|
|
||||||
=======================
|
|
||||||
|
|
||||||
The directories after de-taring are as follows:
|
|
||||||
|
|
||||||
* bin/verilator => Compiler Wrapper invoked on user Verilog code
|
|
||||||
|
|
||||||
* include/ => Files that should be in your -I compiler
|
|
||||||
path
|
|
||||||
|
|
||||||
* include/verilated.cpp => Global routines to link into your
|
|
||||||
simulator
|
|
||||||
|
|
||||||
* include/verilated.h => Global headers
|
|
||||||
|
|
||||||
* include/verilated.v => Stub defines for linting
|
|
||||||
|
|
||||||
* include/verilated.mk => Common makefile
|
|
||||||
|
|
||||||
* src/ => Translator source code
|
|
||||||
|
|
||||||
* test_v => Example Verilog code for other test dirs
|
|
||||||
|
|
||||||
* test_c => Example Verilog->C++ conversion
|
|
||||||
|
|
||||||
* test_sc => Example Verilog->SystemC conversion
|
|
||||||
|
|
||||||
* test_sp => Example Verilog->SystemPerl conversion
|
|
||||||
|
|
||||||
* test_vcs => Example Verilog->VCS conversion (test the
|
|
||||||
test)
|
|
||||||
|
|
||||||
* test_verilated => Internal tests
|
|
||||||
|
|
||||||
* test_regress => Internal tests
|
|
||||||
|
|
||||||
1.5 Supported Systems
|
|
||||||
=====================
|
|
||||||
|
|
||||||
This version of verilator has been built and tested on:
|
|
||||||
|
|
||||||
* SuSE AMD64 i686-linux-2.6.5
|
|
||||||
|
|
||||||
Other users report success with Redhat Linux 2.4, Windows under
|
|
||||||
Cygwin, HPUX and Solaris. It should run with minor porting on any Unix
|
|
||||||
system.
|
|
||||||
|
|
||||||
1.6 Installation
|
|
||||||
================
|
|
||||||
|
|
||||||
1. If you will be using SystemC (vs straight C++ output), download
|
|
||||||
SystemC 2.0.1 from `http://www.systemc.org'. Follow their
|
|
||||||
installation instructions. As described in the System-Perl README,
|
|
||||||
you will need to set SYSTEMC and/or SYSTEMC_KIT to point to this
|
|
||||||
download. Also, set SYSTEMC_ARCH to the architecture name you used
|
|
||||||
with SystemC, generally 'linux' or 'cygwin'.
|
|
||||||
|
|
||||||
2. If you will be using SystemC, download and install Verilog-Perl,
|
|
||||||
`http://search.cpan.org/search?module=Verilog::Language'.
|
|
||||||
|
|
||||||
3. If you will be using SystemC, download and install System-Perl,
|
|
||||||
`http://search.cpan.org/search?module=SystemC::Netlist'. Note
|
|
||||||
you'll need to set a `SYSTEMPERL' environment variable to point to
|
|
||||||
the downloaded kit (not the installed files.) Also, make sure to
|
|
||||||
do a `make sc_patch'.
|
|
||||||
|
|
||||||
4. `cd' to the Verilator directory containing this README.
|
|
||||||
|
|
||||||
5. Type `./configure' to configure Verilator for your system.
|
|
||||||
|
|
||||||
6. Type `make' to compile Verilator.
|
|
||||||
|
|
||||||
On Cygwin (Windows) you may get a error about libperl.a not being
|
|
||||||
found. You need to copy your perl libraries as follows.
|
|
||||||
|
|
||||||
1. Type `perl -MExtUtils::Embed -e ldopts'
|
|
||||||
|
|
||||||
2. It will show a directory name ending in /CORE. cd to that
|
|
||||||
directory.
|
|
||||||
|
|
||||||
3. `cp libperl5_6_1.a libperl.a'
|
|
||||||
|
|
||||||
4. `cp libperl5_6_1.dll libperl.dll'
|
|
||||||
|
|
||||||
5. `cp libperl5_6_1.def libperl.def'
|
|
||||||
|
|
||||||
7. Type `make test' to check the compilation.
|
|
||||||
|
|
||||||
You may get a error about the Bit::Vector perl package. You will
|
|
||||||
need to install it if you want the tests to pass. (Try `make
|
|
||||||
test_c' for a smaller test that doesn't require it.)
|
|
||||||
|
|
||||||
You may get a error about a typedef conflict for uint32_t. Edit
|
|
||||||
verilated.h to change the typedef to work, probably to `typedef
|
|
||||||
unsigned long uint32_t;'.
|
|
||||||
|
|
||||||
If you get warnings, you might want to edit `include/verilated.mk'
|
|
||||||
to delete the lines that define VK_CPPFLAGS_WALL.
|
|
||||||
|
|
||||||
8. There is no installation at present; this package runs from the
|
|
||||||
distribution directory. Programs should set the environment
|
|
||||||
variable VERILATOR_ROOT to point to this distribution, then execute
|
|
||||||
$VERILATOR_ROOT/bin/verilator, which will find the path to all
|
|
||||||
needed files.
|
|
||||||
|
|
||||||
Verilator assumes you did a make in the SystemC kit directory. If
|
|
||||||
not, you will need to populate `$SYSTEMC/include' and
|
|
||||||
`$SYSTEMC/lib-linux' appropriately.
|
|
||||||
|
|
||||||
If you will be modifying Verilator, you will probably want a second
|
|
||||||
stable copy of this kit for others to use while you experiment.
|
|
||||||
|
|
||||||
9. Detailed documentation and the man page can be seen by running:
|
|
||||||
|
|
||||||
bin/verilator -help
|
|
||||||
|
|
||||||
or reading verilator.txt in the same directory as this README.
|
|
||||||
|
|
||||||
|
|
||||||
1.7 Limitations
|
|
||||||
===============
|
|
||||||
|
|
||||||
See verilator.txt (or execute `bin/verilator --help') for limitations.
|
|
||||||
|
|
||||||
+140
@@ -0,0 +1,140 @@
|
|||||||
|
// Github doesn't render images unless absolute URL
|
||||||
|
:!toc:
|
||||||
|
|
||||||
|
ifdef::env-github[]
|
||||||
|
image:https://img.shields.io/badge/License-LGPL%20v3-blue.svg[license LGPLv3,link=https://www.gnu.org/licenses/lgpl-3.0]
|
||||||
|
image:https://img.shields.io/badge/License-Artistic%202.0-0298c3.svg[license Artistic-2.0,link=https://opensource.org/licenses/Artistic-2.0]
|
||||||
|
image:https://api.codacy.com/project/badge/Grade/ff998fdaa6f64b9a95eb5f342ee6bf4d[Code Quality,link=https://www.codacy.com/manual/wsnyder/verilator]
|
||||||
|
image:https://travis-ci.com/verilator/verilator.svg?branch=master[Build Status (Travis CI),link=https://travis-ci.com/verilator/verilator]
|
||||||
|
endif::[]
|
||||||
|
|
||||||
|
ifdef::env-github[]
|
||||||
|
:link_verilator_contributing: link:docs/CONTRIBUTING.adoc
|
||||||
|
:link_verilator_install: link:docs/install.adoc
|
||||||
|
endif::[]
|
||||||
|
ifndef::env-github[]
|
||||||
|
:link_verilator_contributing: https://github.com/verilator/verilator/blob/master/docs/CONTRIBUTING.adoc
|
||||||
|
:link_verilator_install: https://verilator.org/install
|
||||||
|
endif::[]
|
||||||
|
|
||||||
|
== Welcome to Verilator
|
||||||
|
|
||||||
|
[cols="a,a",indent=0,frame="none"]
|
||||||
|
|===
|
||||||
|
^.^| *Welcome to Verilator, the fastest free Verilog HDL simulator.*
|
||||||
|
+++ <br/> +++ • Accepts synthesizable Verilog or SystemVerilog
|
||||||
|
+++ <br/> +++ • Performs lint code-quality checks
|
||||||
|
+++ <br/> +++ • Compiles into multithreaded {cpp}, SystemC, or (soon) {cpp}-under-Python
|
||||||
|
+++ <br/> +++ • Creates XML to front-end your own tools
|
||||||
|
<.^|image:https://www.veripool.org/img/verilator_256_200_min.png[Logo,256,200]
|
||||||
|
|
||||||
|
>.^|image:https://www.veripool.org/img/verilator_multithreaded_performance_bg-min.png[,388,178]
|
||||||
|
^.^| *Fast*
|
||||||
|
+++ <br/> +++ • Outperforms many commercial simulators
|
||||||
|
+++ <br/> +++ • Single- and multi-threaded output models
|
||||||
|
|
||||||
|
^.^| *Widely Used*
|
||||||
|
+++ <br/> +++ • Wide industry and academic deployment
|
||||||
|
+++ <br/> +++ • Out-of-the-box support from Arm, and RISC-V vendor IP
|
||||||
|
<.^|image:https://www.veripool.org/img/verilator_usage_400x200-min.png[,400,200]
|
||||||
|
|
||||||
|
>.^|image:https://www.veripool.org/img/chips_alliance_logo_225x75-min.png[CHIPS Alliance,link=https://chipsalliance.org]
|
||||||
|
image:https://www.veripool.org/img/osi_logo_125x125-min.png[,125,125]
|
||||||
|
^.^| *Community Driven & Openly Licensed*
|
||||||
|
+++ <br/> +++ • Guided by the https://chipsalliance.org/[CHIPS Alliance] and https://www.linuxfoundation.org/[Linux Foundation]
|
||||||
|
+++ <br/> +++ • Open, and free as in both speech and beer
|
||||||
|
+++ <br/> +++ • More simulation for your verification budget
|
||||||
|
|===
|
||||||
|
|
||||||
|
== What Verilator Does
|
||||||
|
|
||||||
|
Verilator is invoked with parameters similar to GCC or Synopsys's VCS. It
|
||||||
|
"Verilates" the specified synthesizable Verilog or SystemVerilog code by
|
||||||
|
reading it, performing lint checks, and optionally inserting assertion
|
||||||
|
checks and coverage-analysis points. It outputs single- or multi-threaded
|
||||||
|
.cpp and .h files, the "Verilated" code.
|
||||||
|
|
||||||
|
The user writes a little {cpp}/SystemC wrapper file, which instantiates the
|
||||||
|
"Verilated" model of the user's top level module. These {cpp}/SystemC
|
||||||
|
files are then compiled by a {cpp} compiler (gcc/clang/MSVC++). The
|
||||||
|
resulting executable performs the design simulation. Verilator also
|
||||||
|
supports linking its generated libraries, optionally encrypted, into other
|
||||||
|
simulators.
|
||||||
|
|
||||||
|
Verilator may not be the best choice if you are expecting a full featured
|
||||||
|
replacement for NC-Verilog, VCS or another commercial Verilog simulator, or
|
||||||
|
if you are looking for a behavioral Verilog simulator e.g. for a quick
|
||||||
|
class project (we recommend http://iverilog.icarus.com[Icarus Verilog] for
|
||||||
|
this.) However, if you are looking for a path to migrate synthesizable
|
||||||
|
Verilog to {cpp} or SystemC, and your team is comfortable writing just a
|
||||||
|
touch of {cpp} code, Verilator is the tool for you.
|
||||||
|
|
||||||
|
== Performance
|
||||||
|
|
||||||
|
Verilator does not simply convert Verilog HDL to {cpp} or SystemC. Rather
|
||||||
|
than only translate, Verilator compiles your code into a much faster
|
||||||
|
optimized and optionally thread-partitioned model, which is in turn wrapped
|
||||||
|
inside a {cpp}/SystemC/Python module. The results are a compiled Verilog
|
||||||
|
model that executes even on a single-thread over 10x faster than standalone
|
||||||
|
SystemC, and on a single thread is about 100 times faster than interpreted
|
||||||
|
Verilog simulators such as http://iverilog.icarus.com[Icarus
|
||||||
|
Verilog]. Another 2-10x speedup might be gained from multithreading
|
||||||
|
(yielding 200-1000x total over interpreted simulators).
|
||||||
|
|
||||||
|
Verilator has typically similar or better performance versus the commercial
|
||||||
|
Verilog simulators (Carbon Design Systems Carbonator, Modelsim, Cadence
|
||||||
|
Incisive/NC-Verilog, Synopsys VCS, VTOC, and Pragmatic CVer/CVC). But,
|
||||||
|
Verilator is free, so you can spend on computes rather than licenses. Thus
|
||||||
|
Verilator gives you more cycles/dollar than anything else available.
|
||||||
|
|
||||||
|
For more information on how Verilator stacks up to some of the other
|
||||||
|
commercial and free Verilog simulators, see the
|
||||||
|
https://www.veripool.org/verilog_sim_benchmarks.html[Verilog Simulator
|
||||||
|
Benchmarks]. (If you benchmark Verilator, please see the notes in the
|
||||||
|
https://verilator.org/verilator_doc.pdf[Verilator manual (PDF)], and also
|
||||||
|
if possible post on the forums the results; there may be additional tweaks
|
||||||
|
possible.)
|
||||||
|
|
||||||
|
== Installation & Documentation
|
||||||
|
|
||||||
|
For more information:
|
||||||
|
|
||||||
|
* {link_verilator_install}[Verilator installation and package directory
|
||||||
|
structure]
|
||||||
|
|
||||||
|
* https://verilator.org/verilator_doc.html[Verilator manual (HTML)],
|
||||||
|
or https://verilator.org/verilator_doc.pdf[Verilator manual (PDF)]
|
||||||
|
|
||||||
|
* https://verilator.org/forum[Verilator forum]
|
||||||
|
|
||||||
|
* https://verilator.org/issues[Verilator Issues]
|
||||||
|
|
||||||
|
== Community Supported
|
||||||
|
|
||||||
|
Verilator is a community project, guided by the
|
||||||
|
https://chipsalliance.org/[CHIPS Alliance] under the
|
||||||
|
https://www.linuxfoundation.org/[Linux Foundation].
|
||||||
|
|
||||||
|
We appreciate and welcome your contributions in whatever form; please see
|
||||||
|
{link_verilator_contributing}[Contributing to Verilator]. Thanks to our
|
||||||
|
https://verilator.org/verilator_doc.html#CONTRIBUTORS[Contributors and
|
||||||
|
Sponsors].
|
||||||
|
|
||||||
|
== Related Projects
|
||||||
|
|
||||||
|
* http://gtkwave.sourceforge.net/[GTKwave] - Waveform viewer for Verilator
|
||||||
|
traces.
|
||||||
|
|
||||||
|
* http://iverilog.icarus.com[Icarus Verilog] - Icarus is a full featured
|
||||||
|
interpreted Verilog simulator. If Verilator does not support your needs,
|
||||||
|
perhaps Icarus may.
|
||||||
|
|
||||||
|
== Open License
|
||||||
|
|
||||||
|
Verilator is Copyright 2003-2019 by Wilson Snyder. (Report bugs to
|
||||||
|
https://verilator.org/issues[Verilator Issues].)
|
||||||
|
|
||||||
|
Verilator is free software; you can redistribute it and/or modify it under
|
||||||
|
the terms of either the GNU Lesser General Public License Version 3 or the
|
||||||
|
Perl Artistic License Version 2.0. (See the documentation for more
|
||||||
|
details.)
|
||||||
@@ -1,149 +0,0 @@
|
|||||||
// $Id$
|
|
||||||
// DESCRIPTION: Verilator: List of To Do issues.
|
|
||||||
//
|
|
||||||
// Copyright 2004-2007 by Wilson Snyder. This program is free software; you can
|
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
|
||||||
// General Public License or the Perl Artistic License.
|
|
||||||
|
|
||||||
|
|
||||||
Features:
|
|
||||||
Finish 3.400 new ordering fixes
|
|
||||||
Latch optimizations {Need here}
|
|
||||||
Task I/Os connecting to non-simple variables.
|
|
||||||
Fix nested casez statements expanding into to huge C++. [JeanPaul Vanitegem]
|
|
||||||
Fix FileLine memory inefficiency
|
|
||||||
Fix ordering of each bit separately in a signal (mips)
|
|
||||||
assign b[3:0] = b[7:4]; assign b[7:4] = in;
|
|
||||||
Support gate primitives/ cell libraries from xilinx, etc
|
|
||||||
Assign dont_care value to an 1'bzzz assignment
|
|
||||||
Function to eval combo logic after /*verilator public*/ functions [gwaters]
|
|
||||||
Support generated clocks (correctness)
|
|
||||||
?gcov coverage
|
|
||||||
Selectable SystemC types based on widths (see notes below)
|
|
||||||
Compile time
|
|
||||||
Inline first level trace routines
|
|
||||||
Coverage
|
|
||||||
Points should be per-scope like everything else rather then per-module
|
|
||||||
Expression coverage (see notes)
|
|
||||||
Constant functions for widths, etc, IE "input [log2(PARAM):0] xx;"
|
|
||||||
More Verilog 2001 Support
|
|
||||||
(* *) Attributes (just ignore -- preprocessor?)
|
|
||||||
Real numbers (NEVER)
|
|
||||||
Recursive functions (NEVER)
|
|
||||||
Verilog configuration files (NEVER)
|
|
||||||
DPI to define C/C++ calls from Verilog
|
|
||||||
|
|
||||||
Long-term Features
|
|
||||||
Assertions
|
|
||||||
VHDL parser [Philips]
|
|
||||||
Tristate support
|
|
||||||
SystemPerl integration
|
|
||||||
Multithreaded execution
|
|
||||||
Front end parser integration into Verilog-Perl like Netlist
|
|
||||||
|
|
||||||
Testing:
|
|
||||||
Capture all inputs into global "rerun it" file
|
|
||||||
Code to make wrapper that sets signals, so can do comparison checks
|
|
||||||
New random program generator
|
|
||||||
Better graph viewer with search and zoom
|
|
||||||
Port and test against opencores.org code
|
|
||||||
|
|
||||||
Usability:
|
|
||||||
Better reporting of unopt problems, including what lines of code
|
|
||||||
Report more errors (all of them?) before exiting [Eugene Weber]
|
|
||||||
|
|
||||||
Performance:
|
|
||||||
Constant propagation
|
|
||||||
Extra cleaning AND: 1 & ((VARREF >> 1) | ((&VARREF >> 1) & VARREF))
|
|
||||||
Extra shift (perhaps due to clean): if (1 & CAST (VARREF >> #))
|
|
||||||
Gated clock and latch conversion to flops. [JeanPaul Vanitegem]
|
|
||||||
Could propagate the AND into pos/negedges and let domaining optimize.
|
|
||||||
Negedge reset
|
|
||||||
Switch to remove negedges that don't matter
|
|
||||||
Can't remove async resets from control flops (like in syncronizers)
|
|
||||||
If all references to array have a constant index, blow up into separate signals-per-index
|
|
||||||
Multithreaded execution
|
|
||||||
Bit-multiply for faster bit swapping and a=b[1,3,2] random bit reorderings.
|
|
||||||
Move _last sets and all other combo logic inside master
|
|
||||||
if() that triggers on all possible sense items
|
|
||||||
Rewrite and combine V3Life, V3Subst
|
|
||||||
If block temp only ever set in one place to constant, propagate it
|
|
||||||
Used in t_mem for array delayed assignments
|
|
||||||
Replace variables if set later in same cfunc branch
|
|
||||||
See for example duplicate sets of _narrow in cycle 90/91 of t_select_plusloop
|
|
||||||
Same assignment on both if branches
|
|
||||||
"if (a) { ... b=2; } else { ... b=2;}" -> "b=2; if ..."
|
|
||||||
Careful though, as b could appear in the statement or multiple times in statement
|
|
||||||
(Could just require exatly two 'b's in statement)
|
|
||||||
Simplify XOR/XNOR/AND/OR bit selection trees
|
|
||||||
Foo = A[1] ^ A[2] ^ A[3] etc are better as ^ ( A & 32'b...1110 )
|
|
||||||
Combine variables into wider elements
|
|
||||||
Parallel statements on different bits should become single signal
|
|
||||||
Variables that are always consumed in "parallel" can be joined
|
|
||||||
Duplicate assignments in gate optimization
|
|
||||||
Common to have many separate posedge blocks, each with identical
|
|
||||||
reset_r <= rst_in
|
|
||||||
*If signal is used only once (not counting trace), always gate substitute
|
|
||||||
Don't merge if any combining would form circ logic (out goes back to in)
|
|
||||||
Multiple assignments each bit can become single assign with concat
|
|
||||||
Make sure a SEL of a CONCAT can get the single bit back.
|
|
||||||
Usually blocks/values
|
|
||||||
Enable only after certain time, so VL_TIME_I(32) > 0x1e gets eliminated out
|
|
||||||
Better ordering of a<=b, b<=c, put all refs to 'b' next to each other to optimize caching
|
|
||||||
Allow Split of case statements without a $display/$stop
|
|
||||||
I-cache packing improvements (what/how?)
|
|
||||||
Data cache organization (order of vars in class)
|
|
||||||
First have clocks,
|
|
||||||
then bools instead of uint32_t's
|
|
||||||
then based on what sense list they come from, all outputs, then all inputs
|
|
||||||
finally have any signals part of a "usually" block, or constant.
|
|
||||||
Rather then tracking widths, have a MSB...LSB of this expression
|
|
||||||
(or better, a bitmask of bits relevant in this expression)
|
|
||||||
Track recirculation and convert into clock-enables
|
|
||||||
Clock enables should become new clocking domains for speed
|
|
||||||
If floped(a) & flopped(b) and no other a&b, then instead flop(a&b).
|
|
||||||
Sort by output bitselects so can combine more assignments (see DDP example dx_dm signal)
|
|
||||||
|
|
||||||
All of the temp vars that get set, exp pre_ vars and never feedback
|
|
||||||
(not flops) don't need to be stored in the structs, but instead can
|
|
||||||
be per-invocation, and even better register-colored-like to reuse
|
|
||||||
the space. This will greatly reduce the data footprint.
|
|
||||||
|
|
||||||
|
|
||||||
//**********************************************************************
|
|
||||||
//* Detailed notes on 'todo' features
|
|
||||||
|
|
||||||
Selectable SystemC types based on widths (see notes below)
|
|
||||||
Statements:
|
|
||||||
verilator sc_type uint32_t {override specific I/O signals}
|
|
||||||
verilator sc_typedef width 1 bool
|
|
||||||
verilator sc_typedef width 2-32 uint32_t
|
|
||||||
verilator sc_typedef width 33-64 uint64_t
|
|
||||||
verilator sc_typedef width 65+ sc_bv<width> //<< programmable width
|
|
||||||
Replace `systemc_clock, --pins64
|
|
||||||
Have accessor function with type overloading to get or set the pin value.
|
|
||||||
(Get rid of getdatap mess?)
|
|
||||||
|
|
||||||
//**********************************************************************
|
|
||||||
//* Eventual tristate bus Stuff allowed (old verilator)
|
|
||||||
|
|
||||||
1) Tristate assignments must be continuous assignments
|
|
||||||
The RHS of a tristate assignment can be the following
|
|
||||||
a) a node (tristate or non-tristate)
|
|
||||||
b) a constant (must be all or no z's)
|
|
||||||
x'b0, x'bz, x{x'bz}, x{x'b0} -> are allowed
|
|
||||||
c) a conditional whose possible values are (a) or (b)
|
|
||||||
|
|
||||||
2) One can lose that fact that a node is a tristate node. This happens
|
|
||||||
if a tristate node is assigned to a 'standard' node, or is used on
|
|
||||||
RHS of a conditional. The following infer tristate signals:
|
|
||||||
a) inout <SIGNAL>
|
|
||||||
b) tri <SIGNAL>
|
|
||||||
c) assigning to 'Z' (maybe through a conditional)
|
|
||||||
Note: tristate-ness of an output port determined only by
|
|
||||||
statements in the module (not the instances it calls)
|
|
||||||
|
|
||||||
4) Tristate variables can't be multidimensional arrays
|
|
||||||
5) Only check tristate contention between modules (not within!)
|
|
||||||
6) Only simple compares with 'Z' are allowed (===)
|
|
||||||
|
|
||||||
+3517
-716
File diff suppressed because it is too large
Load Diff
Executable
+291
@@ -0,0 +1,291 @@
|
|||||||
|
: # -*-Mode: perl;-*- use perl, wherever it is
|
||||||
|
eval 'exec perl -wS $0 ${1+"$@"}'
|
||||||
|
if 0;
|
||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# Copyright 2003-2019 by Wilson Snyder. This program is free software; you
|
||||||
|
# can redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
# Version 2.0.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
require 5.006_001;
|
||||||
|
use warnings;
|
||||||
|
use Getopt::Long;
|
||||||
|
use FindBin qw($RealBin $RealScript);
|
||||||
|
use IO::File;
|
||||||
|
use Pod::Usage;
|
||||||
|
use Cwd qw(abs_path getcwd);
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use vars qw($Debug @Opt_Verilator_Sw);
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
#######################################################################
|
||||||
|
# main
|
||||||
|
|
||||||
|
autoflush STDOUT 1;
|
||||||
|
autoflush STDERR 1;
|
||||||
|
|
||||||
|
$Debug = 0;
|
||||||
|
|
||||||
|
# No arguments can't do anything useful. Give help
|
||||||
|
if ($#ARGV < 0) {
|
||||||
|
pod2usage(-exitstatus=>2, -verbose=>0);
|
||||||
|
}
|
||||||
|
|
||||||
|
# We sneak a look at the flags so we can do some pre-environment checks
|
||||||
|
# All flags will hit verilator...
|
||||||
|
foreach my $sw (@ARGV) {
|
||||||
|
$sw = "'$sw'" if $sw =~ m![^---a-zA-Z0-9_/\\:.+]!;
|
||||||
|
push @Opt_Verilator_Sw, $sw;
|
||||||
|
}
|
||||||
|
|
||||||
|
Getopt::Long::config("no_auto_abbrev","pass_through");
|
||||||
|
if (! GetOptions (
|
||||||
|
# Major operating modes
|
||||||
|
"help" => \&usage,
|
||||||
|
"debug:s" => \&debug,
|
||||||
|
# "version!" => \&version, # Also passthru'ed
|
||||||
|
# Additional parameters
|
||||||
|
"<>" => sub {}, # Ignored
|
||||||
|
)) {
|
||||||
|
pod2usage(-exitstatus=>2, -verbose=>0);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Normal, non gdb
|
||||||
|
run(verilator_coverage_bin()
|
||||||
|
." ".join(' ',@Opt_Verilator_Sw));
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
|
||||||
|
sub usage {
|
||||||
|
pod2usage(-verbose=>2, -exitval=>0, -output=>\*STDOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub debug {
|
||||||
|
shift;
|
||||||
|
my $level = shift;
|
||||||
|
$Debug = $level||3;
|
||||||
|
}
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
#######################################################################
|
||||||
|
# Builds
|
||||||
|
|
||||||
|
sub verilator_coverage_bin {
|
||||||
|
my $bin = "";
|
||||||
|
# Use VERILATOR_ROOT if defined, else assume verilator_bin is in the search path
|
||||||
|
my $basename = ($ENV{VERILATOR_COVERAGE_BIN}
|
||||||
|
|| "verilator_coverage_bin_dbg");
|
||||||
|
if (defined($ENV{VERILATOR_ROOT})) {
|
||||||
|
my $dir = $ENV{VERILATOR_ROOT};
|
||||||
|
if (-x "$dir/bin/$basename"
|
||||||
|
|| -x "$dir/bin/$basename.exe") { # From a "make install" into VERILATOR_ROOT
|
||||||
|
$bin = "$dir/bin/$basename";
|
||||||
|
} else {
|
||||||
|
$bin = "$dir/$basename"; # From pointing to kit directory
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (-x "$RealBin/$basename"
|
||||||
|
|| -x "$RealBin/$basename.exe") {
|
||||||
|
$bin = "$RealBin/$basename"; # From path/to/verilator with verilator_bin installed
|
||||||
|
} else {
|
||||||
|
$bin = $basename; # Find in PATH
|
||||||
|
}
|
||||||
|
# Note we don't look under bin/$basename which would be right if running
|
||||||
|
# in the kit dir. Running that would likely break, since
|
||||||
|
# VERILATOR_ROOT wouldn't be set and Verilator won't find internal files.
|
||||||
|
}
|
||||||
|
return $bin;
|
||||||
|
}
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
#######################################################################
|
||||||
|
# Utilities
|
||||||
|
|
||||||
|
sub run {
|
||||||
|
# Run command, check errors
|
||||||
|
my $command = shift;
|
||||||
|
$! = undef; # Cleanup -x
|
||||||
|
print "\t$command\n" if $Debug>=3;
|
||||||
|
system($command);
|
||||||
|
my $status = $?;
|
||||||
|
if ($status) {
|
||||||
|
if ($! =~ /no such file or directory/i) {
|
||||||
|
warn "%Error: verilator_coverage: Misinstalled, or VERILATOR_ROOT might need to be in environment\n";
|
||||||
|
}
|
||||||
|
if ($Debug) { # For easy rerunning
|
||||||
|
warn "%Error: export VERILATOR_ROOT=".($ENV{VERILATOR_ROOT}||"")."\n";
|
||||||
|
warn "%Error: $command\n";
|
||||||
|
}
|
||||||
|
if ($status & 127) {
|
||||||
|
if (($status & 127) == 8 || ($status & 127) == 11) { # SIGFPA or SIGSEGV
|
||||||
|
warn "%Error: Verilator_coverage internal fault, sorry.\n" if !$Debug;
|
||||||
|
} elsif (($status & 127) == 6) { # SIGABRT
|
||||||
|
warn "%Error: Verilator_coverage aborted.\n" if !$Debug;
|
||||||
|
} else {
|
||||||
|
warn "%Error: Verilator_coverage threw signal $status.\n" if !$Debug;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($status != 256 || $Debug) { # i.e. not normal exit(1)
|
||||||
|
warn "%Error: Command Failed $command\n";
|
||||||
|
}
|
||||||
|
exit $! if $!; # errno
|
||||||
|
exit $? >> 8 if $? >> 8; # child exit status
|
||||||
|
exit 255; # last resort
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
#######################################################################
|
||||||
|
package main;
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
verilator_coverage - Verilator coverage analyzer
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
verilator_coverage --help
|
||||||
|
verilator_coverage --version
|
||||||
|
|
||||||
|
verilator_coverage --annotate <obj>
|
||||||
|
|
||||||
|
verilator_coverage -write merged.dat -read <datafiles>...
|
||||||
|
|
||||||
|
Verilator_coverage processes Verilator coverage reports.
|
||||||
|
|
||||||
|
With --anotate, it reads the specified data file and generates annotated
|
||||||
|
source code with coverage metrics annotated. If multiple coverage points
|
||||||
|
exist on the same line, additional lines will be inserted to report the
|
||||||
|
additional points.
|
||||||
|
|
||||||
|
Additional Verilog-standard arguments specify the search paths necessary to
|
||||||
|
find the source code that the coverage analysis was performed on.
|
||||||
|
|
||||||
|
To get correct coverage percentages, you may wish to read logs/coverage.dat
|
||||||
|
into Emacs and do a M-x keep-lines to include only those statistics of
|
||||||
|
interest.
|
||||||
|
|
||||||
|
For Verilog conditions that should never occur, you should add a $stop
|
||||||
|
statement. This will remove the coverage during the next build.
|
||||||
|
|
||||||
|
=head1 ARGUMENTS
|
||||||
|
|
||||||
|
=over 4
|
||||||
|
|
||||||
|
=item I<filename>
|
||||||
|
|
||||||
|
Specify input data file, may be repeated to read multiple inputs. If no
|
||||||
|
data file is specified, by default coverage.dat is read.
|
||||||
|
|
||||||
|
=item --annotate I<output_directory>
|
||||||
|
|
||||||
|
Sprcifies the directory name that source files with annotated coverage data
|
||||||
|
should be written to.
|
||||||
|
|
||||||
|
=item --annotate-all
|
||||||
|
|
||||||
|
Specifies all files should be shown. By default, only those source files
|
||||||
|
which have low coverage are written to the output directory.
|
||||||
|
|
||||||
|
=item --annotate-min I<count>
|
||||||
|
|
||||||
|
Specifies the minimum occurrence count that should be flagged if the
|
||||||
|
coverage point does not include a specified threshold. Defaults to 10.
|
||||||
|
|
||||||
|
=item --help
|
||||||
|
|
||||||
|
Displays this message and program version and exits.
|
||||||
|
|
||||||
|
=item --rank
|
||||||
|
|
||||||
|
Print an experimental report listing the relative importance of each test
|
||||||
|
in covering all of the coverage points. The report shows "Covered" which
|
||||||
|
indicates the number of points that test covers; a test is considered to
|
||||||
|
cover a point if it has a bucket count of at least 1. The "rank" column has
|
||||||
|
a higher number t indicate the test is more important, and rank 0 means the
|
||||||
|
test does not need to be run to cover the points. "RankPts" indicates the
|
||||||
|
number of coverage points this test will contribute to overall coverage if
|
||||||
|
all tests are run in the order of highest to lowest rank.
|
||||||
|
|
||||||
|
=item --unlink
|
||||||
|
|
||||||
|
When using --write to combine coverage data, unlink all input files after
|
||||||
|
the output has been created.
|
||||||
|
|
||||||
|
=item --version
|
||||||
|
|
||||||
|
Displays program version and exits.
|
||||||
|
|
||||||
|
=item --write I<filename>
|
||||||
|
|
||||||
|
Specifies the aggregate coverage results, summed across all the files,
|
||||||
|
should be written to the given filename. This is useful in scripts to
|
||||||
|
combine many sequential runs into one master coverage file.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 VERILOG ARGUMENTS
|
||||||
|
|
||||||
|
The following arguments are compatible with GCC, VCS and most Verilog
|
||||||
|
programs.
|
||||||
|
|
||||||
|
=over 4
|
||||||
|
|
||||||
|
=item +libext+I<ext>+I<ext>...
|
||||||
|
|
||||||
|
Defines the extensions for Verilog files.
|
||||||
|
|
||||||
|
=item +define+I<var>+I<value>
|
||||||
|
=item -DI<var>=I<value>
|
||||||
|
|
||||||
|
Defines the given variable.
|
||||||
|
|
||||||
|
=item +incdir+I<dir>
|
||||||
|
=item -II<dir>
|
||||||
|
|
||||||
|
Specifies a directory for finding include files.
|
||||||
|
|
||||||
|
=item -f I<file>
|
||||||
|
|
||||||
|
Specifies a file containing additional command line arguments.
|
||||||
|
|
||||||
|
=item -y I<dir>
|
||||||
|
|
||||||
|
Specifies a module search directory.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 DISTRIBUTION
|
||||||
|
|
||||||
|
The latest version is available from L<https://verilator.org>.
|
||||||
|
|
||||||
|
Copyright 2003-2019 by Wilson Snyder. Verilator is free software; you can
|
||||||
|
redistribute it and/or modify the Verilator internals under the terms of
|
||||||
|
either the GNU Lesser General Public License Version 3 or the Perl Artistic
|
||||||
|
License Version 2.0.
|
||||||
|
|
||||||
|
=head1 AUTHORS
|
||||||
|
|
||||||
|
Wilson Snyder <[email protected]>
|
||||||
|
|
||||||
|
=head1 SEE ALSO
|
||||||
|
|
||||||
|
C<verilator>
|
||||||
|
|
||||||
|
L<verilator_coverage --help> which is the source for this document.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
######################################################################
|
||||||
+109
-53
@@ -1,19 +1,7 @@
|
|||||||
: # -*-Mode: perl;-*- use perl, wherever it is
|
: # -*-Mode: perl;-*- use perl, wherever it is
|
||||||
eval 'exec perl -wS $0 ${1+"$@"}'
|
eval 'exec perl -wS $0 ${1+"$@"}'
|
||||||
if 0;
|
if 0;
|
||||||
# $Id$
|
# See copyright, etc in below POD section.
|
||||||
######################################################################
|
|
||||||
#
|
|
||||||
# Copyright 2005-2007 by Wilson Snyder <[email protected]>. This
|
|
||||||
# program is free software; you can redistribute it and/or modify it under
|
|
||||||
# the terms of either the GNU Lesser General Public License or the Perl
|
|
||||||
# Artistic License.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|
||||||
require 5.006_001;
|
require 5.006_001;
|
||||||
@@ -22,10 +10,23 @@ use Getopt::Long;
|
|||||||
use IO::File;
|
use IO::File;
|
||||||
use Pod::Usage;
|
use Pod::Usage;
|
||||||
use strict;
|
use strict;
|
||||||
use vars qw ($Debug);
|
use vars qw($Debug);
|
||||||
|
|
||||||
#======================================================================
|
#======================================================================
|
||||||
|
|
||||||
|
# Old version 1 dump nodes with no dtypep's
|
||||||
|
our %Ver1_Non_Dtyped = map {$_ => 1} qw(
|
||||||
|
ACTIVE ALWAYS ALWAYSPOST ALWAYSPUBLIC ATTROF BEGIN BREAK CASE CASEITEM
|
||||||
|
CCALL CELL CELLINLINE CFILE CFUNC CHANGEDET CLOCKING COMMENT CONTINUE
|
||||||
|
COVERDECL COVERINC COVERTOGGLE CRETURN CSTMT DEFPARAM DISABLE DISPLAY DOT
|
||||||
|
DPIEXPORT FCLOSE FFLUSH FINAL FINISH FOPEN GENCASE GENERATE GENFOR GENIF
|
||||||
|
IF IMPLICIT INITARRAY INITIAL JUMPGO JUMPLABEL MODULE NETLIST
|
||||||
|
NOTFOUNDMODULE PACKAGE PACKAGEIMPORT PARSEREF PIN PORT PRAGMA PRIMITIVE
|
||||||
|
PSLASSERT PSLCOVER PSLDEFCLOCK PULL RANGE READMEM REPEAT RETURN SCCTOR
|
||||||
|
SCDTOR SCHDR SCIMP SCIMPHDR SCINT SCOPE SELBIT SELEXTRACT SELMINUS
|
||||||
|
SELPLUS SENGATE SENITEM SENTREE SFORMAT SFORMATF STOP SYSIGNORE SYSTEMT
|
||||||
|
TASK TASKREF TEXT TOPSCOPE TYPEDEFFWD TYPETABLE UCSTMT UDPTABLE
|
||||||
|
UDPTABLELINE UNTILSTABLE VASSERT WHILE );
|
||||||
|
|
||||||
#======================================================================
|
#======================================================================
|
||||||
# main
|
# main
|
||||||
@@ -33,14 +34,16 @@ use vars qw ($Debug);
|
|||||||
$Debug = 0;
|
$Debug = 0;
|
||||||
my $Opt_A;
|
my $Opt_A;
|
||||||
my $Opt_B;
|
my $Opt_B;
|
||||||
|
my $Opt_Lineno = 1;
|
||||||
autoflush STDOUT 1;
|
autoflush STDOUT 1;
|
||||||
autoflush STDERR 1;
|
autoflush STDERR 1;
|
||||||
Getopt::Long::config ("no_auto_abbrev");
|
Getopt::Long::config("no_auto_abbrev");
|
||||||
if (! GetOptions (
|
if (! GetOptions(
|
||||||
"help" => \&usage,
|
"help" => \&usage,
|
||||||
"debug" => \&debug,
|
"debug" => \&debug,
|
||||||
"<>" => \¶meter,
|
"<>" => \¶meter,
|
||||||
)) {
|
"lineno!" => \$Opt_Lineno,
|
||||||
|
)) {
|
||||||
die "%Error: Bad usage, try 'verilator_difftree --help'\n";
|
die "%Error: Bad usage, try 'verilator_difftree --help'\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,9 +54,9 @@ defined $Opt_B or die "%Error: No new diff filename\n";
|
|||||||
-e $Opt_B or die "%Error: No new diff filename found: $Opt_B\n";
|
-e $Opt_B or die "%Error: No new diff filename found: $Opt_B\n";
|
||||||
|
|
||||||
if (-d $Opt_A && -d $Opt_B) {
|
if (-d $Opt_A && -d $Opt_B) {
|
||||||
diff_dir ($Opt_A, $Opt_B);
|
diff_dir($Opt_A, $Opt_B);
|
||||||
} elsif (-f $Opt_A && -f $Opt_B) {
|
} elsif (-f $Opt_A && -f $Opt_B) {
|
||||||
diff_file ($Opt_A, $Opt_B);
|
diff_file($Opt_A, $Opt_B);
|
||||||
} else {
|
} else {
|
||||||
die "%Error: Mix of files and dirs\n";
|
die "%Error: Mix of files and dirs\n";
|
||||||
}
|
}
|
||||||
@@ -65,48 +68,98 @@ sub diff_dir {
|
|||||||
my %files;
|
my %files;
|
||||||
|
|
||||||
foreach my $fn (glob("$a/*.tree")) {
|
foreach my $fn (glob("$a/*.tree")) {
|
||||||
(my $base = $fn) =~ s!.*/!!;
|
(my $base = $fn) =~ s!.*/!!;
|
||||||
$files{$base}{a} = $fn;
|
$files{$base}{a} = $fn;
|
||||||
}
|
}
|
||||||
foreach my $fn (glob("$b/*.tree")) {
|
foreach my $fn (glob("$b/*.tree")) {
|
||||||
(my $base = $fn) =~ s!.*/!!;
|
(my $base = $fn) =~ s!.*/!!;
|
||||||
$files{$base}{b} = $fn;
|
$files{$base}{b} = $fn;
|
||||||
}
|
}
|
||||||
|
my $any;
|
||||||
foreach my $base (sort (keys %files)) {
|
foreach my $base (sort (keys %files)) {
|
||||||
my $a = $files{$base}{a};
|
my $a = $files{$base}{a};
|
||||||
my $b = $files{$base}{b};
|
my $b = $files{$base}{b};
|
||||||
next if !$a || !$b;
|
next if !$a || !$b;
|
||||||
print "="x70,"\n";
|
print "="x70,"\n";
|
||||||
print "= $a <-> $b\n";
|
print "= $a <-> $b\n";
|
||||||
diff_file($a,$b);
|
diff_file($a,$b);
|
||||||
|
$any = 1;
|
||||||
}
|
}
|
||||||
|
$any or warn("%Warning: No .tree files found that have similar base names:\n "
|
||||||
|
.join("\n ", sort keys %files),"\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
sub diff_file {
|
sub diff_file {
|
||||||
my $a = shift;
|
my $a = shift;
|
||||||
my $b = shift;
|
my $b = shift;
|
||||||
# Compare the two tree files
|
# Compare the two tree files
|
||||||
my $tmp_a = "/tmp/$$.a";
|
(my $short_a = $a) =~ s/[^a-zA-Z0-9.]+/_/g;
|
||||||
my $tmp_b = "/tmp/$$.b";
|
(my $short_b = $b) =~ s/[^a-zA-Z0-9.]+/_/g;
|
||||||
|
my $tmp_a = "/tmp/${$}_${short_a}.a";
|
||||||
|
my $tmp_b = "/tmp/${$}_${short_b}.b";
|
||||||
|
|
||||||
filter ($a, $tmp_a);
|
my $vera = version_from($a);
|
||||||
filter ($b, $tmp_b);
|
my $verb = version_from($b);
|
||||||
system("diff $tmp_a $tmp_b");
|
my $verCvt = (($vera < 0x3900 && $verb >= 0x3900)
|
||||||
|
|| ($vera >= 0x3900 && $verb < 0x3900));
|
||||||
|
|
||||||
|
filter($a, $tmp_a, $verCvt);
|
||||||
|
filter($b, $tmp_b, $verCvt);
|
||||||
|
system("diff -u $tmp_a $tmp_b");
|
||||||
unlink $tmp_a;
|
unlink $tmp_a;
|
||||||
unlink $tmp_b;
|
unlink $tmp_b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub version_from {
|
||||||
|
my $fn = shift;
|
||||||
|
# Return dump format
|
||||||
|
my $f1 = IO::File->new ($fn) or die "%Error: $! $fn,";
|
||||||
|
while (defined (my $line=$f1->getline())) {
|
||||||
|
last if $. > 10;
|
||||||
|
return hex $1 if $line =~ /\(format (0x[0-9.]+)\)/;
|
||||||
|
}
|
||||||
|
return 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
sub filter {
|
sub filter {
|
||||||
my $fn1 = shift;
|
my $fn1 = shift;
|
||||||
my $fn2 = shift;
|
my $fn2 = shift;
|
||||||
|
my $verCvt = shift;
|
||||||
# Remove hex numbers before diffing
|
# Remove hex numbers before diffing
|
||||||
my $f1 = IO::File->new ($fn1) or die "%Error: $! $fn1,";
|
my $f1 = IO::File->new ($fn1) or die "%Error: $! $fn1,";
|
||||||
my $f2 = IO::File->new ($fn2,"w") or die "%Error: $! $fn2,";
|
my $f2 = IO::File->new ($fn2,"w") or die "%Error: $! $fn2,";
|
||||||
while (defined (my $line=$f1->getline())) {
|
while (defined (my $line=$f1->getline())) {
|
||||||
next if $line =~ / This=/;
|
same_line:
|
||||||
$line =~ s/0x[a-f0-9]+/0x/g;
|
next if $line =~ / This=/;
|
||||||
$line =~ s/<e[0-9]+\#?>/<e>/g;
|
$line =~ s/0x[a-f0-9]+/0x/g;
|
||||||
print $f2 $line;
|
$line =~ s/<e[0-9]+\#?>/<e>/g;
|
||||||
|
$line =~ s/{[a-z]*\d+}/{}/g if !$Opt_Lineno;
|
||||||
|
if ($verCvt) {
|
||||||
|
next if $line =~ /^ NETLIST/;
|
||||||
|
$line =~ s!\@dt=0x\(G?/?([^)]+)\)!$1!g; # NEW: @dt -> OLD: non @dt format
|
||||||
|
# # Below Ver1_Non_Dtyped may replace above further
|
||||||
|
if ($line =~ /: ([A-Z]+) /) {
|
||||||
|
my $type = $1;
|
||||||
|
next if $type =~ 'DTYPE';
|
||||||
|
if ($type eq 'TYPETABLE' || $type eq 'RANGE') {
|
||||||
|
$line =~ /^(\s+\S+:) /; my $prefix = $1;
|
||||||
|
while (defined ($line=$f1->getline())) {
|
||||||
|
next if $line =~ /^\s+[a-z]/; # Table body
|
||||||
|
next if $line =~ /^${prefix}[0-9]:/;
|
||||||
|
goto same_line;
|
||||||
|
}
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
if ($Ver1_Non_Dtyped{$type}) {
|
||||||
|
$line =~ s! w[0-9]+!!g;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$line =~ s!\@dt=0$!NoW!g; # NEW: dt=null -> common format
|
||||||
|
$line =~ s!\@dt=0 !NoW !g; # NEW: dt=null -> common format
|
||||||
|
$line =~ s! s?w0$! NoW!g; # OLD: no width -> common format
|
||||||
|
$line =~ s! s?w0 ! NoW !g; # OLD: no width -> common format
|
||||||
|
}
|
||||||
|
print $f2 $line;
|
||||||
}
|
}
|
||||||
$f1->close;
|
$f1->close;
|
||||||
$f2->close;
|
$f2->close;
|
||||||
@@ -115,9 +168,8 @@ sub filter {
|
|||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
|
|
||||||
sub usage {
|
sub usage {
|
||||||
print '$Id$ ', "\n";
|
pod2usage(-verbose=>2, -exitval=>0, -output=>\*STDOUT);
|
||||||
pod2usage(-verbose=>2, -exitval => 2);
|
exit(1); # Unreachable
|
||||||
exit (1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub debug {
|
sub debug {
|
||||||
@@ -127,11 +179,11 @@ sub debug {
|
|||||||
sub parameter {
|
sub parameter {
|
||||||
my $param = shift;
|
my $param = shift;
|
||||||
if (!defined $Opt_A) {
|
if (!defined $Opt_A) {
|
||||||
$Opt_A = $param;
|
$Opt_A = $param;
|
||||||
} elsif (!defined $Opt_B) {
|
} elsif (!defined $Opt_B) {
|
||||||
$Opt_B = $param;
|
$Opt_B = $param;
|
||||||
} else {
|
} else {
|
||||||
die "%Error: Unknown parameter: $param\n";
|
die "%Error: Unknown parameter: $param\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -174,15 +226,19 @@ directories, ignoring irrelevant pointer differences.
|
|||||||
|
|
||||||
Displays this message and program version and exits.
|
Displays this message and program version and exits.
|
||||||
|
|
||||||
|
=item --nolineno
|
||||||
|
|
||||||
|
Do not show differences in line numbering.
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head1 DISTRIBUTION
|
=head1 DISTRIBUTION
|
||||||
|
|
||||||
The latest version is available from L<http://www.veripool.com/>.
|
The latest version is available from L<https://verilator.org>.
|
||||||
|
|
||||||
Copyright 2005-2007 by Wilson Snyder. This package is free software; you
|
Copyright 2005-2019 by Wilson Snyder. This package is free software; you can
|
||||||
can redistribute it and/or modify it under the terms of either the GNU
|
redistribute it and/or modify it under the terms of either the GNU Lesser
|
||||||
Lesser General Public License or the Perl Artistic License.
|
General Public License Version 3 or the Perl Artistic License Version 2.0.
|
||||||
|
|
||||||
=head1 AUTHORS
|
=head1 AUTHORS
|
||||||
|
|
||||||
@@ -196,5 +252,5 @@ C<verilator>
|
|||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
### Local Variables:
|
### Local Variables:
|
||||||
### compile-command: "$V4/bin/verilator_difftree $V4/test_c/obj_dir/V*_03_*.tree $V4N/test_c/obj_dir/V*_03_*.tree"
|
### compile-command: "$V4/bin/verilator_difftree {$V4D,$V4}/test_regress/obj_dir/t_EXAMPLE/V*_03_*.tree"
|
||||||
### End:
|
### End:
|
||||||
|
|||||||
Executable
+560
@@ -0,0 +1,560 @@
|
|||||||
|
: # -*-Mode: perl;-*- use perl, wherever it is
|
||||||
|
eval 'exec perl -wS $0 ${1+"$@"}'
|
||||||
|
if 0;
|
||||||
|
# See copyright, etc in below POD section.
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Getopt::Long;
|
||||||
|
use IO::File;
|
||||||
|
use Pod::Usage;
|
||||||
|
use vars qw($Debug);
|
||||||
|
|
||||||
|
$Debug = 0;
|
||||||
|
my $Opt_File;
|
||||||
|
my $Opt_Time_Per_Char = 0; # rdtsc ticks per char in gantt chart, 0=auto
|
||||||
|
my $opt_vcd = "profile_threads.vcd";
|
||||||
|
|
||||||
|
our %Threads;
|
||||||
|
our %Mtasks;
|
||||||
|
our %Global;
|
||||||
|
|
||||||
|
autoflush STDOUT 1;
|
||||||
|
autoflush STDERR 1;
|
||||||
|
Getopt::Long::config("no_auto_abbrev");
|
||||||
|
if (! GetOptions(
|
||||||
|
"help" => \&usage,
|
||||||
|
"scale=i" => \$Opt_Time_Per_Char,
|
||||||
|
"debug" => sub { $Debug = 1; },
|
||||||
|
"vcd=s" => \$opt_vcd,
|
||||||
|
"no-vcd!" => sub { $opt_vcd = undef; },
|
||||||
|
"<>" => \¶meter,
|
||||||
|
)) {
|
||||||
|
die "%Error: Bad usage, try 'verilator_gantt --help'\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
$Opt_File = "profile_threads.dat" if !defined $Opt_File;
|
||||||
|
|
||||||
|
process($Opt_File);
|
||||||
|
write_vcd($opt_vcd) if defined $opt_vcd;
|
||||||
|
exit(0);
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
|
||||||
|
sub usage {
|
||||||
|
pod2usage(-verbose=>2, -exitval=>0, -output=>\*STDOUT);
|
||||||
|
exit(1); # Unreachable
|
||||||
|
}
|
||||||
|
|
||||||
|
sub parameter {
|
||||||
|
my $param = shift;
|
||||||
|
if (!defined $Opt_File) {
|
||||||
|
$Opt_File = $param;
|
||||||
|
} else {
|
||||||
|
die "%Error: Unknown parameter: $param\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
|
||||||
|
sub process {
|
||||||
|
my $filename = shift;
|
||||||
|
|
||||||
|
read_data($filename);
|
||||||
|
report();
|
||||||
|
}
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
|
||||||
|
sub read_data {
|
||||||
|
my $filename = shift;
|
||||||
|
|
||||||
|
%Global = (rdtsc_cycle_time => 0);
|
||||||
|
|
||||||
|
my $fh = IO::File->new ($filename) or die "%Error: $! $filename,";
|
||||||
|
while (my $line = $fh->getline) {
|
||||||
|
if ($line =~ m/VLPROF mtask\s(\d+)\sstart\s(\d+)\send\s(\d+)\selapsed\s(\d+)\spredict_time\s(\d+)\scpu\s(\d+)\son thread (\d+)/) {
|
||||||
|
my $mtask = $1;
|
||||||
|
my $start = $2;
|
||||||
|
my $end = $3;
|
||||||
|
my $elapsed_time = $4;
|
||||||
|
my $predict_time = $5;
|
||||||
|
my $cpu = $6;
|
||||||
|
my $thread = $7;
|
||||||
|
$Threads{$thread}{$start}{mtask} = $mtask;
|
||||||
|
$Threads{$thread}{$start}{end} = $end;
|
||||||
|
$Threads{$thread}{$start}{cpu} = $cpu;
|
||||||
|
|
||||||
|
if (!exists $Mtasks{$mtask}{elapsed}) {
|
||||||
|
$Mtasks{$mtask}{elapsed} = 0;
|
||||||
|
}
|
||||||
|
$Mtasks{$mtask}{elapsed} += $elapsed_time;
|
||||||
|
$Mtasks{$mtask}{predict} = $predict_time;
|
||||||
|
$Mtasks{$mtask}{end} = max($Mtasks{$mtask}{end}, $end);
|
||||||
|
}
|
||||||
|
elsif ($line =~ /^VLPROFTHREAD/) {}
|
||||||
|
elsif ($line =~ m/VLPROF arg\s+(\S+)\+([0-9.])\s*$/
|
||||||
|
|| $line =~ m/VLPROF arg\s+(\S+)\s+([0-9.])\s*$/) {
|
||||||
|
$Global{args}{$1} = $2;
|
||||||
|
}
|
||||||
|
elsif ($line =~ m/VLPROF stat\s+(\S+)\s+([0-9.]+)/) {
|
||||||
|
$Global{stats}{$1} = $2;
|
||||||
|
}
|
||||||
|
elsif ($line =~ /^#/) {}
|
||||||
|
elsif ($Debug) {
|
||||||
|
chomp $line;
|
||||||
|
print "Unk: $line\n";
|
||||||
|
}
|
||||||
|
# TODO -- this is parsing text printed by a client.
|
||||||
|
# Really, verilator proper should generate this
|
||||||
|
# if it's useful...
|
||||||
|
if ($line =~ m/rdtsc time = (\d+) ticks/) {
|
||||||
|
$Global{rdtsc_cycle_time} = $1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub report {
|
||||||
|
print "Verilator Gantt report\n";
|
||||||
|
|
||||||
|
print "\nArgument settings:\n";
|
||||||
|
foreach my $arg (sort keys %{$Global{args}}) {
|
||||||
|
my $plus = ($arg =~ /^\+/) ? "+" : " ";
|
||||||
|
printf " %s%s%d\n", $arg, $plus, $Global{args}{$arg};
|
||||||
|
}
|
||||||
|
|
||||||
|
my $nthreads = scalar keys %Threads;
|
||||||
|
$Global{cpus}{cpu_time} = {};
|
||||||
|
foreach my $thread (keys %Threads) {
|
||||||
|
# Make potentially multiple characters per column
|
||||||
|
foreach my $start (keys %{$Threads{$thread}}) {
|
||||||
|
my $cpu = $Threads{$thread}{$start}{cpu};
|
||||||
|
my $elapsed = $Threads{$thread}{$start}{end} - $start;
|
||||||
|
$Global{cpus}{cpu_time}{$cpu} += $elapsed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my $mt_mtask_time = 0;
|
||||||
|
my $long_mtask_time = 0;
|
||||||
|
my $last_end = 0;
|
||||||
|
foreach my $mtask (keys %Mtasks) {
|
||||||
|
$mt_mtask_time += $Mtasks{$mtask}{elapsed};
|
||||||
|
$last_end = max($last_end, $Mtasks{$mtask}{end});
|
||||||
|
$long_mtask_time = max($long_mtask_time, $Mtasks{$mtask}{elapsed});
|
||||||
|
}
|
||||||
|
$Global{last_end} = $last_end;
|
||||||
|
|
||||||
|
report_graph();
|
||||||
|
|
||||||
|
# If we know cycle time in the same (rdtsc) units,
|
||||||
|
# this will give us an actual utilization number,
|
||||||
|
# (how effectively we keep the cores busy.)
|
||||||
|
#
|
||||||
|
# It also gives us a number we can compare against
|
||||||
|
# serial mode, to estimate the overhead of data sharing,
|
||||||
|
# which will show up in the total elapsed time. (Overhead
|
||||||
|
# of synchronization and scheduling should not.)
|
||||||
|
print "\nAnalysis:\n";
|
||||||
|
printf " Total threads = %d\n", $nthreads;
|
||||||
|
printf " Total mtasks = %d\n", scalar(keys %Mtasks);
|
||||||
|
printf " Total cpus used = %d\n", scalar(keys %{$Global{cpus}});
|
||||||
|
printf " Total yields = %d\n", $Global{stats}{yields};
|
||||||
|
printf " Total eval time = %d rdtsc ticks\n", $Global{last_end};
|
||||||
|
printf " Longest mtask time = %d rdtsc ticks\n", $long_mtask_time;
|
||||||
|
printf " All-thread mtask time = %d rdtsc ticks\n", $mt_mtask_time;
|
||||||
|
my $long_efficiency = $long_mtask_time/($Global{last_end});
|
||||||
|
printf " Longest-thread efficiency = %0.1f%%\n", $long_efficiency*100;
|
||||||
|
my $mt_efficiency = $mt_mtask_time/($Global{last_end}*$nthreads);
|
||||||
|
printf " All-thread efficiency = %0.1f%%\n", $mt_efficiency*100;
|
||||||
|
printf " All-thread speedup = %0.1f\n", $mt_efficiency*$nthreads;
|
||||||
|
if ($Global{rdtsc_cycle_time} > 0) {
|
||||||
|
my $ut = $mt_mtask_time / $Global{rdtsc_cycle_time};
|
||||||
|
print "tot_mtask_cpu=$mt_mtask_time cyc=$Global{rdtsc_cycle_time} ut=$ut\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
my @p2e_ratios;
|
||||||
|
my $min_p2e = 1000000;
|
||||||
|
my $min_mtask;
|
||||||
|
my $max_p2e = -1000000;
|
||||||
|
my $max_mtask;
|
||||||
|
foreach my $mtask (sort keys %Mtasks) {
|
||||||
|
if ($Mtasks{$mtask}{elapsed} > 0) {
|
||||||
|
if ($Mtasks{$mtask}{predict} == 0) {
|
||||||
|
$Mtasks{$mtask}{predict} = 1; # don't log(0) below
|
||||||
|
}
|
||||||
|
my $p2e_ratio = log( $Mtasks{$mtask}{predict} / $Mtasks{$mtask}{elapsed} );
|
||||||
|
#print "log(p2e $mtask) = $p2e_ratio (predict $Mtasks{$mtask}{predict}, elapsed $Mtasks{$mtask}{elapsed})\n";
|
||||||
|
push @p2e_ratios, $p2e_ratio;
|
||||||
|
|
||||||
|
if ($p2e_ratio > $max_p2e) {
|
||||||
|
$max_p2e = $p2e_ratio;
|
||||||
|
$max_mtask = $mtask;
|
||||||
|
}
|
||||||
|
if ($p2e_ratio < $min_p2e) {
|
||||||
|
$min_p2e = $p2e_ratio;
|
||||||
|
$min_mtask = $mtask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print "\nStatistics:\n";
|
||||||
|
print " min log(p2e) = $min_p2e from mtask $min_mtask (predict $Mtasks{$min_mtask}{predict}, elapsed $Mtasks{$min_mtask}{elapsed})\n";
|
||||||
|
print " max log(p2e) = $max_p2e from mtask $max_mtask (predict $Mtasks{$max_mtask}{predict}, elapsed $Mtasks{$max_mtask}{elapsed})\n";
|
||||||
|
|
||||||
|
my $stddev = stddev(\@p2e_ratios);
|
||||||
|
my $mean = mean(\@p2e_ratios);
|
||||||
|
print " mean = " . ($mean) . "\n";
|
||||||
|
print " stddev = " . ($stddev) . "\n";
|
||||||
|
print " e ^ stddev = " . exp($stddev). "\n";
|
||||||
|
print "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub report_graph {
|
||||||
|
my $time_per = $Opt_Time_Per_Char;
|
||||||
|
if ($time_per == 0) {
|
||||||
|
$time_per = ($Global{last_end} / 40); # Start with 40 columns
|
||||||
|
while ($time_per > 10) {
|
||||||
|
my ($graph, $conflicts) = _make_graph($time_per);
|
||||||
|
last if !$conflicts;
|
||||||
|
$time_per = int($time_per/2);
|
||||||
|
}
|
||||||
|
# One more step so we can fit more labels
|
||||||
|
$time_per = int($time_per/2);
|
||||||
|
}
|
||||||
|
|
||||||
|
my ($graph, $conflicts) = _make_graph($time_per);
|
||||||
|
|
||||||
|
print "\nThread gantt graph:\n";
|
||||||
|
print " Legend: One character width = $time_per rdtsc ticks\n";
|
||||||
|
print " Legend: '&' = multiple mtasks in this period (character width)\n";
|
||||||
|
|
||||||
|
my $scale = " <-".$Global{last_end}." rdtsc total";
|
||||||
|
for (my $col = length($scale); # -2 for '->' below
|
||||||
|
$col < ($Global{last_end}/$time_per); ++$col) {
|
||||||
|
$scale .= "-";
|
||||||
|
}
|
||||||
|
print " $scale->\n";
|
||||||
|
|
||||||
|
foreach my $thread (sort keys %{$graph}) {
|
||||||
|
print " t: ";
|
||||||
|
_print_graph_line($graph->{$thread}, '');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _make_graph {
|
||||||
|
my $time_per = shift;
|
||||||
|
|
||||||
|
my $graph = {}; # {thread}{column}{char=>'x' or chars=>#}
|
||||||
|
my $conflicts = 0;
|
||||||
|
foreach my $thread (keys %Threads) {
|
||||||
|
# Make potentially multiple characters per column
|
||||||
|
foreach my $start (sort {$a <=> $b} keys %{$Threads{$thread}}) {
|
||||||
|
my $end = $Threads{$thread}{$start}{end};
|
||||||
|
my $mtask = $Threads{$thread}{$start}{mtask};
|
||||||
|
my $cpu = $Threads{$thread}{$start}{cpu};
|
||||||
|
|
||||||
|
my $startcol = _time_col($time_per, $start);
|
||||||
|
my $endcol = _time_col($time_per, $end);
|
||||||
|
|
||||||
|
my $label = "[";
|
||||||
|
$label .= "$cpu"; # Maybe make optional in future
|
||||||
|
my $width = $endcol - $startcol + 1;
|
||||||
|
while (length($label) < ($width-1)) { # -1 for ']'
|
||||||
|
$label .= "-";
|
||||||
|
}
|
||||||
|
$label .= "]";
|
||||||
|
$graph->{$thread}[$startcol]{char} .= $label;
|
||||||
|
}
|
||||||
|
if ($Debug) {
|
||||||
|
print "# Multicol: "; _print_graph_line($graph->{$thread}, '|');
|
||||||
|
}
|
||||||
|
# Expand line to one char per column
|
||||||
|
for (my $col = 0; $col <= $#{$graph->{$thread}}; ++$col) {
|
||||||
|
if (my $chars = $graph->{$thread}[$col]{char}) {
|
||||||
|
my $ok = 1;
|
||||||
|
for (my $coladd = 1; $coladd<length($chars); ++$coladd) {
|
||||||
|
if ($graph->{$thread}[$col + $coladd]{char}) {
|
||||||
|
$ok = 0; last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!$ok) {
|
||||||
|
if ($chars =~ /\[.*\[/) { # Two begins or more
|
||||||
|
$conflicts++;
|
||||||
|
$graph->{$thread}[$col]{char} = "&";
|
||||||
|
} else {
|
||||||
|
$graph->{$thread}[$col]{char} = "[";
|
||||||
|
}
|
||||||
|
for (my $coladd = 1; $coladd<length($chars); ++$coladd) {
|
||||||
|
if ($graph->{$thread}[$col + $coladd]{char}) {
|
||||||
|
last;
|
||||||
|
} else {
|
||||||
|
$graph->{$thread}[$col + $coladd]{char} = 'x';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
my $coladd = 0;
|
||||||
|
foreach my $char (split //, $chars) {
|
||||||
|
$graph->{$thread}[$col+$coladd]{char} = $char;
|
||||||
|
++$coladd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($Debug) {
|
||||||
|
print "# Singlcol: "; _print_graph_line($graph->{$thread}, '|');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print "# Conflicts $conflicts\n" if $Debug;
|
||||||
|
return ($graph, $conflicts);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _print_graph_line {
|
||||||
|
my $graph_thread = shift;
|
||||||
|
my $sep = shift;
|
||||||
|
for (my $col = 0; $col <= $#{$graph_thread}; ++$col) {
|
||||||
|
my $c = $graph_thread->[$col]{char}; $c=' ' if !defined $c;
|
||||||
|
print $c, $sep;
|
||||||
|
}
|
||||||
|
print "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _time_col {
|
||||||
|
my $time_per = shift;
|
||||||
|
my $time = shift;
|
||||||
|
return int($time/$time_per);
|
||||||
|
}
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
|
||||||
|
sub write_vcd {
|
||||||
|
my $filename = shift;
|
||||||
|
print "Writing $filename\n";
|
||||||
|
my $fh = IO::File->new(">$filename") or die "%Error: $! $filename,";
|
||||||
|
my $vcd = {values => {}, # {<time>}{<code>} = value
|
||||||
|
sigs => {}, # {<module>}{<sig}} = code
|
||||||
|
code => 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
my %parallelism;
|
||||||
|
foreach my $thread (keys %Threads) {
|
||||||
|
my $mcode = ($vcd->{sigs}{threads}{"thread${thread}_mtask"} ||= $vcd->{code}++);
|
||||||
|
foreach my $start (sort {$a <=> $b} keys %{$Threads{$thread}}) {
|
||||||
|
my $end = $Threads{$thread}{$start}{end};
|
||||||
|
my $mtask = $Threads{$thread}{$start}{mtask};
|
||||||
|
my $cpu = $Threads{$thread}{$start}{cpu};
|
||||||
|
$vcd->{values}{$start}{$mcode} = $mtask;
|
||||||
|
$vcd->{values}{$end}{$mcode} = undef;
|
||||||
|
$parallelism{$start}++;
|
||||||
|
$parallelism{$end}--;
|
||||||
|
|
||||||
|
my $ccode = $vcd->{sigs}{cpus}{"cpu${cpu}_thread"} ||= $vcd->{code}++;
|
||||||
|
$vcd->{values}{$start}{$ccode} = $thread;
|
||||||
|
$vcd->{values}{$end}{$ccode} = undef;
|
||||||
|
|
||||||
|
my $mcode = $vcd->{sigs}{mtasks}{"mtask${mtask}_cpu"} ||= $vcd->{code}++;
|
||||||
|
$vcd->{values}{$start}{$mcode} = $cpu;
|
||||||
|
$vcd->{values}{$end}{$mcode} = undef;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
my $pcode = ($vcd->{sigs}{Stats}{"parallelism"} ||= $vcd->{code}++);
|
||||||
|
my $value = 0;
|
||||||
|
foreach my $time (sort {$a<=>$b} keys %parallelism) {
|
||||||
|
$value += $parallelism{$time};
|
||||||
|
$vcd->{values}{$time}{$pcode} = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$fh->print('$version Generated by verilator_gantt $end'."\n");
|
||||||
|
$fh->print('$timescale 1ns $end'."\n");
|
||||||
|
$fh->print("\n");
|
||||||
|
|
||||||
|
my %all_codes;
|
||||||
|
$fh->print(' $scope module gantt $end'."\n");
|
||||||
|
foreach my $module (sort keys %{$vcd->{sigs}}) {
|
||||||
|
$fh->printf(' $scope module %s $end'."\n", $module);
|
||||||
|
foreach my $sig (sort keys %{$vcd->{sigs}{$module}}) {
|
||||||
|
my $code = $vcd->{sigs}{$module}{$sig};
|
||||||
|
$fh->printf(' $var wire 32 v%x %s [31:0] $end'."\n",
|
||||||
|
$code, $sig);
|
||||||
|
$all_codes{$code} = 1;
|
||||||
|
}
|
||||||
|
$fh->print(' $upscope $end'."\n");
|
||||||
|
}
|
||||||
|
$fh->print(' $upscope $end'."\n");
|
||||||
|
$fh->print('$enddefinitions $end'."\n");
|
||||||
|
$fh->print("\n");
|
||||||
|
|
||||||
|
my $first = 1;
|
||||||
|
foreach my $time (sort {$a <=> $b} keys %{$vcd->{values}}) {
|
||||||
|
if ($first) {
|
||||||
|
$first = 0;
|
||||||
|
# Start with Z for any signals without time zero data
|
||||||
|
foreach my $code (keys %all_codes) {
|
||||||
|
if (!defined $vcd->{values}{$time}{$code}) {
|
||||||
|
$vcd->{values}{$time}{$code} = undef;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$fh->printf("#%d\n", $time);
|
||||||
|
foreach my $code (sort keys %{$vcd->{values}{$time}}) {
|
||||||
|
my $value = $vcd->{values}{$time}{$code};
|
||||||
|
if (defined $value) {
|
||||||
|
$fh->printf("b%b v%x\n", $value, $code);
|
||||||
|
} else {
|
||||||
|
$fh->printf("bz v%x\n", $code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
# Similar to Statistics::Basic functions, but avoid a package dependency
|
||||||
|
|
||||||
|
sub max {
|
||||||
|
my $n = $_[0]; shift;
|
||||||
|
while (defined $_[0]) {
|
||||||
|
$n = $_[0] if !defined $n || $_[0] > $n;
|
||||||
|
shift;
|
||||||
|
}
|
||||||
|
return $n;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub mean {
|
||||||
|
my $arrayref = shift;
|
||||||
|
my $n = 0;
|
||||||
|
my $sum = 0;
|
||||||
|
foreach my $v (@$arrayref) {
|
||||||
|
$sum += $v;
|
||||||
|
$n++;
|
||||||
|
}
|
||||||
|
return undef if !$n;
|
||||||
|
return $sum/$n;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub stddev {
|
||||||
|
my $arrayref = shift;
|
||||||
|
my $n = 0;
|
||||||
|
my $sum = 0;
|
||||||
|
my $sumsq = 0;
|
||||||
|
foreach my $v (@$arrayref) {
|
||||||
|
$sum += $v;
|
||||||
|
$sumsq += $v**2;
|
||||||
|
$n++;
|
||||||
|
}
|
||||||
|
return undef if !$n;
|
||||||
|
return sqrt(($sumsq/$n) - ($sum/$n)**2);
|
||||||
|
}
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
verilator_gantt - Create Gantt chart of multi-threaded execution
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
Creates a visual representation to help analyze Verilator multithreaded
|
||||||
|
simulation performance, by showing when each macro-task starts and ends,
|
||||||
|
and showing when each thread is busy or idle.
|
||||||
|
|
||||||
|
The generated Gantt chart has time on the X-axis. Times shown are to the
|
||||||
|
scale printed, i.e. a certain about of time for each character width. The
|
||||||
|
Y-axis shows threads, each thread's execution is shown on one line. That
|
||||||
|
line shows "[" at the position in time when it executes.
|
||||||
|
|
||||||
|
Following the "[" is the cpu number the task executed on, followed by zero
|
||||||
|
or more "-" to make the width of the characters match the scaled execution
|
||||||
|
time, followed by a "]". If the scale is too small, the cpu number and
|
||||||
|
mtask number will not be printed. If the scale is very small, a "&"
|
||||||
|
indicates multiple mtasks started at that time position.
|
||||||
|
|
||||||
|
Also creates a value change dump (VCD) format dump file which may be viewed
|
||||||
|
in a waveform viewer (e.g. C<GTKWave>). See below.
|
||||||
|
|
||||||
|
=head1 USAGE
|
||||||
|
|
||||||
|
Build with --prof-threads.
|
||||||
|
|
||||||
|
Run a sim with +verilator+prof+threads+window 2.
|
||||||
|
|
||||||
|
This will create profile_threads.dat.
|
||||||
|
|
||||||
|
Then run:
|
||||||
|
|
||||||
|
verilator_gantt profile_threads.dat
|
||||||
|
|
||||||
|
The report will be printed on standard output, this also generates
|
||||||
|
profile_threads.vcd
|
||||||
|
|
||||||
|
View profile_threads.vcd in a waveform viewer.
|
||||||
|
|
||||||
|
=head1 VCD SIGNALS
|
||||||
|
|
||||||
|
In waveforms there are the following signals. Most signals the "decimal"
|
||||||
|
format will remove the leading zeros and make the traces easier to read.
|
||||||
|
|
||||||
|
parallelism: The number of mtasks active at this time, for best performance
|
||||||
|
this will match the thread count. You may want to use an "analog step"
|
||||||
|
format to view this signal.
|
||||||
|
|
||||||
|
cpu#_thread: For the given CPU number, the thread number executing.
|
||||||
|
|
||||||
|
mtask#_cpu; For the given mtask id, the CPU it is executing on.
|
||||||
|
|
||||||
|
thread#_mtask: For the given thread number, the mtask id executing.
|
||||||
|
|
||||||
|
=head1 ARGUMENTS
|
||||||
|
|
||||||
|
=over 4
|
||||||
|
|
||||||
|
=item I<filename>
|
||||||
|
|
||||||
|
The filename to read data from, defaults to "profile_threads.dat".
|
||||||
|
|
||||||
|
=item --help
|
||||||
|
|
||||||
|
Displays this message and program version and exits.
|
||||||
|
|
||||||
|
=item --scale I<n>
|
||||||
|
|
||||||
|
On the X-axis of the generated Gantt chart, each character represents this
|
||||||
|
many time units. (On x86, time units are rdtsc ticks.) Defaults to 0,
|
||||||
|
which will automatically compute a reasonable scale where no two mtasks
|
||||||
|
need to fit into same character width's worth of scaled time.
|
||||||
|
|
||||||
|
=item --no-vcd
|
||||||
|
|
||||||
|
=item --vcd I<filename>
|
||||||
|
|
||||||
|
Set output filename for vcd dump, or disable. Default is
|
||||||
|
verilator_gantt.vcd.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 DISTRIBUTION
|
||||||
|
|
||||||
|
The latest version is available from L<https://verilator.org>.
|
||||||
|
|
||||||
|
Copyright 2018-2019 by Wilson Snyder. Verilator is free software; you can
|
||||||
|
redistribute it and/or modify it under the terms of either the GNU Lesser
|
||||||
|
General Public License Version 3 or the Perl Artistic License Version 2.0.
|
||||||
|
|
||||||
|
=head1 AUTHORS
|
||||||
|
|
||||||
|
Wilson Snyder <[email protected]>
|
||||||
|
|
||||||
|
=head1 SEE ALSO
|
||||||
|
|
||||||
|
C<verilator>
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
### Local Variables:
|
||||||
|
### compile-command: "$V4/bin/verilator_gantt $V4/test_regress/obj_vltmt/t_gantt/vlt_sim.log"
|
||||||
|
### End:
|
||||||
@@ -1,16 +1,20 @@
|
|||||||
: # -*-Mode: perl;-*- use perl, wherever it is
|
: # -*-Mode: perl;-*- use perl, wherever it is
|
||||||
eval 'exec perl -wS $0 ${1+"$@"}'
|
eval 'exec perl -wS $0 ${1+"$@"}'
|
||||||
if 0;
|
if 0;
|
||||||
# $Id$
|
|
||||||
# DESCRIPTION: Print include statements for each ARGV
|
# DESCRIPTION: Print include statements for each ARGV
|
||||||
#
|
#
|
||||||
# Copyright 2003-2007 by Wilson Snyder. This program is free software; you can
|
# Copyright 2003-2019 by Wilson Snyder. This package is free software; you can
|
||||||
# redistribute it and/or modify it under the terms of either the GNU
|
# redistribute it and/or modify it under the terms of either the GNU Lesser
|
||||||
# General Public License or the Perl Artistic License.
|
# General Public License Version 3 or the Perl Artistic License Version 2.0.
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|
||||||
require 5.005;
|
require 5.005;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
print "// DESCR"."IPTION: Generated by verilator_includer via makefile\n";
|
||||||
foreach my $param (@ARGV) {
|
foreach my $param (@ARGV) {
|
||||||
print "#include \"$param\"\n"
|
if ($param =~ /^-D([^=]+)=(.*)/) {
|
||||||
|
print "#define $1 $2\n"
|
||||||
|
} else {
|
||||||
|
print "#include \"$param\"\n"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+117
-78
@@ -1,19 +1,7 @@
|
|||||||
: # -*-Mode: perl;-*- use perl, wherever it is
|
: # -*-Mode: perl;-*- use perl, wherever it is
|
||||||
eval 'exec perl -wS $0 ${1+"$@"}'
|
eval 'exec perl -wS $0 ${1+"$@"}'
|
||||||
if 0;
|
if 0;
|
||||||
# $Id$
|
# See copyright, etc in below POD section.
|
||||||
######################################################################
|
|
||||||
#
|
|
||||||
# Copyright 2007-2007 by Wilson Snyder <[email protected]>. This
|
|
||||||
# program is free software; you can redistribute it and/or modify it under
|
|
||||||
# the terms of either the GNU Lesser General Public License or the Perl
|
|
||||||
# Artistic License.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|
||||||
require 5.006_001;
|
require 5.006_001;
|
||||||
@@ -21,8 +9,9 @@ use warnings;
|
|||||||
use Getopt::Long;
|
use Getopt::Long;
|
||||||
use IO::File;
|
use IO::File;
|
||||||
use Pod::Usage;
|
use Pod::Usage;
|
||||||
|
eval { use Data::Dumper; $Data::Dumper::Indent = 1; }; # Debug, ok if missing
|
||||||
use strict;
|
use strict;
|
||||||
use vars qw ($Debug);
|
use vars qw($Debug);
|
||||||
|
|
||||||
#======================================================================
|
#======================================================================
|
||||||
|
|
||||||
@@ -34,12 +23,12 @@ $Debug = 0;
|
|||||||
my $Opt_File;
|
my $Opt_File;
|
||||||
autoflush STDOUT 1;
|
autoflush STDOUT 1;
|
||||||
autoflush STDERR 1;
|
autoflush STDERR 1;
|
||||||
Getopt::Long::config ("no_auto_abbrev");
|
Getopt::Long::config("no_auto_abbrev");
|
||||||
if (! GetOptions (
|
if (! GetOptions(
|
||||||
"help" => \&usage,
|
"help" => \&usage,
|
||||||
"debug" => \&debug,
|
"debug" => \&debug,
|
||||||
"<>" => \¶meter,
|
"<>" => \¶meter,
|
||||||
)) {
|
)) {
|
||||||
die "%Error: Bad usage, try 'verilator_profcfunc --help'\n";
|
die "%Error: Bad usage, try 'verilator_profcfunc --help'\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,9 +39,8 @@ profcfunc($Opt_File);
|
|||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
|
|
||||||
sub usage {
|
sub usage {
|
||||||
print '$Id$ ', "\n";
|
pod2usage(-verbose=>2, -exitval=>0, -output=>\*STDOUT);
|
||||||
pod2usage(-verbose=>2, -exitval => 2);
|
exit(1); # Unreachable
|
||||||
exit (1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub debug {
|
sub debug {
|
||||||
@@ -62,9 +50,9 @@ sub debug {
|
|||||||
sub parameter {
|
sub parameter {
|
||||||
my $param = shift;
|
my $param = shift;
|
||||||
if (!defined $Opt_File) {
|
if (!defined $Opt_File) {
|
||||||
$Opt_File = $param;
|
$Opt_File = $param;
|
||||||
} else {
|
} else {
|
||||||
die "%Error: Unknown parameter: $param\n";
|
die "%Error: Unknown parameter: $param\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,63 +66,114 @@ sub profcfunc {
|
|||||||
my %funcs;
|
my %funcs;
|
||||||
|
|
||||||
while (defined (my $line=$fh->getline())) {
|
while (defined (my $line=$fh->getline())) {
|
||||||
if ($line =~ /^\s*([0-9.]+)\s+[0-9.]+\s+([0-9.]+)\s+([0-9.]+)\s+.*\s+(\S+)\s*$/) {
|
# %time cumesec selfsec calls {stuff} name
|
||||||
my $pct=$1; my $sec=$2; my $calls=$3; my $func=$4;
|
if ($line =~ /^\s*([0-9.]+)\s+[0-9.]+\s+([0-9.]+)\s+([0-9.]+)\s+[^a-zA-Z_]*([a-zA-Z_].*)$/) {
|
||||||
$funcs{$func}{pct} += $pct;
|
my $pct=$1; my $sec=$2; my $calls=$3; my $func=$4;
|
||||||
$funcs{$func}{sec} += $sec;
|
$funcs{$func}{pct} += $pct;
|
||||||
$funcs{$func}{calls} += $calls;
|
$funcs{$func}{sec} += $sec;
|
||||||
}
|
$funcs{$func}{calls} += $calls;
|
||||||
|
}
|
||||||
|
# Older gprofs have no call column for single-call functions
|
||||||
|
# %time cumesec selfsec {stuff} name
|
||||||
|
elsif ($line =~ /^\s*([0-9.]+)\s+[0-9.]+\s+([0-9.]+)\s+[^a-zA-Z_]*([a-zA-Z_].*)$/) {
|
||||||
|
my $pct=$1; my $sec=$2; my $calls=1; my $func=$3;
|
||||||
|
$funcs{$func}{pct} += $pct;
|
||||||
|
$funcs{$func}{sec} += $sec;
|
||||||
|
$funcs{$func}{calls} += $calls;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$fh->close;
|
$fh->close;
|
||||||
|
|
||||||
# Find modules
|
# Find modules
|
||||||
|
my %pointer_mods;
|
||||||
my %verilated_mods;
|
my %verilated_mods;
|
||||||
foreach my $func (keys %funcs) {
|
foreach my $func (keys %funcs) {
|
||||||
if ($func =~ /(.*)::_eval\(.*__Syms.*\)$/) {
|
if ($func =~ /(.*)::_eval\(([a-zA-Z_0-9]+__Syms).*\)$/) {
|
||||||
$verilated_mods{$1} = qr/^$1/;
|
$verilated_mods{$1} = qr/^$1/;
|
||||||
}
|
$pointer_mods{$2} = $1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
#print Dumper(\%pointer_mods, \%verilated_mods);
|
||||||
|
|
||||||
# Resort by Verilog name
|
# Resort by Verilog name
|
||||||
my %vfuncs;
|
my %vfuncs;
|
||||||
my %groups;
|
my %groups;
|
||||||
foreach my $func (keys %funcs) {
|
foreach my $func (keys %funcs) {
|
||||||
my $vfunc = $func;
|
my $pct = $funcs{$func}{pct};
|
||||||
my $design;
|
my $vfunc = $func;
|
||||||
foreach my $vde (keys %verilated_mods) {
|
my $design;
|
||||||
if ($func =~ /$verilated_mods{$vde}/) {
|
|
||||||
$design=$vde;
|
if ($func =~ /\(([a-zA-Z_0-9]+__Syms)/) {
|
||||||
last;
|
$design = $pointer_mods{$1};
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if ($vfunc =~ /__PROF__([a-zA-Z_0-9]+)__([0-9]+)\(/) {
|
foreach my $vde (keys %verilated_mods) {
|
||||||
$vfunc = sprintf("VBlock %s:%d", $1, $2);
|
last if $design;
|
||||||
$groups{"Verilog Blocks under $design"} += $funcs{$func}{pct};
|
if ($func =~ /$verilated_mods{$vde}/) {
|
||||||
} else {
|
$design=$vde;
|
||||||
if ($design) {
|
last;
|
||||||
$vfunc = sprintf("VCommon %s", $func);
|
}
|
||||||
$groups{"Common code under $design"} += $funcs{$func}{pct};
|
}
|
||||||
} else {
|
|
||||||
$vfunc = sprintf("C++ %s", $func);
|
if ($vfunc =~ /__PROF__([a-zA-Z_0-9]+)__l?([0-9]+)\(/) {
|
||||||
$groups{'C++'} += $funcs{$func}{pct};
|
$vfunc = sprintf("VBlock %s:%d", $1, $2);
|
||||||
}
|
$groups{type}{"Verilog Blocks under $design"} += $pct;
|
||||||
}
|
$groups{design}{$design} += $pct;
|
||||||
$vfuncs{$vfunc} = $funcs{$func};
|
$groups{module}{$1} += $pct;
|
||||||
|
} else {
|
||||||
|
if ($design) {
|
||||||
|
$vfunc = sprintf("VCommon %s", $func);
|
||||||
|
$groups{type}{"Common code under $design"} += $pct;
|
||||||
|
$groups{design}{$design} += $pct;
|
||||||
|
$groups{module}{$design." common code"} += $pct;
|
||||||
|
} elsif ($func =~ /^VL_[A-Z0-9_]+/
|
||||||
|
|| $func =~ /^_?vl_[a-zA-Z0-9_]+/
|
||||||
|
|| $func =~ /^verilated/i) {
|
||||||
|
$vfunc = sprintf("VLib %s", $func);
|
||||||
|
$groups{type}{'VLib'} += $pct;
|
||||||
|
$groups{design}{'VLib'} += $pct;
|
||||||
|
$groups{module}{'VLib'} += $pct;
|
||||||
|
} elsif ($func =~ /^_mcount_private/) {
|
||||||
|
$vfunc = sprintf("Prof %s", $func);
|
||||||
|
$groups{type}{'Prof'} += $pct;
|
||||||
|
$groups{design}{'Prof'} += $pct;
|
||||||
|
$groups{module}{'Prof'} += $pct;
|
||||||
|
} else {
|
||||||
|
$vfunc = sprintf("C++ %s", $func);
|
||||||
|
$groups{type}{'C++'} += $pct;
|
||||||
|
$groups{design}{'C++'} += $pct;
|
||||||
|
$groups{module}{'C++'} += $pct;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$vfuncs{$vfunc} = $funcs{$func};
|
||||||
}
|
}
|
||||||
|
|
||||||
print("Overall summary:\n");
|
|
||||||
print(" % time\n");
|
|
||||||
foreach (sort (keys %groups)) {
|
|
||||||
printf(" %6.2f In all %s\n", $groups{$_}, $_);
|
|
||||||
}
|
|
||||||
print("\n");
|
|
||||||
|
|
||||||
|
foreach my $type (qw(type design module)) {
|
||||||
|
my $missing = 100;
|
||||||
|
foreach (sort (keys %{$groups{$type}})) {
|
||||||
|
$missing -= $groups{$type}{$_};
|
||||||
|
}
|
||||||
|
if ($missing) {
|
||||||
|
$groups{$type}{"\377Unaccounted for/rounding error"} = $missing;
|
||||||
|
}
|
||||||
|
|
||||||
|
print("Overall summary by $type:\n");
|
||||||
|
printf(" %-6s %s\n","% time",$type);
|
||||||
|
foreach my $what (sort (keys %{$groups{$type}})) {
|
||||||
|
(my $pwhat = $what) =~ s/^\377//; # Just used to establish sort order
|
||||||
|
printf(" %6.2f %s\n", $groups{$type}{$what}, $pwhat);
|
||||||
|
}
|
||||||
|
print("\n");
|
||||||
|
}
|
||||||
|
|
||||||
print("Verilog code profile:\n");
|
print("Verilog code profile:\n");
|
||||||
print(" These are split into three categories:\n");
|
print(" These are split into three categories:\n");
|
||||||
print(" C++: Time in non-Verilated C++ code\n");
|
print(" C++: Time in non-Verilated C++ code\n");
|
||||||
|
print(" Prof: Time in profile overhead\n");
|
||||||
print(" VBlock: Time attributable to a block in a Verilog file and line\n");
|
print(" VBlock: Time attributable to a block in a Verilog file and line\n");
|
||||||
print(" VCommon: Time in a Verilated module, due to all parts of the design\n");
|
print(" VCommon: Time in a Verilated module, due to all parts of the design\n");
|
||||||
|
print(" VLib: Time in Verilated common libraries, called by the Verilated code\n");
|
||||||
print("\n");
|
print("\n");
|
||||||
|
|
||||||
print(" % cumulative self \n");
|
print(" % cumulative self \n");
|
||||||
@@ -142,14 +181,14 @@ sub profcfunc {
|
|||||||
|
|
||||||
my $cume = 0;
|
my $cume = 0;
|
||||||
foreach my $func (sort {$vfuncs{$b}{sec} <=> $vfuncs{$a}{sec}
|
foreach my $func (sort {$vfuncs{$b}{sec} <=> $vfuncs{$a}{sec}
|
||||||
|| $a cmp $b}
|
|| $a cmp $b}
|
||||||
(keys %vfuncs)) {
|
(keys %vfuncs)) {
|
||||||
$cume += $vfuncs{$func}{sec};
|
$cume += $vfuncs{$func}{sec};
|
||||||
printf +("%6.2f %9.2f %8.2f %8d %s\n",
|
printf +("%6.2f %9.2f %8.2f %8d %s\n",
|
||||||
$vfuncs{$func}{pct},
|
$vfuncs{$func}{pct},
|
||||||
$cume, $vfuncs{$func}{sec},
|
$cume, $vfuncs{$func}{sec},
|
||||||
$vfuncs{$func}{calls},
|
$vfuncs{$func}{calls},
|
||||||
$func);
|
$func);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -160,11 +199,11 @@ __END__
|
|||||||
|
|
||||||
=head1 NAME
|
=head1 NAME
|
||||||
|
|
||||||
verilator_profcfunc - Read gprof report created with --profile-cfuncs
|
verilator_profcfunc - Read gprof report created with --prof-cfuncs
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
verilator --profile-cfuncs ....
|
verilator --prof-cfuncs ....
|
||||||
gcc --ggdb -pg ....
|
gcc --ggdb -pg ....
|
||||||
{run executable}
|
{run executable}
|
||||||
gprof
|
gprof
|
||||||
@@ -173,8 +212,8 @@ verilator_profcfunc - Read gprof report created with --profile-cfuncs
|
|||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Verilator_profcfunc reads a profile report created by gprof. The names of
|
Verilator_profcfunc reads a profile report created by gprof. The names of
|
||||||
the functions are then transformed, assuming the user used verilator's
|
the functions are then transformed, assuming the user used Verilator's
|
||||||
--profile-cfuncs, and a report printed showing the percentage of time, etc,
|
--prof-cfuncs, and a report printed showing the percentage of time, etc,
|
||||||
in each Verilog block.
|
in each Verilog block.
|
||||||
|
|
||||||
=head1 ARGUMENTS
|
=head1 ARGUMENTS
|
||||||
@@ -189,11 +228,11 @@ Displays this message and program version and exits.
|
|||||||
|
|
||||||
=head1 DISTRIBUTION
|
=head1 DISTRIBUTION
|
||||||
|
|
||||||
The latest version is available from L<http://www.veripool.com/>.
|
The latest version is available from L<https://verilator.org>.
|
||||||
|
|
||||||
Copyright 2007-2007 by Wilson Snyder. This package is free software; you
|
Copyright 2007-2019 by Wilson Snyder. Verilator is free software; you can
|
||||||
can redistribute it and/or modify it under the terms of either the GNU
|
redistribute it and/or modify it under the terms of either the GNU Lesser
|
||||||
Lesser General Public License or the Perl Artistic License.
|
General Public License Version 3 or the Perl Artistic License Version 2.0.
|
||||||
|
|
||||||
=head1 AUTHORS
|
=head1 AUTHORS
|
||||||
|
|
||||||
|
|||||||
Executable
+64
@@ -0,0 +1,64 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# DESCRIPTION: Verilator: Travis CI build script
|
||||||
|
#
|
||||||
|
# Copyright 2019 by Todd Strader. This program is free software; you can
|
||||||
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
# Version 2.0.
|
||||||
|
#
|
||||||
|
# This script builds and caches the Verilator binaries for Travis CI
|
||||||
|
# (and possibly other CI platforms). The Verilator CI system uses this
|
||||||
|
# script, but other CI systems that depend on Verilator may also use
|
||||||
|
# the script.
|
||||||
|
# see: https://github.com/verilator/verilator_ext_tests/blob/master/.travis.yml
|
||||||
|
# To use this script, either checkout Verilator as part of the CI build
|
||||||
|
# process or add Verilator as a Git submodule. Verilator tarballs can
|
||||||
|
# not be used as the script relies on Git revisions for caching.
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if [ -z "${VERILATOR_NUM_JOBS}" ]; then
|
||||||
|
VERILATOR_NUM_JOBS=$(nproc)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Caching would be simpler if we installed without VERILATOR_ROOT, but
|
||||||
|
# it's needed for driver.pl outside of the repo
|
||||||
|
if [ -z "${VERILATOR_ROOT}" ]; then
|
||||||
|
echo "VERILATOR_ROOT not set"
|
||||||
|
exit -1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${VERILATOR_CACHE}" ]; then
|
||||||
|
echo "VERILATOR_CACHE not set"
|
||||||
|
exit -1
|
||||||
|
fi
|
||||||
|
|
||||||
|
VERILATOR_REV=$(cd "${VERILATOR_ROOT}" && git rev-parse HEAD)
|
||||||
|
echo "Found Verilator rev ${VERILATOR_REV}"
|
||||||
|
|
||||||
|
CACHED_REV_FILE=${VERILATOR_CACHE}/.rev.txt
|
||||||
|
|
||||||
|
if [[ ! -f "${CACHED_REV_FILE}" || \
|
||||||
|
$(< "${CACHED_REV_FILE}") != "${VERILATOR_REV}" ]]; then
|
||||||
|
echo "Building Verilator"
|
||||||
|
|
||||||
|
# Unsure why Travis monkies with the capitalization of the stage name, but it does
|
||||||
|
if [[ -n ${TRAVIS_BUILD_STAGE_NAME} && \
|
||||||
|
${TRAVIS_BUILD_STAGE_NAME} != "Build verilator" ]]; then
|
||||||
|
echo "WARNING: Building Verilator in Travis build stage other than \"Build verilator\": ${TRAVIS_BUILD_STAGE_NAME}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd "${VERILATOR_ROOT}"
|
||||||
|
autoconf && ./configure ${VERILATOR_CONFIG_FLAGS} && make -j ${VERILATOR_NUM_JOBS}
|
||||||
|
# Copy the Verilator build artifacts
|
||||||
|
mkdir -p "${VERILATOR_CACHE}"
|
||||||
|
rm -rf ${VERILATOR_CACHE}/*
|
||||||
|
cp bin/*bin* "${VERILATOR_CACHE}"
|
||||||
|
# Remember the Git revision
|
||||||
|
echo "${VERILATOR_REV}" > "${CACHED_REV_FILE}"
|
||||||
|
else
|
||||||
|
echo "Using cached Verilator"
|
||||||
|
cd "${VERILATOR_ROOT}"
|
||||||
|
# Create include/verilated_config.h and maybe other things
|
||||||
|
autoconf && ./configure ${VERILATOR_CONFIG_FLAGS}
|
||||||
|
cp ${VERILATOR_CACHE}/* bin
|
||||||
|
fi
|
||||||
Executable
+26
@@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# DESCRIPTION: Verilator: Travis CI test script
|
||||||
|
#
|
||||||
|
# Copyright 2019 by Todd Strader. This program is free software; you can
|
||||||
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
# Version 2.0.
|
||||||
|
set -e
|
||||||
|
|
||||||
|
export DRIVER_FLAGS='-j 0 --quiet --rerun'
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
dist)
|
||||||
|
make -C test_regress SCENARIOS=--dist
|
||||||
|
;;
|
||||||
|
vlt)
|
||||||
|
make -C test_regress SCENARIOS=--vlt
|
||||||
|
;;
|
||||||
|
vltmt)
|
||||||
|
make -C test_regress SCENARIOS=--vltmt
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Usage: test.sh (dist|vlt|vltmt)"
|
||||||
|
exit -1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
+329
-26
@@ -1,20 +1,116 @@
|
|||||||
dnl $Id$
|
# DESCRIPTION: Process this file with autoconf to produce a configure script.
|
||||||
dnl DESCRIPTION: Process this file with autoconf to produce a configure script.
|
#
|
||||||
dnl Copyright 2003-2007 by Wilson Snyder. This program is free software; you can
|
# Copyright 2003-2019 by Wilson Snyder. Verilator is free software; you can
|
||||||
dnl redistribute it and/or modify it under the terms of either the GNU
|
# redistribute it and/or modify it under the terms of either the GNU Lesser
|
||||||
dnl General Public License or the Perl Artistic License.
|
# General Public License Version 3 or the Perl Artistic License Version 2.0.
|
||||||
|
|
||||||
|
#AC_INIT([Verilator],[#.### YYYY-MM-DD])
|
||||||
|
#AC_INIT([Verilator],[#.### devel])
|
||||||
|
AC_INIT([Verilator],[4.024 2019-12-08],
|
||||||
|
[https://verilator.org],
|
||||||
|
[verilator],[https://verilator.org])
|
||||||
|
# When releasing, also update header of Changes file
|
||||||
|
# and commit using "devel release" or "Version bump" message
|
||||||
|
|
||||||
AC_REVISION($Revision$)dnl
|
|
||||||
AC_INIT(src/Verilator.cpp)
|
|
||||||
AC_CONFIG_HEADER(src/config_build.h)
|
AC_CONFIG_HEADER(src/config_build.h)
|
||||||
|
AC_CONFIG_FILES(Makefile docs/Makefile src/Makefile src/Makefile_obj include/verilated.mk include/verilated_config.h verilator.pc verilator-config.cmake verilator-config-version.cmake)
|
||||||
|
|
||||||
dnl Special Substitutions
|
AC_MSG_RESULT([configuring for $PACKAGE_STRING])
|
||||||
|
|
||||||
dnl Checks for programs.
|
# Ignore automake flags passed by Ubuntu builds
|
||||||
CXX=g++
|
AC_ARG_ENABLE([dependency-tracking],
|
||||||
|
[AS_HELP_STRING([--disable-dependency-tracking], [ignored])])
|
||||||
|
AC_ARG_ENABLE([maintainer-mode],
|
||||||
|
[AS_HELP_STRING([--enable-maintainer-mode], [ignored])])
|
||||||
|
AC_ARG_ENABLE([silent-rules],
|
||||||
|
[AS_HELP_STRING([--disable-silent-rules], [ignored])])
|
||||||
|
|
||||||
|
# Special Substitutions - CFG_WITH_DEFENV
|
||||||
|
AC_MSG_CHECKING(whether to use hardcoded paths)
|
||||||
|
AC_ARG_ENABLE([defenv],
|
||||||
|
[AS_HELP_STRING([--disable-defenv],
|
||||||
|
[disable using some hardcoded data paths extracted from some default environment variables (the default is to use hardcoded paths)])],
|
||||||
|
[case "${enableval}" in
|
||||||
|
yes) CFG_WITH_DEFENV=yes ;;
|
||||||
|
no) CFG_WITH_DEFENV=no ;;
|
||||||
|
*) AC_MSG_ERROR([bad value ${enableval} for --disable-defenv]) ;;
|
||||||
|
esac],
|
||||||
|
CFG_WITH_DEFENV=yes)
|
||||||
|
AC_SUBST(CFG_WITH_DEFENV)
|
||||||
|
AC_MSG_RESULT($CFG_WITH_DEFENV)
|
||||||
|
|
||||||
|
# Special Substitutions - CFG_WITH_CCWARN
|
||||||
|
AC_MSG_CHECKING(whether to show and stop on compilation warnings)
|
||||||
|
AC_ARG_ENABLE([ccwarn],
|
||||||
|
[AS_HELP_STRING([--enable-ccwarn],
|
||||||
|
[enable showing and stopping on compilation warnings])],
|
||||||
|
[case "${enableval}" in
|
||||||
|
yes) CFG_WITH_CCWARN=yes ;;
|
||||||
|
no) CFG_WITH_CCWARN=no ;;
|
||||||
|
*) AC_MSG_ERROR([bad value ${enableval} for --enable-ccwarn]) ;;
|
||||||
|
esac],
|
||||||
|
[case "x${VERILATOR_AUTHOR_SITE}" in
|
||||||
|
x) CFG_WITH_CCWARN=no ;;
|
||||||
|
*) CFG_WITH_CCWARN=yes ;;
|
||||||
|
esac]
|
||||||
|
)
|
||||||
|
AC_SUBST(CFG_WITH_CCWARN)
|
||||||
|
AC_MSG_RESULT($CFG_WITH_CCWARN)
|
||||||
|
|
||||||
|
# Special Substitutions - CFG_WITH_LONGTESTS
|
||||||
|
AC_MSG_CHECKING(whether to run long tests)
|
||||||
|
AC_ARG_ENABLE([longtests],
|
||||||
|
[AS_HELP_STRING([--enable-longtests],
|
||||||
|
[enable running long developer tests])],
|
||||||
|
[case "${enableval}" in
|
||||||
|
yes) CFG_WITH_LONGTESTS=yes ;;
|
||||||
|
no) CFG_WITH_LONGTESTS=no ;;
|
||||||
|
*) AC_MSG_ERROR([bad value ${enableval} for --enable-longtests]) ;;
|
||||||
|
esac],
|
||||||
|
[case "x${VERILATOR_AUTHOR_SITE}" in
|
||||||
|
x) CFG_WITH_LONGTESTS=no ;;
|
||||||
|
*) CFG_WITH_LONGTESTS=yes ;;
|
||||||
|
esac]
|
||||||
|
)
|
||||||
|
AC_SUBST(CFG_WITH_LONGTESTS)
|
||||||
|
AC_MSG_RESULT($CFG_WITH_LONGTESTS)
|
||||||
|
|
||||||
|
# CFG_WITH_PREC11
|
||||||
|
AC_MSG_CHECKING(whether allow pre-C++11)
|
||||||
|
AC_ARG_ENABLE([prec11],
|
||||||
|
[AS_HELP_STRING([--enable-prec11],
|
||||||
|
[enable pre-C++11 compilers])],
|
||||||
|
[case "${enableval}" in
|
||||||
|
yes) CFG_WITH_PREC11=yes ;;
|
||||||
|
no) CFG_WITH_PREC11=no ;;
|
||||||
|
*) AC_MSG_ERROR([bad value ${enableval} for --enable-prec11]) ;;
|
||||||
|
esac],
|
||||||
|
[CFG_WITH_PREC11=no;]
|
||||||
|
)
|
||||||
|
AC_SUBST(CFG_WITH_PREC11)
|
||||||
|
AC_MSG_RESULT($CFG_WITH_PREC11)
|
||||||
|
|
||||||
|
# Compiler flags
|
||||||
|
CFLAGS+=" -I${includedir}"
|
||||||
|
CPPFLAGS+=" -I${includedir}"
|
||||||
|
CXXFLAGS+=" -I${includedir}"
|
||||||
|
LDFLAGS+=" -L${libdir}"
|
||||||
|
|
||||||
|
# Checks for programs.
|
||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
AC_PROG_CXX
|
AC_PROG_CXX
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
|
|
||||||
|
AC_LANG_PUSH(C++)
|
||||||
|
cxx_version=$($CXX --version | head -1)
|
||||||
|
AC_MSG_RESULT([compiler is $CXX --version = $cxx_version])
|
||||||
|
AC_MSG_CHECKING([that C++ compiler can compile simple program])
|
||||||
|
AC_RUN_IFELSE(
|
||||||
|
[AC_LANG_SOURCE([int main() { return 0; }])],
|
||||||
|
AC_MSG_RESULT(yes),
|
||||||
|
AC_MSG_RESULT(no);AC_MSG_ERROR([a working C++ compiler is required]),
|
||||||
|
AC_MSG_RESULT(yes))
|
||||||
|
|
||||||
AC_PATH_PROG(PERL,perl)
|
AC_PATH_PROG(PERL,perl)
|
||||||
if test "x$PERL" = "x" ; then
|
if test "x$PERL" = "x" ; then
|
||||||
AC_MSG_ERROR([Cannot find "perl" in your PATH, please install it])
|
AC_MSG_ERROR([Cannot find "perl" in your PATH, please install it])
|
||||||
@@ -28,33 +124,240 @@ if test "x$YACC" = "x" ; then
|
|||||||
AC_MSG_ERROR([Cannot find "bison" in your PATH, please install it])
|
AC_MSG_ERROR([Cannot find "bison" in your PATH, please install it])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dnl Checks for libraries.
|
# Checks for libraries.
|
||||||
|
|
||||||
dnl Checks for header files.
|
# Checks for typedefs, structures
|
||||||
AC_HEADER_STDC
|
|
||||||
AC_HEADER_SYS_WAIT
|
|
||||||
AC_CHECK_HEADERS(fcntl.h unistd.h inttypes.h sys/file.h sys/time.h sys/un.h math.h stdint.h mingw/stdint.h)
|
|
||||||
|
|
||||||
dnl Checks for typedefs, structures
|
|
||||||
AC_CHECK_TYPE(size_t,unsigned int)
|
AC_CHECK_TYPE(size_t,unsigned int)
|
||||||
AC_CHECK_TYPE(uint_t,unsigned int)
|
|
||||||
AC_CHECK_TYPE(ulong_t,unsigned long)
|
|
||||||
AC_TYPE_SIZE_T
|
AC_TYPE_SIZE_T
|
||||||
AC_STRUCT_TM
|
|
||||||
|
|
||||||
dnl Checks for compiler characteristics.
|
# Checks for compiler characteristics.
|
||||||
AC_C_INLINE
|
AC_C_INLINE
|
||||||
|
|
||||||
dnl Checks for library functions.
|
AC_LINK_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM([#include <new>], [[int* a=new int; delete a; ]])],
|
||||||
|
[], [AC_MSG_ERROR([$CXX does not seem to successfully compile a simple C++ program])])
|
||||||
|
|
||||||
dnl Checks for system services
|
AC_DEFUN([_MY_CXX_CHECK_FLAG],
|
||||||
|
[# _MY_CXX_CHECK_FLAG(flag) -- Check if compiler supports specific options
|
||||||
|
# Set $_my_result appropriately
|
||||||
|
ACO_SAVE_CXXFLAGS="$CXXFLAGS"
|
||||||
|
# -Werror needed otherwise unknown -Wno-div-by-zero won't report problems
|
||||||
|
# new/delete is needed to find -faligned-new link problem on Darwin
|
||||||
|
CXXFLAGS="$CXXFLAGS $1 -Werror"
|
||||||
|
AC_MSG_CHECKING([whether $CXX accepts $1])
|
||||||
|
AC_LINK_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM([#include <new>], [[int* a=new int; delete a; ]])],
|
||||||
|
[_my_result=yes
|
||||||
|
if test -s conftest.err; then
|
||||||
|
if grep -e "$1" conftest.err >/dev/null; then
|
||||||
|
_my_result=no
|
||||||
|
fi
|
||||||
|
fi],
|
||||||
|
[_my_result=no])
|
||||||
|
# GCC is annoying, trying to be helpful, it postpones unknown -Wno-
|
||||||
|
# options if there's no error We want to see them regardless, so try
|
||||||
|
# forcing an error and see if we get a gcc warning
|
||||||
|
AC_COMPILE_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM([[an_error "intentional-error-for-test.h"
|
||||||
|
]],[])],
|
||||||
|
[], # Ignore ok exit
|
||||||
|
[if test -s conftest.err; then
|
||||||
|
if grep -e "$1" conftest.err >/dev/null; then
|
||||||
|
_my_result=no
|
||||||
|
fi
|
||||||
|
fi])
|
||||||
|
AC_MSG_RESULT($_my_result)
|
||||||
|
CXXFLAGS="$ACO_SAVE_CXXFLAGS"
|
||||||
|
])
|
||||||
|
|
||||||
dnl Other install directories
|
AC_DEFUN([_MY_CXX_CHECK_SET],
|
||||||
|
[# _MY_CXX_CHECK_SET(variable,flag) -- Check if compiler supports specific options
|
||||||
|
# If it does, set variable to flag, only if not previously set
|
||||||
|
if test "$$1" = ""; then
|
||||||
|
_MY_CXX_CHECK_FLAG($2)
|
||||||
|
if test "$_my_result" = "yes" ; then
|
||||||
|
$1="$2"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([_MY_CXX_CHECK_OPT],
|
||||||
|
[# _MY_CXX_CHECK_OPT(flag) -- Check if compiler supports specific options
|
||||||
|
# If it does, append flag to variable
|
||||||
|
_MY_CXX_CHECK_FLAG($2)
|
||||||
|
if test "$_my_result" = "yes" ; then
|
||||||
|
$1="$$1 $2"
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([_MY_LDLIBS_CHECK_FLAG],
|
||||||
|
[# _MY_LDLIBS_CHECK_FLAG(flag) -- Check if linker supports specific options
|
||||||
|
# Set $_my_result appropriately
|
||||||
|
ACO_SAVE_LIBS="$LIBS"
|
||||||
|
LIBS="$LIBS $1"
|
||||||
|
AC_MSG_CHECKING([whether $CXX linker accepts $1])
|
||||||
|
AC_LINK_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM([[]])],
|
||||||
|
[_my_result=yes
|
||||||
|
if test -s conftest.err; then
|
||||||
|
if grep -e "$1" conftest.err >/dev/null; then
|
||||||
|
_my_result=no
|
||||||
|
fi
|
||||||
|
fi],
|
||||||
|
[_my_result=no])
|
||||||
|
AC_MSG_RESULT($_my_result)
|
||||||
|
LIBS="$ACO_SAVE_LIBS"
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([_MY_LDLIBS_CHECK_OPT],
|
||||||
|
[# _MY_LDLIBS_CHECK_OPT(flag) -- Check if linker supports specific options
|
||||||
|
# If it does, append flag to variable
|
||||||
|
_MY_LDLIBS_CHECK_FLAG($2)
|
||||||
|
if test "$_my_result" = "yes" ; then
|
||||||
|
$1="$$1 $2"
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
# Flag to select newest language standard supported
|
||||||
|
# Macros work such that first option that passes is the one we take
|
||||||
|
# gnu++17 code is clean, but SystemC in 2018 doesn't link with it (bug1339)
|
||||||
|
# gnu++14 is the newest that Verilator supports
|
||||||
|
# std++03 is the oldest that Verilator supports
|
||||||
|
#_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_NEWEST,-std=gnu++17)
|
||||||
|
_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_NEWEST,-std=gnu++14)
|
||||||
|
_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_NEWEST,-std=gnu++11)
|
||||||
|
_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_NEWEST,-std=gnu++03)
|
||||||
|
#_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_NEWEST,-std=c++17)
|
||||||
|
_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_NEWEST,-std=c++14)
|
||||||
|
_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_NEWEST,-std=c++11)
|
||||||
|
_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_NEWEST,-std=c++03)
|
||||||
|
AC_SUBST(CFG_CXXFLAGS_STD_NEWEST)
|
||||||
|
# And likewise oldest standard (same list above, backwards)
|
||||||
|
# This is used for internal testing
|
||||||
|
_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_OLDEST,-std=c++03)
|
||||||
|
_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_OLDEST,-std=c++11)
|
||||||
|
_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_OLDEST,-std=c++14)
|
||||||
|
#_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_OLDEST,-std=std++17)
|
||||||
|
_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_OLDEST,-std=gnu++03)
|
||||||
|
_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_OLDEST,-std=gnu++11)
|
||||||
|
_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_OLDEST,-std=gnu++14)
|
||||||
|
#_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_OLDEST,-std=gnu++17)
|
||||||
|
AC_SUBST(CFG_CXXFLAGS_STD_OLDEST)
|
||||||
|
|
||||||
|
# Flags for compiling Verilator internals including parser, and Verilated files
|
||||||
|
# These turn on extra warnings and are only used with 'configure --enable-ccwarn'
|
||||||
|
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_WEXTRA,-Wextra)
|
||||||
|
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_WEXTRA,-Wfloat-conversion)
|
||||||
|
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_WEXTRA,-Wlogical-op)
|
||||||
|
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_WEXTRA,-Wthread-safety)
|
||||||
|
AC_SUBST(CFG_CXXFLAGS_WEXTRA)
|
||||||
|
|
||||||
|
# Flags for compiling Verilator internals including parser always
|
||||||
|
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-Qunused-arguments)
|
||||||
|
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-faligned-new)
|
||||||
|
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-Wno-unused-parameter)
|
||||||
|
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-Wno-undefined-bool-conversion)
|
||||||
|
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-Wno-shadow)
|
||||||
|
AC_SUBST(CFG_CXXFLAGS_SRC)
|
||||||
|
|
||||||
|
# Flags for compiling Verilator parser always (in addition to above CFG_CXXFLAGS_SRC)
|
||||||
|
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_PARSER,-Wno-char-subscripts)
|
||||||
|
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_PARSER,-Wno-null-conversion)
|
||||||
|
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_PARSER,-Wno-parentheses-equality)
|
||||||
|
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_PARSER,-Wno-unused)
|
||||||
|
AC_SUBST(CFG_CXXFLAGS_PARSER)
|
||||||
|
|
||||||
|
# Flags for Verilated makefile
|
||||||
|
# For example, -Wno-div-by-zero isn't in 4.1.2
|
||||||
|
# Random code often does / 0. Unfortunately VL_DIV_I(0,0) will warn
|
||||||
|
# without this flag, even though there's a conditional to prevent the divide.
|
||||||
|
# We still don't add no-div-by-zero as it throws message to stdout, though doesn't die.
|
||||||
|
#_MY_CXX_CHECK_OPT(-Wno-div-by-zero)
|
||||||
|
# For some reason -faligned-new does not work under Travis w/ clang but the
|
||||||
|
# configure test doesn't catch this either
|
||||||
|
AS_IF([test "x$TRAVIS_COMPILER" != xclang], [_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_NO_UNUSED,-faligned-new)])
|
||||||
|
CFG_CXX_FLAGS_CMAKE="-faligned-new"
|
||||||
|
m4_foreach([cflag],[
|
||||||
|
[-fbracket-depth=4096],
|
||||||
|
[-fcf-protection=none],
|
||||||
|
[-mno-cet],
|
||||||
|
[-Qunused-arguments],
|
||||||
|
[-Wno-bool-operation],
|
||||||
|
[-Wno-parentheses-equality],
|
||||||
|
[-Wno-sign-compare],
|
||||||
|
[-Wno-uninitialized],
|
||||||
|
[-Wno-unused-but-set-variable],
|
||||||
|
[-Wno-unused-parameter],
|
||||||
|
[-Wno-unused-variable],
|
||||||
|
[-Wno-shadow]],[
|
||||||
|
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_NO_UNUSED,cflag)
|
||||||
|
# CMake will test what flags work itself, so pass all flags through to it
|
||||||
|
CFG_CXX_FLAGS_CMAKE="$CFG_CXX_FLAGS_CMAKE cflag"
|
||||||
|
])
|
||||||
|
AC_SUBST(CFG_CXXFLAGS_NO_UNUSED)
|
||||||
|
AC_SUBST(CFG_CXX_FLAGS_CMAKE)
|
||||||
|
|
||||||
|
# Find multithread linker flags
|
||||||
|
m4_foreach([ldflag], [
|
||||||
|
[-mt],
|
||||||
|
[-pthread],
|
||||||
|
[-lpthread],
|
||||||
|
[-latomic]],[
|
||||||
|
_MY_LDLIBS_CHECK_OPT(CFG_LDLIBS_THREADS,ldflag)
|
||||||
|
# CMake will test what flags work itself, so pass all flags through to it
|
||||||
|
CFG_LDFLAGS_THREADS_CMAKE="$CFG_LDFLAGS_THREADS_CMAKE ldflag"
|
||||||
|
])
|
||||||
|
AC_SUBST(CFG_LDLIBS_THREADS)
|
||||||
|
AC_SUBST(CFG_LDFLAGS_THREADS_CMAKE)
|
||||||
|
|
||||||
|
# Set CFG_WITH_THREADED if can support threading
|
||||||
|
AC_MSG_CHECKING(whether $CXX supports Verilated threads)
|
||||||
|
ACO_SAVE_CXXFLAGS="$CXXFLAGS"
|
||||||
|
CXXFLAGS="$CXXFLAGS $CFG_CXXFLAGS_STD_NEWEST $CFG_CXXFLAGS_NO_UNUSED"
|
||||||
|
AC_LINK_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM([#include <thread>], [[ ]])],
|
||||||
|
[_my_result=yes
|
||||||
|
if test -s conftest.err; then
|
||||||
|
if grep -e "$1" conftest.err >/dev/null; then
|
||||||
|
_my_result=no
|
||||||
|
fi
|
||||||
|
fi],
|
||||||
|
[_my_result=no])
|
||||||
|
CFG_WITH_THREADED=$_my_result
|
||||||
|
AC_SUBST(CFG_WITH_THREADED)
|
||||||
|
AC_MSG_RESULT($CFG_WITH_THREADED)
|
||||||
|
|
||||||
|
# Check compiler flag
|
||||||
|
if test "$CFG_WITH_THREADED" = "no" ; then
|
||||||
|
if test "$CFG_WITH_PREC11" = "no" ; then
|
||||||
|
AC_MSG_NOTICE([[]])
|
||||||
|
AC_MSG_ERROR([[the $CXX compiler appears to not support C++11.
|
||||||
|
|
||||||
|
Verilator plans to require a C++11 or newer compiler in a future release,
|
||||||
|
unless sufficient people report problems. Therefore, if you do not have a
|
||||||
|
C++11 compiler, please post a message to
|
||||||
|
https://www.veripool.org/boards/3/topics/2580-Verilator-Requiring-C-11-compiler
|
||||||
|
indicating your OS and when you think C++11 might be ok, and then rerun
|
||||||
|
configure with the --enable-prec11 argument. Thanks.]])
|
||||||
|
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Checks for library functions.
|
||||||
|
AC_CHECK_MEMBER([struct stat.st_mtim.tv_nsec],
|
||||||
|
[AC_DEFINE([HAVE_STAT_NSEC],[1],[Defined if struct stat has st_mtim.tv_nsec])],
|
||||||
|
[], [#include <sys/stat.h>])
|
||||||
|
|
||||||
|
# Checks for system services
|
||||||
|
|
||||||
|
# Other install directories
|
||||||
pkgdatadir=${datadir}/verilator
|
pkgdatadir=${datadir}/verilator
|
||||||
AC_SUBST(pkgdatadir)
|
AC_SUBST(pkgdatadir)
|
||||||
|
pkgconfigdir=${datadir}/pkgconfig
|
||||||
|
AC_SUBST(pkgconfigdir)
|
||||||
|
|
||||||
AC_OUTPUT(Makefile src/Makefile src/Makefile_obj include/verilated.mk)
|
AC_OUTPUT
|
||||||
|
|
||||||
AC_MSG_RESULT([])
|
AC_MSG_RESULT([])
|
||||||
AC_MSG_RESULT([Now type 'make'])
|
AC_MSG_RESULT([Now type 'make' (or sometimes 'gmake') to build Verilator.])
|
||||||
AC_MSG_RESULT([])
|
AC_MSG_RESULT([])
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
*.1
|
||||||
|
*.html
|
||||||
|
*.pdf
|
||||||
|
Makefile
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
= How to contribute to Verilator
|
||||||
|
|
||||||
|
Thanks for using Verilator! We welcome your contributions in whatever form.
|
||||||
|
|
||||||
|
This contributing document contains some suggestions that may make
|
||||||
|
contributions flow more efficiently.
|
||||||
|
|
||||||
|
==== Did you find a bug?
|
||||||
|
|
||||||
|
* Please **Ensure the bug was not already reported** by searching
|
||||||
|
https://verilator.org/issues[Verilator Issues].
|
||||||
|
|
||||||
|
* If you're unable to find an open issue addressing the problem,
|
||||||
|
https://verilator.org/issues/new[open a new issue].
|
||||||
|
|
||||||
|
** Be sure to include a **code sample** or an **executable test case**
|
||||||
|
demonstrating the bug and expected behavior that is not occurring.
|
||||||
|
|
||||||
|
** The ideal example works against other simulators, and is in the
|
||||||
|
test_regress/t test format, as described in
|
||||||
|
link:internals.adoc[docs/internals].
|
||||||
|
|
||||||
|
==== Did you write a patch that fixes a bug?
|
||||||
|
|
||||||
|
* Please https://verilator.org/issues/new[Open a new issue].
|
||||||
|
|
||||||
|
* You may attach a patch to the issue, or (preferred) may point to a GitHub
|
||||||
|
repository branch within your GitHub account.
|
||||||
|
|
||||||
|
** Verilator uses Travis CI to provide continuous integration. You may
|
||||||
|
want to setup Travis CI on your GitHub branch to ensure your changes
|
||||||
|
keep the tests passing. See link:internals.adoc[docs/internals].
|
||||||
|
|
||||||
|
* Your source-code contributions must be certified as open source, under
|
||||||
|
the https://developercertificate.org/[Developer Certificate of
|
||||||
|
Origin]. On your first contribution, you must either:
|
||||||
|
|
||||||
|
** Have your patch include the addition of your name to
|
||||||
|
link:CONTRIBUTORS[docs/CONTRIBUTORS] (preferred).
|
||||||
|
|
||||||
|
** Use "git -s" as part of your commit. This adds a "signed-of-by"
|
||||||
|
attribute which will certify your contribution as described in the
|
||||||
|
https://github.com/wking/signed-off-by/blob/master/Documentation/SubmittingPatches[Signed-of-By
|
||||||
|
convention].
|
||||||
|
|
||||||
|
** Email, or post in an issue a statement that you certify your
|
||||||
|
contributions.
|
||||||
|
|
||||||
|
** In any of these cases your name will be added to
|
||||||
|
link:CONTRIBUTORS[docs/CONTRIBUTORS] and you are agreeing all future
|
||||||
|
contributions are also certified.
|
||||||
|
|
||||||
|
** We occasionally accept contributions where people do not want their
|
||||||
|
name published. Please email us; you must still certify your
|
||||||
|
contribution using email.
|
||||||
|
|
||||||
|
* Your test contributions are generally considered released into the public
|
||||||
|
domain, unless you request otherwise or put a GNU/Artistic license on
|
||||||
|
your test file.
|
||||||
|
|
||||||
|
* Most important is we get your patch. If you'd like to clean up
|
||||||
|
indentation and related issues ahead of our feedback, that is
|
||||||
|
appreciated; please see the coding conventions in
|
||||||
|
link:internals.adoc[docs/internals].
|
||||||
|
|
||||||
|
==== Do you have questions?
|
||||||
|
|
||||||
|
* Please see FAQ section and rest of the
|
||||||
|
https://verilator.org/verilator_doc.html[Verilator manual],
|
||||||
|
or https://verilator.org/verilator_doc.pdf[Verilator manual (PDF)].
|
||||||
|
|
||||||
|
* Ask any question in the
|
||||||
|
https://verilator.org/forum[Verilator forum].
|
||||||
|
|
||||||
|
==== Code of Conduct
|
||||||
|
|
||||||
|
* Our contributors and participants pledge to make participation in our
|
||||||
|
project and our community a positive experience for everyone. We follow
|
||||||
|
the https://www.contributor-covenant.org/version/1/4/code-of-conduct.html[Contributor
|
||||||
|
Covenant version 1.4].
|
||||||
|
|
||||||
|
Thanks!
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
The contributors listed below have certified their Verilator contributions
|
||||||
|
under the Developer Certificate of Origin
|
||||||
|
(https://developercertificate.org/).
|
||||||
|
|
||||||
|
Please see the Verilator manual for 200+ additional contributors. Thanks to
|
||||||
|
all.
|
||||||
|
|
||||||
|
Ahmed El-Mahmoudy
|
||||||
|
Alex Chadwick
|
||||||
|
Chris Randall
|
||||||
|
Driss Hafdi
|
||||||
|
Eric Rippey
|
||||||
|
Garrett Smith
|
||||||
|
Gianfranco Costamagna
|
||||||
|
Howard Su
|
||||||
|
Iztok Jeras
|
||||||
|
Jeremy Bennett
|
||||||
|
John Coiner
|
||||||
|
Julien Margetts
|
||||||
|
Kanad Kanhere
|
||||||
|
Kevin Kiningham
|
||||||
|
Lukasz Dalek
|
||||||
|
Maarten De Braekeleer
|
||||||
|
Matthew Ballance
|
||||||
|
Mike Popoloski
|
||||||
|
Patrick Stewart
|
||||||
|
Philipp Wagner
|
||||||
|
Richard Myers
|
||||||
|
Sebastien Van Cauwenberghe
|
||||||
|
Stefan Wallentowitz
|
||||||
|
Todd Strader
|
||||||
|
Wilson Snyder
|
||||||
|
Yves Mathieu
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
#*****************************************************************************
|
||||||
|
# DESCRIPTION: Verilator documentation: Makefile pre-configure version
|
||||||
|
#
|
||||||
|
# This file is part of Verilator.
|
||||||
|
#
|
||||||
|
# Code available from: https://verilator.org
|
||||||
|
#
|
||||||
|
#*****************************************************************************
|
||||||
|
#
|
||||||
|
# Copyright 2003-2019 by Wilson Snyder. This program is free software; you can
|
||||||
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
# Version 2.0.
|
||||||
|
#
|
||||||
|
# Verilator is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
#****************************************************************************/
|
||||||
|
#
|
||||||
|
# This file is intended only to be called from the top-level Verilator Makefile.
|
||||||
|
|
||||||
|
#### Start of system configuration section. ####
|
||||||
|
|
||||||
|
ASCIIDOCTOR = asciidoctor
|
||||||
|
DOXYGEN = doxygen
|
||||||
|
|
||||||
|
#### End of system configuration section. ####
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
|
||||||
|
default:
|
||||||
|
@echo "error: make not supported here, run 'make docs' from Verilator top-level"
|
||||||
|
|
||||||
|
%.html: %.adoc
|
||||||
|
$(ASCIIDOCTOR) $< -n -o $@
|
||||||
|
|
||||||
|
clean mostlyclean distclean maintainer-clean::
|
||||||
|
rm -f $(SCRIPTS) *.tmp
|
||||||
|
rm -f *.aux *.cp *.cps *.dvi *.fn *.fns *.ky *.kys *.log
|
||||||
|
rm -f *.pg *.pgs *.toc *.tp *.tps *.vr *.vrs *.idx
|
||||||
|
rm -f *.ev *.evs *.ov *.ovs *.cv *.cvs *.ma *.mas
|
||||||
|
rm -f *.tex
|
||||||
|
|
||||||
|
distclean maintainer-clean::
|
||||||
|
rm -f *.info* *.1 *.html *.pdf $(INFOS)
|
||||||
|
rm -f Makefile
|
||||||
|
|
||||||
|
.PHONY: doxygen
|
||||||
|
|
||||||
|
doxygen:
|
||||||
|
$(DOXYGEN) doxygen.config
|
||||||
@@ -0,0 +1,119 @@
|
|||||||
|
// DESCRIPTION: Verilator: List of To Do issues.
|
||||||
|
//
|
||||||
|
// Copyright 2004-2019 by Wilson Snyder. This program is free software; you can
|
||||||
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
// Version 2.0.
|
||||||
|
|
||||||
|
* Language support:
|
||||||
|
** Fix ordering of each bit separately in a signal (mips)
|
||||||
|
assign b[3:0] = b[7:4]; assign b[7:4] = in;
|
||||||
|
** Support UDP gate primitives/ cell libraries
|
||||||
|
(have code for combos - problem is sequential udps)
|
||||||
|
** Function to eval combo logic after /*verilator public*/ functions [gwaters]
|
||||||
|
** Support generated clocks (correctness)
|
||||||
|
** Recursive functions
|
||||||
|
** Verilog configuration files
|
||||||
|
** Expression coverage (see notes)
|
||||||
|
** Better tristate support
|
||||||
|
** UVM
|
||||||
|
|
||||||
|
* Long-term Features
|
||||||
|
** Assertions
|
||||||
|
** Tristate support
|
||||||
|
|
||||||
|
* Configure/Make/Install
|
||||||
|
** Distribute with flex/bison already expanded?
|
||||||
|
Flex library not needed. Probably too difficult to be worth it.
|
||||||
|
|
||||||
|
* Testing:
|
||||||
|
** Capture all inputs into global "rerun it" file
|
||||||
|
** Code to make wrapper that sets signals, so can do comparison checks
|
||||||
|
** New random program generator
|
||||||
|
** Better graph viewer with search and zoom
|
||||||
|
** Port and test against opencores.org code
|
||||||
|
** // verilator debug in code so can see only tree affecting those nodes
|
||||||
|
|
||||||
|
* Usability:
|
||||||
|
** Detect and pre-remove most UNOPTFLATs
|
||||||
|
** Better reporting of unopt problems, including what lines of code
|
||||||
|
** Report more errors (all of them?) before exiting [Eugene Weber]
|
||||||
|
** Auto-create scons config files
|
||||||
|
** Print version/etc message at runtime. (4.000?)
|
||||||
|
Include number of lines of code, percent comments, code complexity measurement
|
||||||
|
<-80chars------------------------------------------------------------------->
|
||||||
|
Verilator 3.600 - The fast free open-sourced simulator. Copyright 2001-2013.
|
||||||
|
Verilated #### modules, #### instances, ##### sigs,
|
||||||
|
#### non-comment lines, ##### ops, ### KB model size
|
||||||
|
|
||||||
|
* Lint:
|
||||||
|
** CDCRSTLOGIC should allow filtering with paths
|
||||||
|
"waive CDCRSTLOGIC --from a.b.sig --to a.c.sig --via OR"
|
||||||
|
|
||||||
|
* Internal Code:
|
||||||
|
** A Visitor class that understands how to traverse data types
|
||||||
|
** V3Graph should be templated container type, taking in Vertex + Edge types
|
||||||
|
** Instead of string, have an VEncodedString/VIdString which contains __DOT__ish
|
||||||
|
things, to reduce bugs. Also add _20 trailing space to \ encoded names.
|
||||||
|
|
||||||
|
* Runtime:
|
||||||
|
** New evalulation loop ~/src/verilator/notes/event_loop.txt (4.000?)
|
||||||
|
** Remove all private internal functions from top level wrapper header, move
|
||||||
|
to new level
|
||||||
|
** Completely standalone simulation
|
||||||
|
main() records arguments for $test$plusvars
|
||||||
|
instantiates top,
|
||||||
|
does tracing (support $dump?)
|
||||||
|
calls top->simulateForever()
|
||||||
|
exits
|
||||||
|
|
||||||
|
* Performance:
|
||||||
|
** Latch optimizations
|
||||||
|
** Constant propagation
|
||||||
|
Extra cleaning AND: 1 & ((VARREF >> 1) | ((&VARREF >> 1) & VARREF))
|
||||||
|
Extra shift (perhaps due to clean): if (1 & CAST (VARREF >> #))
|
||||||
|
** Gated clock and latch conversion to flops. [JeanPaul Vanitegem]
|
||||||
|
Could propagate the AND into pos/negedges and let domaining optimize.
|
||||||
|
** Negedge reset
|
||||||
|
Switch to remove negedges that don't matter
|
||||||
|
Can't remove async resets from control flops (like in syncronizers)
|
||||||
|
** If all references to array have a constant index, blow up into separate signals-per-index
|
||||||
|
** Bit-multiply for faster bit swapping and a=b[1,3,2] random bit reorderings.
|
||||||
|
** Move _last sets and all other combo logic inside master
|
||||||
|
if() that triggers on all possible sense items
|
||||||
|
** Rewrite and combine V3Life, V3Subst
|
||||||
|
If block temp only ever set in one place to constant, propagate it
|
||||||
|
Used in t_mem for array delayed assignments
|
||||||
|
Replace variables if set later in same cfunc branch
|
||||||
|
See for example duplicate sets of _narrow in cycle 90/91 of t_select_plusloop
|
||||||
|
** Same assignment on both if branches
|
||||||
|
"if (a) { ... b=2; } else { ... b=2;}" -> "b=2; if ..."
|
||||||
|
Careful though, as b could appear in the statement or multiple times in statement
|
||||||
|
(Could just require exatly two 'b's in statement)
|
||||||
|
** Simplify XOR/XNOR/AND/OR bit selection trees
|
||||||
|
Foo = A[1] ^ A[2] ^ A[3] etc are better as ^ ( A & 32'b...1110 )
|
||||||
|
** Combine variables into wider elements
|
||||||
|
Parallel statements on different bits should become single signal
|
||||||
|
Variables that are always consumed in "parallel" can be joined
|
||||||
|
** Duplicate assignments in gate optimization
|
||||||
|
Common to have many separate posedge blocks, each with identical
|
||||||
|
reset_r <= rst_in
|
||||||
|
** If signal is used only once (not counting trace), always gate substitute
|
||||||
|
Don't merge if any combining would form circ logic (out goes back to in)
|
||||||
|
** Multiple assignments each bit can become single assign with concat
|
||||||
|
Make sure a SEL of a CONCAT can get the single bit back.
|
||||||
|
** Usually blocks/values
|
||||||
|
Enable only after certain time, so VL_TIME_I(32) > 0x1e gets eliminated out
|
||||||
|
** Better ordering of a<=b, b<=c, put all refs to 'b' next to each other to optimize caching
|
||||||
|
** I-cache packing improvements (what/how?)
|
||||||
|
** Data cache organization (order of vars in class)
|
||||||
|
First have clocks,
|
||||||
|
then bools instead of uint32_t's
|
||||||
|
then based on what sense list they come from, all outputs, then all inputs
|
||||||
|
finally have any signals part of a "usually" block, or constant.
|
||||||
|
** Rather then tracking widths, have a MSB...LSB of this expression
|
||||||
|
(or better, a bitmask of bits relevant in this expression)
|
||||||
|
** Track recirculation and convert into clock-enables
|
||||||
|
** Clock enables should become new clocking domains for speed
|
||||||
|
** If floped(a) & flopped(b) and no other a&b, then instead flop(a&b).
|
||||||
|
** Sort by output bitselects so can combine more assignments (see DDP example dx_dm signal)
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
/*! \mainpage Verilator Doxygen Documentation
|
||||||
|
*
|
||||||
|
* \section intro_sec Introduction
|
||||||
|
*
|
||||||
|
* This is a full doxygen analysis of the Verilator source tree.
|
||||||
|
*/
|
||||||
+1765
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,294 @@
|
|||||||
|
= Verilator Installation
|
||||||
|
:toc: right
|
||||||
|
|
||||||
|
// Github doesn't render unless absolute URL
|
||||||
|
image::https://www.veripool.org/img/verilator_256_200_min.png[Logo,256,200,role="right"]
|
||||||
|
|
||||||
|
== Introduction
|
||||||
|
|
||||||
|
This discusses how to install Verilator. For more general information
|
||||||
|
please see https://verilator.org[verilator.org].
|
||||||
|
|
||||||
|
== Quick-start
|
||||||
|
|
||||||
|
=== Install From a Package Manager
|
||||||
|
|
||||||
|
Using a distribution's package manager is the easiest way to get
|
||||||
|
started. (Note packages are unlikely to have the most recent version, so
|
||||||
|
Git, below, maybe a better alternative.) To install as a package:
|
||||||
|
|
||||||
|
apt-get install verilator
|
||||||
|
|
||||||
|
If this works, skip down to <<Running Verilator>>.
|
||||||
|
|
||||||
|
=== Git
|
||||||
|
|
||||||
|
Alternatively, installing Verilator with Git provides the most flexibility.
|
||||||
|
For additional options and details see the additional sections below. In
|
||||||
|
brief:
|
||||||
|
|
||||||
|
// Also update README
|
||||||
|
....
|
||||||
|
# Prerequisites:
|
||||||
|
#sudo apt-get install git make autoconf g++ flex bison
|
||||||
|
#sudo apt-get install libfl2 # Ubuntu only (ignore if gives error)
|
||||||
|
#sudo apt-get install libfl-dev # Ubuntu only (ignore if gives error)
|
||||||
|
|
||||||
|
git clone https://git.veripool.org/git/verilator # Only first time
|
||||||
|
## Note the URL above is not a page you can see with a browser, it's for git only
|
||||||
|
|
||||||
|
# Every time you need to build:
|
||||||
|
unsetenv VERILATOR_ROOT # For csh; ignore error if on bash
|
||||||
|
unset VERILATOR_ROOT # For bash
|
||||||
|
cd verilator
|
||||||
|
git pull # Make sure git repository is up-to-date
|
||||||
|
git tag # See what versions exist
|
||||||
|
#git checkout master # Use development branch (e.g. recent bug fixes)
|
||||||
|
#git checkout stable # Use most recent stable release
|
||||||
|
#git checkout v{version} # Switch to specified release version
|
||||||
|
|
||||||
|
autoconf # Create ./configure script
|
||||||
|
./configure
|
||||||
|
make
|
||||||
|
sudo make install
|
||||||
|
# Now see "man verilator" or online verilator.pdf's for the example tutorials
|
||||||
|
....
|
||||||
|
|
||||||
|
If this works, skip down to <<Running Verilator>>.
|
||||||
|
|
||||||
|
== Detailed Build Instructions
|
||||||
|
|
||||||
|
This section describes details of the build process, and assumes you are
|
||||||
|
building from Git or a tarball. For using a pre-built binary for your
|
||||||
|
Linux distribution, see instead <<Install From a Package Manager>>.
|
||||||
|
|
||||||
|
=== OS Requirements
|
||||||
|
|
||||||
|
Verilator is developed and has primary testing on Ubuntu. Versions have
|
||||||
|
also built on Redhat Linux, Apple OS-X, HPUX and Solaris. It should run
|
||||||
|
with minor porting on any GNU/Linux-ish platform. Verilator also works on
|
||||||
|
Windows under Cygwin, and Windows under MinGW (gcc -mno-cygwin). Verilated
|
||||||
|
output (not Verilator itself) compiles under all the options above, plus
|
||||||
|
MSVC++.
|
||||||
|
|
||||||
|
=== Install Prerequisites
|
||||||
|
|
||||||
|
To build Verilator you will need to install some standard packages:
|
||||||
|
|
||||||
|
sudo apt-get install git
|
||||||
|
sudo apt-get install autoconf
|
||||||
|
sudo apt-get install flex bison
|
||||||
|
|
||||||
|
Additionally, to build or run Verilator you need these standard packages:
|
||||||
|
|
||||||
|
sudo apt-get install perl python3
|
||||||
|
sudo apt-get install make
|
||||||
|
sudo apt-get install g++ # Alternatively, clang
|
||||||
|
sudo apt-get install libgz # Non-Ubuntu (ignore if gives error)
|
||||||
|
sudo apt-get install libfl2 libfl-dev zlibc zlib1g zlib1g-dev # Ubuntu only (ignore if gives error)
|
||||||
|
|
||||||
|
Those developing Verilator may also want these (see internals.adoc):
|
||||||
|
|
||||||
|
sudo apt-get install gdb asciidoctor graphviz
|
||||||
|
cpan install Pod::Perldoc
|
||||||
|
cpan install Unix::Processors
|
||||||
|
|
||||||
|
==== Install SystemC
|
||||||
|
|
||||||
|
If you will be using SystemC (vs straight C++ output), download
|
||||||
|
http://www.systemc.org[SystemC]. Follow their installation instructions.
|
||||||
|
You will need to set `SYSTEMC_INCLUDE` to point to the include directory
|
||||||
|
with systemc.h in it, and `SYSTEMC_LIBDIR` to points to the directory with
|
||||||
|
libsystemc.a in it. (Older installations may set `SYSTEMC` and
|
||||||
|
`SYSTEMC_ARCH` instead.)
|
||||||
|
|
||||||
|
==== Install GTKWave
|
||||||
|
|
||||||
|
To make use of Verilator FST tracing you will want
|
||||||
|
http://gtkwave.sourceforge.net/[GTKwave] installed, however this is not
|
||||||
|
required at Verilator build time.
|
||||||
|
|
||||||
|
=== Obtain Sources
|
||||||
|
|
||||||
|
You may use Git or a tarball for the sources. Git is the supported option.
|
||||||
|
(If using a historical build that uses a tarball, tarballs are obtained
|
||||||
|
from https://www.veripool.org/projects/verilator/wiki/Download[Verilator
|
||||||
|
Downloads]; we presume you know how to use it, and is not described here.)
|
||||||
|
|
||||||
|
Get the sources from the repository: (You need do this only once, ever.)
|
||||||
|
|
||||||
|
git clone https://git.veripool.org/git/verilator # Only first time
|
||||||
|
## Note the URL above is not a page you can see with a browser, it's for git only
|
||||||
|
|
||||||
|
Enter the checkout and determine what version/branch to use:
|
||||||
|
|
||||||
|
cd verilator
|
||||||
|
git pull # Make sure we're up-to-date
|
||||||
|
git tag # See what versions exist
|
||||||
|
#git checkout master # Use development branch (e.g. recent bug fix)
|
||||||
|
#git checkout stable # Use most recent release
|
||||||
|
#git checkout v{version} # Switch to specified release version
|
||||||
|
|
||||||
|
=== Auto Configure
|
||||||
|
|
||||||
|
Create the configuration script:
|
||||||
|
|
||||||
|
autoconf # Create ./configure script
|
||||||
|
|
||||||
|
=== Eventual Installation Options
|
||||||
|
|
||||||
|
Before configuring the build, you have to decide how you're going to
|
||||||
|
eventually install the kit. Verilator will be compiling the current value
|
||||||
|
of `VERILATOR_ROOT`, `SYSTEMC_INCLUDE`, and `SYSTEMC_LIBDIR` as defaults
|
||||||
|
into the executable, so they must be correct before configuring.
|
||||||
|
|
||||||
|
These are the options:
|
||||||
|
|
||||||
|
==== 1. Run-in-Place from VERILATOR_ROOT
|
||||||
|
|
||||||
|
Our personal favorite is to always run Verilator in-place from its Git
|
||||||
|
directory. This allows the easiest experimentation and upgrading, and
|
||||||
|
allows many versions of Verilator to co-exist on a system.
|
||||||
|
|
||||||
|
export VERILATOR_ROOT=`pwd` # if your shell is bash
|
||||||
|
setenv VERILATOR_ROOT `pwd` # if your shell is csh
|
||||||
|
./configure
|
||||||
|
# Running will use files from $VERILATOR_ROOT, so no install needed
|
||||||
|
|
||||||
|
Note after installing (below steps), a calling program or shell must set
|
||||||
|
the environment variable `VERILATOR_ROOT` to point to this Git directory,
|
||||||
|
then execute `$VERILATOR_ROOT/bin/verilator`, which will find the path to
|
||||||
|
all needed files.
|
||||||
|
|
||||||
|
==== 2. Install into a CAD Disk
|
||||||
|
|
||||||
|
You may eventually be installing onto a project/company-wide "CAD" tools
|
||||||
|
disk that may support multiple versions of every tool. Target the build to
|
||||||
|
a destination directory name that includes the Verilator version name:
|
||||||
|
|
||||||
|
unset VERILATOR_ROOT # if your shell is bash
|
||||||
|
unsetenv VERILATOR_ROOT # if your shell is csh
|
||||||
|
# For the tarball, use the version number instead of git describe
|
||||||
|
./configure --prefix /CAD_DISK/verilator/`git describe | sed "s/verilator_//"`
|
||||||
|
|
||||||
|
Note after installing (below steps), if you use
|
||||||
|
http://modules.sourceforge.net/[modulecmd], you'll want a module file like
|
||||||
|
the following:
|
||||||
|
|
||||||
|
.modulecmd's verilator/version file
|
||||||
|
----
|
||||||
|
set install_root /CAD_DISK/verilator/{version-number-used-above}
|
||||||
|
unsetenv VERILATOR_ROOT
|
||||||
|
prepend-path PATH $install_root/bin
|
||||||
|
prepend-path MANPATH $install_root/man
|
||||||
|
prepend-path PKG_CONFIG_PATH $install_root/share/pkgconfig
|
||||||
|
----
|
||||||
|
|
||||||
|
==== 3. Install into a Specific Path
|
||||||
|
|
||||||
|
You may eventually install Verilator into a specific installation prefix,
|
||||||
|
as most GNU tools support:
|
||||||
|
|
||||||
|
unset VERILATOR_ROOT # if your shell is bash
|
||||||
|
unsetenv VERILATOR_ROOT # if your shell is csh
|
||||||
|
./configure --prefix /opt/verilator-VERSION
|
||||||
|
|
||||||
|
Then after installing (below steps) you will need to add
|
||||||
|
`/opt/verilator-VERSION/bin` to `$PATH`.
|
||||||
|
|
||||||
|
==== 4. Install System Globally
|
||||||
|
|
||||||
|
The final option is to eventually install Verilator globally, using the
|
||||||
|
normal system paths:
|
||||||
|
|
||||||
|
unset VERILATOR_ROOT # if your shell is bash
|
||||||
|
unsetenv VERILATOR_ROOT # if your shell is csh
|
||||||
|
./configure
|
||||||
|
|
||||||
|
Then after installing (below) the binary directories should already be in
|
||||||
|
your `$PATH`.
|
||||||
|
|
||||||
|
=== Configure
|
||||||
|
|
||||||
|
The command to configure the package was described in the previous step.
|
||||||
|
Developers should configure to have more complete developer tests.
|
||||||
|
Additional packages may be required for these tests.
|
||||||
|
|
||||||
|
export VERILATOR_AUTHOR_SITE=1 # Put in your .bashrc
|
||||||
|
./configure --enable-longtests ...above options...
|
||||||
|
|
||||||
|
=== Compile
|
||||||
|
|
||||||
|
Compile Verilator:
|
||||||
|
|
||||||
|
make -j
|
||||||
|
|
||||||
|
=== Test
|
||||||
|
|
||||||
|
Check the compilation by running self-tests:
|
||||||
|
|
||||||
|
make test
|
||||||
|
|
||||||
|
=== Install
|
||||||
|
|
||||||
|
If you used any but the <<1. Run-in-Place from VERILATOR_ROOT>> scheme,
|
||||||
|
install to the OS-standard place:
|
||||||
|
|
||||||
|
make install
|
||||||
|
|
||||||
|
== Running Verilator
|
||||||
|
|
||||||
|
To run Verilator, see the example sections in the
|
||||||
|
https://verilator.org/verilator_doc.html[Verilator manual (HTML)],
|
||||||
|
or https://verilator.org/verilator_doc.pdf[Verilator manual (PDF)].
|
||||||
|
|
||||||
|
Also see the `examples/` directory that is part of the kit, and is installed
|
||||||
|
(in a OS-specific place, often in e.g. `/usr/local/share/verilator/examples`).
|
||||||
|
|
||||||
|
cd examples/make_hello_c
|
||||||
|
make
|
||||||
|
|
||||||
|
Note if you did a `make install` above you should not have `VERILATOR_ROOT`
|
||||||
|
set in your environment; it is built into the executable.
|
||||||
|
|
||||||
|
== Announcements
|
||||||
|
|
||||||
|
To get notified of new releases, login to
|
||||||
|
https://www.veripool.org[Veripool], and click the "watch" button near the
|
||||||
|
top right under https://www.veripool.org/projects/verilator/news[Verilator
|
||||||
|
News].
|
||||||
|
|
||||||
|
== Directory Structure
|
||||||
|
|
||||||
|
Some relevant files and directories in this package are as follows:
|
||||||
|
|
||||||
|
Changes => Version history
|
||||||
|
README.adoc => This document
|
||||||
|
bin/verilator => Compiler wrapper invoked to Verilate code
|
||||||
|
docs/ => Additional documentation
|
||||||
|
examples/make_hello_c => Example GNU-make simple Verilog->C++ conversion
|
||||||
|
examples/make_hello_sc => Example GNU-make simple Verilog->SystemC conversion
|
||||||
|
examples/make_tracing_c => Example GNU-make Verilog->C++ with tracing
|
||||||
|
examples/make_tracing_sc => Example GNU-make Verilog->SystemC with tracing
|
||||||
|
examples/make_protect_lib => Example using --protect-lib
|
||||||
|
examples/cmake_hello_c => Example building make_hello_c with CMake
|
||||||
|
examples/cmake_hello_sc => Example building make_hello_sc with CMake
|
||||||
|
examples/cmake_tracing_c => Example building make_tracing_c with CMake
|
||||||
|
examples/cmake_tracing_sc => Example building make_tracing_sc with CMake
|
||||||
|
examples/cmake_protect_lib => Example building make_protect_lib with CMake
|
||||||
|
include/ => Files that should be in your -I compiler path
|
||||||
|
include/verilated*.cpp => Global routines to link into your simulator
|
||||||
|
include/verilated*.h => Global headers
|
||||||
|
include/verilated.mk => Common Makefile
|
||||||
|
src/ => Translator source code
|
||||||
|
test_regress => Internal tests
|
||||||
|
|
||||||
|
For files created after a design is Verilated, see the
|
||||||
|
https://verilator.org/verilator_doc.html[Verilator manual (HTML)],
|
||||||
|
or https://verilator.org/verilator_doc.pdf[Verilator manual (PDF)].
|
||||||
|
|
||||||
|
== License
|
||||||
|
|
||||||
|
Copyright 2008-2019 by Wilson Snyder. Verilator is free software; you can
|
||||||
|
redistribute it and/or modify it under the terms of either the GNU Lesser
|
||||||
|
General Public License Version 3 or the Perl Artistic License Version 2.0.
|
||||||
@@ -0,0 +1,978 @@
|
|||||||
|
= Verilator Internals Documentation
|
||||||
|
:toc: right
|
||||||
|
|
||||||
|
// Github doesn't render unless absolute URL
|
||||||
|
image::https://www.veripool.org/img/verilator_256_200_min.png[Logo,256,200,role="right"]
|
||||||
|
|
||||||
|
== Introduction
|
||||||
|
|
||||||
|
This file discusses internal and programming details for Verilator. It's a
|
||||||
|
reference for developers and debugging problems.
|
||||||
|
|
||||||
|
See also the Verilator internals presentation at https://www.veripool.org.
|
||||||
|
|
||||||
|
== Code Flows
|
||||||
|
|
||||||
|
=== Verilator Flow
|
||||||
|
|
||||||
|
The main flow of Verilator can be followed by reading the Verilator.cpp
|
||||||
|
`process()` function:
|
||||||
|
|
||||||
|
. First, the files specified on the command line are read. Reading
|
||||||
|
involves preprocessing, then lexical analysis with Flex and parsing with
|
||||||
|
Bison. This produces an abstract syntax tree (AST) representation of the
|
||||||
|
design, which is what is visible in the .tree files described below.
|
||||||
|
|
||||||
|
. Verilator then makes a series of passes over the AST, progressively
|
||||||
|
refining and optimizing it.
|
||||||
|
|
||||||
|
. Cells in the AST first linked, which will read and parse additional files
|
||||||
|
as above.
|
||||||
|
|
||||||
|
. Functions, variable and other references are linked to their definitions.
|
||||||
|
|
||||||
|
. Parameters are resolved and the design is elaborated.
|
||||||
|
|
||||||
|
. Verilator then performs many additional edits and optimizations on the
|
||||||
|
hierarchical design. This includes coverage, assertions, X elimination,
|
||||||
|
inlining, constant propagation, and dead code elimination.
|
||||||
|
|
||||||
|
. References in the design are then pseudo-flattened. Each module's
|
||||||
|
variables and functions get "Scope" references. A scope reference is an
|
||||||
|
occurrence of that un-flattened variable in the flattened hierarchy. A
|
||||||
|
module that occurs only once in the hierarchy will have a single scope and
|
||||||
|
single VarScope for each variable. A module that occurs twice will have a
|
||||||
|
scope for each occurrence, and two VarScopes for each variable. This
|
||||||
|
allows optimizations to proceed across the flattened design, while still
|
||||||
|
preserving the hierarchy.
|
||||||
|
|
||||||
|
. Additional edits and optimizations proceed on the pseudo-flat design.
|
||||||
|
These include module references, function inlining, loop unrolling,
|
||||||
|
variable lifetime analysis, lookup table creation, always splitting, and
|
||||||
|
logic gate simplifications (pushing inverters, etc).
|
||||||
|
|
||||||
|
. Verilator orders the code. Best case, this results in a single "eval"
|
||||||
|
function which has all always statements flowing from top to bottom with no
|
||||||
|
loops.
|
||||||
|
|
||||||
|
. Verilator mostly removes the flattening, so that code may be shared
|
||||||
|
between multiple invocations of the same module. It localizes variables,
|
||||||
|
combines identical functions, expands macros to C primitives, adds branch
|
||||||
|
prediction hints, and performs additional constant propagation.
|
||||||
|
|
||||||
|
. Verilator finally writes the C++ modules.
|
||||||
|
|
||||||
|
=== Key Classes Used in the Verilator Flow
|
||||||
|
|
||||||
|
==== `AstNode`
|
||||||
|
|
||||||
|
The AST is represented at the top level by the class `AstNode`. This
|
||||||
|
abstract class has derived classes for the individual components
|
||||||
|
(e.g. `AstGenerate` for a generate block) or groups of components
|
||||||
|
(e.g. `AstNodeFTask` for functions and tasks, which in turn has `AstFunc`
|
||||||
|
and `AstTask` as derived classes).
|
||||||
|
|
||||||
|
Each `AstNode` has pointers to up to four children, accessed by the `op1p`
|
||||||
|
through `op4p` methods. These methods are then abstracted in a specific
|
||||||
|
Ast* node class to a more specific name. For example with the `AstIf` node
|
||||||
|
(for `if` statements), `ifsp` calls `op2p` to give the pointer to the AST
|
||||||
|
for the "then" block, while `elsesp` calls `op3p` to give the pointer to
|
||||||
|
the AST for the "else" block, or NULL if there is not one.
|
||||||
|
|
||||||
|
`AstNode` has the concept of a next and previous AST - for example the next
|
||||||
|
and previous statements in a block. Pointers to the AST for these
|
||||||
|
statements (if they exist) can be obtained using the `back` and `next`
|
||||||
|
methods.
|
||||||
|
|
||||||
|
It is useful to remember that the derived class `AstNetlist` is at the top
|
||||||
|
of the tree, so checking for this class is the standard way to see if you
|
||||||
|
are at the top of the tree.
|
||||||
|
|
||||||
|
By convention, each function/method uses the variable `nodep` as a pointer
|
||||||
|
to the `AstNode` currently being processed.
|
||||||
|
|
||||||
|
==== `AstNVisitor`
|
||||||
|
|
||||||
|
The passes are implemented by AST visitor classes. These are implemented
|
||||||
|
by subclasses of the abstract class, `AstNVisitor`. Each pass creates an
|
||||||
|
instance of the visitor class, which in turn implements a method to perform
|
||||||
|
the pass.
|
||||||
|
|
||||||
|
==== `V3Graph`
|
||||||
|
|
||||||
|
A number of passes use graph algorithms, and the class `V3Graph` is
|
||||||
|
provided to represent those graphs. Graphs are directed, and algorithms are
|
||||||
|
provided to manipulate the graphs and to output them in
|
||||||
|
https://www.graphviz.org[GraphViz] dot format. `V3Graph.h` provides
|
||||||
|
documentation of this class.
|
||||||
|
|
||||||
|
==== `V3GraphVertex`
|
||||||
|
|
||||||
|
`V3GraphVertex` is the base class for vertices in a graph. Vertices have
|
||||||
|
an associated `fanout`, `color` and `rank`, which may be used in algorithms
|
||||||
|
for ordering the graph. A generic `user`/`userp` member variable is also
|
||||||
|
provided.
|
||||||
|
|
||||||
|
Virtual methods are provided to specify the name, color, shape and style to
|
||||||
|
be used in dot output. Typically users provide derived classes from
|
||||||
|
`V3GraphVertex` which will reimplement these methods.
|
||||||
|
|
||||||
|
Iterators are provided to access in and out edges. Typically these are used
|
||||||
|
in the form:
|
||||||
|
|
||||||
|
for (V3GraphEdge *edgep = vertexp->inBeginp();
|
||||||
|
edgep;
|
||||||
|
edgep = edgep->inNextp()) {
|
||||||
|
|
||||||
|
==== `V3GraphEdge`
|
||||||
|
|
||||||
|
`V3GraphEdge` is the base class for directed edges between pairs of
|
||||||
|
vertices. Edges have an associated `weight` and may also be made
|
||||||
|
`cutable`. A generic `user`/`userp` member variable is also provided.
|
||||||
|
|
||||||
|
Accessors, `fromp` and `top` return the "from" and "to" vertices
|
||||||
|
respectively.
|
||||||
|
|
||||||
|
Virtual methods are provided to specify the label, color and style to be
|
||||||
|
used in dot output. Typically users provided derived classes from
|
||||||
|
`V3GraphEdge` which will reimplement these methods.
|
||||||
|
|
||||||
|
==== `V3GraphAlg`
|
||||||
|
|
||||||
|
This is the base class for graph algorithms. It implements a `bool` method,
|
||||||
|
`followEdge` which algorithms can use to decide whether an edge is
|
||||||
|
followed. This method returns true if the graph edge has weight greater
|
||||||
|
than one and a user function, `edgeFuncp` (supplied in the constructor)
|
||||||
|
returns `true`.
|
||||||
|
|
||||||
|
A number of predefined derived algorithm classes and access methods are
|
||||||
|
provided and documented in `V3GraphAlg.cpp`.
|
||||||
|
|
||||||
|
=== Multithreaded Mode
|
||||||
|
|
||||||
|
In `--threads` mode, the frontend of the Verilator pipeline is the same as
|
||||||
|
serial mode, up until V3Order.
|
||||||
|
|
||||||
|
`V3Order` builds a fine-grained, statement-level dependency graph that
|
||||||
|
governs the ordering of code within a single `eval()` call. In serial mode,
|
||||||
|
that dependency graph is used to order all statements into a total serial
|
||||||
|
order. In parallel mode, the same dependency graph is the starting point
|
||||||
|
for a partitioner (`V3Partition`).
|
||||||
|
|
||||||
|
The partitioner's goal is to coarsen the fine-grained graph into a coarser
|
||||||
|
graph, while maintaining as much available parallelism as possible. Often
|
||||||
|
the partitioner can transform an input graph with millions of nodes into a
|
||||||
|
coarsened execution graph with a few dozen nodes, while maintaining enough
|
||||||
|
parallelism to take advantage of a modern multicore CPU. Runtime
|
||||||
|
synchronization cost is not prohibitive with so few nodes.
|
||||||
|
|
||||||
|
==== Partitioning
|
||||||
|
|
||||||
|
Our partitioner is similar to the one Vivek Sarkar described in his 1989
|
||||||
|
paper _Partitioning and Scheduling Parallel Programs for Multiprocessors_.
|
||||||
|
|
||||||
|
Let's define some terms:
|
||||||
|
|
||||||
|
==== Par Factor
|
||||||
|
|
||||||
|
The available parallelism or "par-factor" of a DAG is the total cost to
|
||||||
|
execute all nodes, divided by the cost to execute the longest critical path
|
||||||
|
through the graph. This is the speedup you would get from running the graph
|
||||||
|
in parallel, if given infinite CPU cores available and communication and
|
||||||
|
synchronization are zero.
|
||||||
|
|
||||||
|
==== Macro Task
|
||||||
|
|
||||||
|
When the partitioner coarsens the graph, it combines nodes together. Each
|
||||||
|
fine-grained node represents an atomic "task"; combined nodes in the
|
||||||
|
coarsened graph are "macro-tasks". This term comes from Sarkar. Each
|
||||||
|
macro-task executes from start to end on one processor, without any
|
||||||
|
synchronization to any other macro-task during its
|
||||||
|
execution. (Synchronization only happens before the macro-task begins or
|
||||||
|
after it ends.)
|
||||||
|
|
||||||
|
==== Edge Contraction
|
||||||
|
|
||||||
|
Verilator's partitioner, like Sarkar's, primarily relies on "edge
|
||||||
|
contraction" to coarsen the graph. It starts with one macro-task per atomic
|
||||||
|
task and iteratively combines pairs of edge-connected macro-tasks.
|
||||||
|
|
||||||
|
==== Local Critical Path
|
||||||
|
|
||||||
|
Each node in the graph has a "local" critical path. That's the critical
|
||||||
|
path from the start of the graph to the start of the node, plus the node's
|
||||||
|
cost, plus the critical path from the end of the node to the end of the
|
||||||
|
graph.
|
||||||
|
|
||||||
|
Sarkar calls out an important trade-off: coarsening the graph reduces
|
||||||
|
runtime synchronization overhead among the macro-tasks, but it tends to
|
||||||
|
increase the critical path through the graph and thus reduces par-factor.
|
||||||
|
|
||||||
|
Sarkar's partitioner, and ours, chooses pairs of macro-tasks to merge such
|
||||||
|
that the growth in critical path is minimized. Each candidate merge would
|
||||||
|
result in a new node, which would have some local critical path. We choose
|
||||||
|
the candidate that would produce the shortest local critical path. Repeat
|
||||||
|
until par-factor falls to a target threshold. It's a greedy algorithm, and
|
||||||
|
it's not guaranteed to produce the best partition (which Sarkar proves is
|
||||||
|
NP-hard).
|
||||||
|
|
||||||
|
==== Estimating Logic Costs
|
||||||
|
|
||||||
|
To compute the cost of any given path through the graph, Verilator
|
||||||
|
estimates an execution cost for each task. Each macro-task has an execution
|
||||||
|
cost which is simply the sum of its tasks' costs. We assume that
|
||||||
|
communication overhead and synchronization overhead are zero, so the cost
|
||||||
|
of any given path through the graph is simply the sum of macro-task
|
||||||
|
execution costs. Sarkar does almost the same thing, except that he has
|
||||||
|
nonzero estimates for synchronization costs.
|
||||||
|
|
||||||
|
Verilator's cost estimates are assigned by `InstrCountCostVisitor`. This
|
||||||
|
class is perhaps the most fragile piece of the multithread implementation.
|
||||||
|
It's easy to have a bug where you count something cheap (eg. accessing one
|
||||||
|
element of a huge array) as if it were expensive (eg. by counting it as if
|
||||||
|
it were an access to the entire array.) Even without such gross bugs, the
|
||||||
|
estimates this produce are only loosely predictive of actual runtime cost.
|
||||||
|
Multithread performance would be better with better runtime costs
|
||||||
|
estimates. This is an area to improve.
|
||||||
|
|
||||||
|
==== Scheduling Macro-Tasks at Runtime
|
||||||
|
|
||||||
|
After coarsening the graph, we must schedule the macro-tasks for runtime.
|
||||||
|
Sarkar describes two options: you can dynamically schedule tasks at
|
||||||
|
runtime, with a runtime graph follower. Sarkar calls this the
|
||||||
|
"macro-dataflow model." Verilator does not support this; early experiments
|
||||||
|
with this approach had poor performance.
|
||||||
|
|
||||||
|
The other option is to statically assign macro-tasks to threads, with each
|
||||||
|
thread running its macro-tasks in a static order. Sarkar describes this in
|
||||||
|
Chapter 5. Verilator takes this static approach. The only dynamic aspect is
|
||||||
|
that each macro task may block before starting, to wait until its
|
||||||
|
prerequisites on other threads have finished.
|
||||||
|
|
||||||
|
The synchronization cost is cheap if the prereqs are done. If they're not,
|
||||||
|
fragmentation (idle CPU cores waiting) is possible. This is the major
|
||||||
|
source of overhead in this approach. The `--prof-threads` switch and the
|
||||||
|
`verilator_gantt` script can visualize the time lost to such fragmentation.
|
||||||
|
|
||||||
|
==== Locating Variables for Best Spatial Locality
|
||||||
|
|
||||||
|
After scheduling all code, we attempt to locate variables in memory such
|
||||||
|
that variables accessed by a single macro-task are close together in
|
||||||
|
memory. This provides "spatial locality" -- when we pull in a 64-byte
|
||||||
|
cache line to access a 2-byte variable, we want the other 62 bytes to be
|
||||||
|
ones we'll also likely access soon, for best cache performance.
|
||||||
|
|
||||||
|
This turns out to be critical for performance. It should allow Verilator to
|
||||||
|
scale to very large models. We don't rely on our working set fitting in any
|
||||||
|
CPU cache; instead we essentially "stream" data into caches from
|
||||||
|
memory. It's not literally streaming, where the address increases
|
||||||
|
monotonically, but it should have similar performance characteristics, so
|
||||||
|
long as each macro-task's dataset fits in one core's local caches.
|
||||||
|
|
||||||
|
To achieve spatial locality, we tag each variable with the set of
|
||||||
|
macro-tasks that access it. Let's call this set the "footprint" of that
|
||||||
|
variable. The variables in a given module have a set of footprints. We can
|
||||||
|
order those footprints to minimize the distance between them (distance is
|
||||||
|
the number of macro-tasks that are different across any two footprints) and
|
||||||
|
then emit all variables into the struct in ordered-footprint order.
|
||||||
|
|
||||||
|
The footprint ordering is literally the traveling salesman problem, and we
|
||||||
|
use a TSP-approximation algorithm to get close to an optimal sort.
|
||||||
|
|
||||||
|
This is an old idea. Simulators designed at DEC in the early 1990s used
|
||||||
|
similar techniques to optimize both single-thread and multi-thread modes.
|
||||||
|
(Verilator does not optimize variable placement for spatial locality in
|
||||||
|
serial mode; that is a possible area for improvement.)
|
||||||
|
|
||||||
|
==== Improving Multithreaded Performance Further (a TODO list)
|
||||||
|
|
||||||
|
===== Wave Scheduling
|
||||||
|
|
||||||
|
To allow the Verilated model to run in parallel with the testbench, it
|
||||||
|
might be nice to support "wave" scheduling, in which work on a cycle begins
|
||||||
|
before `eval()` is called or continues after `eval()` returns. For now all
|
||||||
|
work on a cycle happens during the `eval()` call, leaving Verilator's
|
||||||
|
threads idle while the testbench (everything outside `eval()`) is
|
||||||
|
working. This would involve fundamental changes within the partitioner,
|
||||||
|
however, it's probably the best bet for hiding testbench latency.
|
||||||
|
|
||||||
|
===== Efficient Dynamic Scheduling
|
||||||
|
|
||||||
|
To scale to more than a few threads, we may revisit a fully dynamic
|
||||||
|
scheduler. For large (>16 core) systems it might make sense to dedicate an
|
||||||
|
entire core to scheduling, so that scheduler data structures would fit in
|
||||||
|
its L1 cache and thus the cost of traversing priority-ordered ready lists
|
||||||
|
would not be prohibitive.
|
||||||
|
|
||||||
|
===== Static Scheduling with Runtime Repack
|
||||||
|
|
||||||
|
We could modify the static scheduling approach by gathering actual
|
||||||
|
macro-task execution times at run time, and dynamically re-packing the
|
||||||
|
macro-tasks into the threads also at run time. Say, re-pack once every
|
||||||
|
10,000 cycles or something. This has the potential to do better than our
|
||||||
|
static estimates about macro-task run times. It could potentially react to
|
||||||
|
CPU cores that aren't performing equally, due to NUMA or thermal throttling
|
||||||
|
or nonuniform competing memory traffic or whatever.
|
||||||
|
|
||||||
|
===== Clock Domain Balancing
|
||||||
|
|
||||||
|
Right now Verilator makes no attempt to balance clock domains across
|
||||||
|
macro-tasks. For a multi-domain model, that could lead to bad gantt chart
|
||||||
|
fragmentation. This could be improved if it's a real problem in practice.
|
||||||
|
|
||||||
|
===== Other Forms of MTask Balancing
|
||||||
|
|
||||||
|
The largest source of runtime overhead is idle CPUs, which happens due to
|
||||||
|
variance between our predicted runtime for each MTask and its actual
|
||||||
|
runtime. That variance is magnified if MTasks are homogeneous, containing
|
||||||
|
similar repeating logic which was generally close together in source code
|
||||||
|
and which is still packed together even after going through Verilator's
|
||||||
|
digestive tract.
|
||||||
|
|
||||||
|
If Verilator could avoid doing that, and instead would take source logic
|
||||||
|
that was close together and distribute it across MTasks, that would
|
||||||
|
increase the diversity of any given MTask, and this should reduce variance
|
||||||
|
in the cost estimates.
|
||||||
|
|
||||||
|
One way to do that might be to make various "tie breaker" comparison
|
||||||
|
routines in the sources to rely more heavily on randomness, and generally
|
||||||
|
try harder not to keep input nodes together when we have the option to
|
||||||
|
scramble things.
|
||||||
|
|
||||||
|
===== Performance Regression
|
||||||
|
|
||||||
|
It would be nice if we had a regression of large designs, with some
|
||||||
|
diversity of design styles, to test on both single- and multi-threaded
|
||||||
|
modes. This would help to avoid performance regressions, and also to
|
||||||
|
evaluate the optimizations while minimizing the impact of parasitic noise.
|
||||||
|
|
||||||
|
===== Per-Instance Classes
|
||||||
|
|
||||||
|
If we have multiple instances of the same module, and they partition
|
||||||
|
differently (likely; we make no attempt to partition them the same) then
|
||||||
|
the variable sort will be suboptimal for either instance. A possible
|
||||||
|
improvement would be to emit a unique class for each instance of a module,
|
||||||
|
and sort its variables optimally for that instance's code stream.
|
||||||
|
|
||||||
|
=== Verilated Flow
|
||||||
|
|
||||||
|
The evaluation loop outputted by Verilator is designed to allow a single
|
||||||
|
function to perform evaluation under most situations.
|
||||||
|
|
||||||
|
On the first evaluation, the Verilated code calls initial blocks, and then
|
||||||
|
"settles" the modules, by evaluating functions (from always statements)
|
||||||
|
until all signals are stable.
|
||||||
|
|
||||||
|
On other evaluations, the Verilated code detects what input signals have
|
||||||
|
changes. If any are clocks, it calls the appropriate sequential functions
|
||||||
|
(from `always @ posedge` statements). Interspersed with sequential functions
|
||||||
|
it calls combo functions (from `always @*`). After this is complete, it
|
||||||
|
detects any changes due to combo loops or internally generated clocks, and
|
||||||
|
if one is found must reevaluate the model again.
|
||||||
|
|
||||||
|
For SystemC code, the `eval()` function is wrapped in a SystemC
|
||||||
|
`SC_METHOD`, sensitive to all inputs. (Ideally it would only be sensitive
|
||||||
|
to clocks and combo inputs, but tracing requires all signals to cause
|
||||||
|
evaluation, and the performance difference is small.)
|
||||||
|
|
||||||
|
If tracing is enabled, a callback examines all variables in the design for
|
||||||
|
changes, and writes the trace for each change. To accelerate this process
|
||||||
|
the evaluation process records a bitmask of variables that might have
|
||||||
|
changed; if clear, checking those signals for changes may be skipped.
|
||||||
|
|
||||||
|
== Coding Conventions
|
||||||
|
|
||||||
|
=== Indentation and Naming Style
|
||||||
|
|
||||||
|
We will work with contributors to fix up indentation style issues, but it
|
||||||
|
is appreciated if you could match our style:
|
||||||
|
|
||||||
|
* All files should contain the magic header to insure standard indentation:
|
||||||
|
+
|
||||||
|
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
||||||
|
+
|
||||||
|
This sets indentation to the `cc-mode` defaults. (Verilator predates a
|
||||||
|
CC-mode change of several years ago which overrides the defaults with GNU
|
||||||
|
style indentation; the `c-set-style` undoes that.)
|
||||||
|
|
||||||
|
* Use 4 spaces per level, and no tabs.
|
||||||
|
|
||||||
|
* Use 2 spaces between the end of source and the beginning of a comment.
|
||||||
|
|
||||||
|
* Use 1 space after if/for/switch/while and similar keywords.
|
||||||
|
|
||||||
|
* No spaces before semicolons, nor between a function's name and open
|
||||||
|
parenthesis (only applies to functions; if/else has a following space).
|
||||||
|
|
||||||
|
* Use "mixedCapsSymbols" instead of "underlined_symbols".
|
||||||
|
|
||||||
|
* Uas a "p" suffix on variables that are pointers, e.g. "nodep".
|
||||||
|
|
||||||
|
* Comment every member variable.
|
||||||
|
|
||||||
|
=== The `astgen` Script
|
||||||
|
|
||||||
|
Some of the code implementing passes is extremely repetitive, and must be
|
||||||
|
implemented for each sub-class of `AstNode`. However, while repetitive,
|
||||||
|
there is more variability than can be handled in C++ macros.
|
||||||
|
|
||||||
|
In Verilator this is implemented by using a Perl script, `astgen` to
|
||||||
|
pre-process the C++ code. For example in `V3Const.cpp` this is used to
|
||||||
|
implement the `visit()` functions for each binary operation using the
|
||||||
|
`TREEOP` macro.
|
||||||
|
|
||||||
|
The original C++ source code is transformed into C++ code in the `obj_opt`
|
||||||
|
and `obj_dbg` sub-directories (the former for the optimized version of
|
||||||
|
Verilator, the latter for the debug version). So for example `V3Const.cpp`
|
||||||
|
into `V3Const__gen.cpp`.
|
||||||
|
|
||||||
|
=== Visitor Functions
|
||||||
|
|
||||||
|
Verilator uses the "Visitor" design pattern to implement its refinement and
|
||||||
|
optimization passes. This allows separation of the pass algorithm from the
|
||||||
|
AST on which it operates. Wikipedia provides an introduction to the concept
|
||||||
|
at https://en.wikipedia.org/wiki/Visitor_pattern.
|
||||||
|
|
||||||
|
As noted above, all visitors are derived classes of `AstNVisitor`. All
|
||||||
|
derived classes of `AstNode` implement the `accept` method, which takes as
|
||||||
|
argument a reference to an instance or a `AstNVisitor` derived class and
|
||||||
|
applies the visit method of the `AstNVisitor` to the invoking AstNode
|
||||||
|
instance (i.e. `this`).
|
||||||
|
|
||||||
|
One possible difficulty is that a call to `accept` may perform an edit
|
||||||
|
which destroys the node it receives as argument. The
|
||||||
|
`acceptSubtreeReturnEdits` method of `AstNode` is provided to apply
|
||||||
|
`accept` and return the resulting node, even if the original node is
|
||||||
|
destroyed (if it is not destroyed it will just return the original node).
|
||||||
|
|
||||||
|
The behavior of the visitor classes is achieved by overloading the `visit`
|
||||||
|
function for the different `AstNode` derived classes. If a specific
|
||||||
|
implementation is not found, the system will look in turn for overloaded
|
||||||
|
implementations up the inheritance hierarchy. For example calling `accept`
|
||||||
|
on `AstIf` will look in turn for:
|
||||||
|
|
||||||
|
void visit(AstIf* nodep)
|
||||||
|
void visit(AstNodeIf* nodep)
|
||||||
|
void visit(AstNodeStmt* nodep)
|
||||||
|
void visit(AstNode* nodep)
|
||||||
|
|
||||||
|
There are three ways data is passed between visitor functions.
|
||||||
|
|
||||||
|
1. A visitor-class member variable. This is generally for passing "parent"
|
||||||
|
information down to children. `m_modp` is a common example. It's set to
|
||||||
|
NULL in the constructor, where that node (`AstModule` visitor) sets it,
|
||||||
|
then the children are iterated, then it's cleared. Children under an
|
||||||
|
`AstModule` will see it set, while nodes elsewhere will see it clear. If
|
||||||
|
there can be nested items (for example an `AstFor` under an `AstFor`) the
|
||||||
|
variable needs to be save-set-restored in the `AstFor` visitor, otherwise
|
||||||
|
exiting the lower for will lose the upper for's setting.
|
||||||
|
|
||||||
|
2. User attributes. Each `AstNode` (*Note.* The AST node, not the visitor)
|
||||||
|
has five user attributes, which may be accessed as an integer using the
|
||||||
|
`user1()` through `user5()` methods, or as a pointer (of type `AstNUser`)
|
||||||
|
using the `user1p()` through `user5p()` methods (a common technique lifted
|
||||||
|
from graph traversal packages).
|
||||||
|
+
|
||||||
|
A visitor first clears the one it wants to use by calling
|
||||||
|
`AstNode::user#ClearTree()`, then it can mark any node's `user#()` with whatever
|
||||||
|
data it wants. Readers just call `nodep->user()`, but may need to cast
|
||||||
|
appropriately, so you'll often see `VN_CAST(nodep->userp(), SOMETYPE)`.
|
||||||
|
At the top of each visitor are comments describing how the `user()` stuff
|
||||||
|
applies to that visitor class. For example:
|
||||||
|
+
|
||||||
|
// NODE STATE
|
||||||
|
// Cleared entire netlist
|
||||||
|
// AstModule::user1p() // bool. True to inline this module
|
||||||
|
+
|
||||||
|
This says that at the `AstNetlist` `user1ClearTree()` is called. Each
|
||||||
|
`AstModule`'s `user1()` is used to indicate if we're going to inline it.
|
||||||
|
+
|
||||||
|
These comments are important to make sure a `user#()` on a given `AstNode`
|
||||||
|
type is never being used for two different purposes.
|
||||||
|
+
|
||||||
|
Note that calling `user#ClearTree` is fast, it doesn't walk the tree, so
|
||||||
|
it's ok to call fairly often. For example, it's commonly called on every
|
||||||
|
module.
|
||||||
|
|
||||||
|
3. Parameters can be passed between the visitors in close to the "normal"
|
||||||
|
function caller to callee way. This is the second `vup` parameter of type
|
||||||
|
`AstNUser` that is ignored on most of the visitor functions. V3Width does
|
||||||
|
this, but it proved more messy than the above and is deprecated. (V3Width
|
||||||
|
was nearly the first module written. Someday this scheme may be removed,
|
||||||
|
as it slows the program down to have to pass vup everywhere.)
|
||||||
|
|
||||||
|
=== Iterators
|
||||||
|
|
||||||
|
`AstNVisitor` provides a set of iterators to facilitate walking over the
|
||||||
|
tree. Each operates on the current `AstNVisitor` class (as this) and takes
|
||||||
|
an argument type `AstNode*`.
|
||||||
|
|
||||||
|
`iterate`::
|
||||||
|
|
||||||
|
Applies the `accept` method of the `AstNode` to the visitor function.
|
||||||
|
|
||||||
|
`iterateAndNextIgnoreEdit`::
|
||||||
|
|
||||||
|
Applies the `accept` method of each `AstNode` in a list (i.e. connected by
|
||||||
|
`nextp` and `backp` pointers).
|
||||||
|
|
||||||
|
`iterateAndNextNull`::
|
||||||
|
|
||||||
|
Applies the `accept` method of each `AstNode` in a list, only if the
|
||||||
|
provided node is non-NULL. If a node is edited by the call to `accept`,
|
||||||
|
apply `accept` again, until the node does not change.
|
||||||
|
|
||||||
|
`iterateListBackwards`::
|
||||||
|
|
||||||
|
Applies the `accept` method of each `AstNode` in a list, starting with the
|
||||||
|
last one.
|
||||||
|
|
||||||
|
`iterateChildren`::
|
||||||
|
|
||||||
|
Applies the `iterateAndNextNull` method on each child `op1p` through `op4p`
|
||||||
|
in turn.
|
||||||
|
|
||||||
|
`iterateChildrenBackwards`::
|
||||||
|
|
||||||
|
Applies the `iterateListBackwards` method on each child `op1p` through
|
||||||
|
`op4p` in turn.
|
||||||
|
|
||||||
|
==== Caution on Using Iterators When Child Changes
|
||||||
|
|
||||||
|
Visitors often replace one node with another node; V3Width and V3Const are
|
||||||
|
major examples. A visitor which is the parent of such a replacement needs
|
||||||
|
to be aware that calling iteration may cause the children to change. For
|
||||||
|
example:
|
||||||
|
|
||||||
|
// nodep->lhsp() is 0x1234000
|
||||||
|
iterateAndNextNull(nodep->lhsp()); // and under covers nodep->lhsp() changes
|
||||||
|
// nodep->lhsp() is 0x5678400
|
||||||
|
iterateAndNextNull(nodep->lhsp());
|
||||||
|
|
||||||
|
Will work fine, as even if the first iterate causes a new node to take the
|
||||||
|
place of the `lhsp()`, that edit will update `nodep->lhsp()` and the second
|
||||||
|
call will correctly see the change. Alternatively:
|
||||||
|
|
||||||
|
lp = nodep->lhsp();
|
||||||
|
// nodep->lhsp() is 0x1234000, lp is 0x1234000
|
||||||
|
iterateAndNextNull(lp); **lhsp=NULL;** // and under covers nodep->lhsp() changes
|
||||||
|
// nodep->lhsp() is 0x5678400, lp is 0x1234000
|
||||||
|
iterateAndNextNull(lp);
|
||||||
|
|
||||||
|
This will cause bugs or a core dump, as lp is a dangling pointer. Thus it
|
||||||
|
is advisable to set lhsp=NULL shown in the *'s above to make sure these
|
||||||
|
dangles are avoided. Another alternative used in special cases mostly in
|
||||||
|
V3Width is to use acceptSubtreeReturnEdits, which operates on a single node
|
||||||
|
and returns the new pointer if any. Note acceptSubtreeReturnEdits does not
|
||||||
|
follow `nextp()` links.
|
||||||
|
|
||||||
|
lp = acceptSubtreeReturnEdits(lp)
|
||||||
|
|
||||||
|
=== Identifying Derived Classes
|
||||||
|
|
||||||
|
A common requirement is to identify the specific `AstNode` class we are
|
||||||
|
dealing with. For example a visitor might not implement separate `visit`
|
||||||
|
methods for `AstIf` and `AstGenIf`, but just a single method for the base
|
||||||
|
class:
|
||||||
|
|
||||||
|
void visit (AstNodeIf* nodep)
|
||||||
|
|
||||||
|
However that method might want to specify additional code if it is called
|
||||||
|
for `AstGenIf`. Verilator does this by providing a `VN_IS` method for each
|
||||||
|
possible node type, which returns true if the node is of that type (or
|
||||||
|
derived from that type). So our `visit` method could use:
|
||||||
|
|
||||||
|
if (VN_IS(nodep, AstGenIf) {
|
||||||
|
<code specific to AstGenIf>
|
||||||
|
}
|
||||||
|
|
||||||
|
Additionally the `VN_CAST` method converts pointers similar to C++
|
||||||
|
`dynamic_cast`. This either returns a pointer to the object cast to that
|
||||||
|
type (if it is of class `SOMETYPE`, or a derived class of `SOMETYPE`) or
|
||||||
|
else NULL. (However, for true/false tests use `VN_IS` as that is faster.)
|
||||||
|
|
||||||
|
== Testing
|
||||||
|
|
||||||
|
For an overview of how to write a test see the BUGS section of the
|
||||||
|
Verilator primary manual.
|
||||||
|
|
||||||
|
It is important to add tests for failures as well as success (for example
|
||||||
|
to check that an error message is correctly triggered).
|
||||||
|
|
||||||
|
Tests that fail should by convention have the suffix `_bad` in their name,
|
||||||
|
and include `fails = 1` in either their `compile` or `execute` step as
|
||||||
|
appropriate.
|
||||||
|
|
||||||
|
=== Preparing to Run Tests
|
||||||
|
|
||||||
|
For all tests to pass you must install the following packages:
|
||||||
|
|
||||||
|
* SystemC to compile the SystemC outputs, see http://systemc.org
|
||||||
|
|
||||||
|
* Parallel::Forker from CPAN to run tests in parallel, you can install this
|
||||||
|
with e.g. "sudo cpan install Parallel::Forker".
|
||||||
|
|
||||||
|
* vcddiff to find differences in VCD outputs. See the readme at
|
||||||
|
https://github.com/veripool/vcddiff
|
||||||
|
|
||||||
|
=== Controlling the Test Driver
|
||||||
|
|
||||||
|
Test drivers are written in PERL. All invoke the main test driver script,
|
||||||
|
which can provide detailed help on all the features available when writing
|
||||||
|
a test driver.
|
||||||
|
|
||||||
|
test_regress/t/driver.pl --help
|
||||||
|
|
||||||
|
For convenience, a summary of the most commonly used features is provided
|
||||||
|
here. All drivers require a call to `compile` subroutine to compile the
|
||||||
|
test. For run-time tests, this is followed by a call to the `execute`
|
||||||
|
subroutine. Both of these functions can optionally be provided with a hash
|
||||||
|
table as argument specifying additional options.
|
||||||
|
|
||||||
|
The test driver assumes by default that the source Verilog file name
|
||||||
|
matches the PERL driver name. So a test whose driver is `t/t_mytest.pl`
|
||||||
|
will expect a Verilog source file `t/t_mytest.v`. This can be changed
|
||||||
|
using the `top_filename` subroutine, for example
|
||||||
|
|
||||||
|
top_filename("t/t_myothertest.v");
|
||||||
|
|
||||||
|
By default all tests will run with major simulators (Icarus Verilog, NC,
|
||||||
|
VCS, ModelSim, etc) as well as Verilator, to allow results to be
|
||||||
|
compared. However if you wish a test only to be used with Verilator, you
|
||||||
|
can use the following:
|
||||||
|
|
||||||
|
scenarios(vlt => 1);
|
||||||
|
|
||||||
|
Of the many options that can be set through arguments to `compiler` and
|
||||||
|
`execute`, the following are particularly useful:
|
||||||
|
|
||||||
|
`verilator_flags2`::
|
||||||
|
|
||||||
|
A list of flags to be passed to verilator when compiling.
|
||||||
|
|
||||||
|
`fails`::
|
||||||
|
|
||||||
|
Set to 1 to indicate that the compilation or execution is intended to fail.
|
||||||
|
|
||||||
|
For example the following would specify that compilation requires two
|
||||||
|
defines and is expected to fail.
|
||||||
|
|
||||||
|
compile (
|
||||||
|
verilator_flags2 => ["-DSMALL_CLOCK -DGATED_COMMENT"],
|
||||||
|
fails => 1,
|
||||||
|
);
|
||||||
|
|
||||||
|
=== Regression Testing for Developers
|
||||||
|
|
||||||
|
Developers will also want to call ./configure with two extra flags:
|
||||||
|
|
||||||
|
`--enable-ccwarn`::
|
||||||
|
|
||||||
|
Causes the build to stop on warnings as well as errors. A good way to
|
||||||
|
ensure no sloppy code gets added, however it can be painful when it comes
|
||||||
|
to testing, since third party code used in the tests (e.g. SystemC) may not
|
||||||
|
be warning free.
|
||||||
|
|
||||||
|
`--enable-longtests`::
|
||||||
|
|
||||||
|
In addition to the standard C, SystemC examples, also run the tests in the
|
||||||
|
`test_regress` directory when using _make test_'. This is disabled by
|
||||||
|
default as SystemC installation problems would otherwise falsely indicate a
|
||||||
|
Verilator problem.
|
||||||
|
|
||||||
|
When enabling the long tests, some additional PERL modules are needed,
|
||||||
|
which you can install using cpan.
|
||||||
|
|
||||||
|
cpan install Unix::Processors
|
||||||
|
|
||||||
|
There are some traps to avoid when running regression tests
|
||||||
|
|
||||||
|
* When checking the MANIFEST, the test will barf on unexpected code in the
|
||||||
|
Verilator tree. So make sure to keep any such code outside the tree.
|
||||||
|
|
||||||
|
* Not all Linux systems install Perldoc by default. This is needed for the
|
||||||
|
`--help_' option to Verilator, and also for regression testing. This can be
|
||||||
|
installed using cpan:
|
||||||
|
+
|
||||||
|
cpan install Pod::Perldoc
|
||||||
|
+
|
||||||
|
Many Linux systems also offer a standard package for this. Red
|
||||||
|
Hat/Fedora/Centos offer _perl-Pod-Perldoc_', while Debian/Ubuntu/Linux Mint
|
||||||
|
offer `perl-doc'.
|
||||||
|
|
||||||
|
* Running regression may exhaust resources on some Linux systems,
|
||||||
|
particularly file handles and user processes. Increase these to
|
||||||
|
respectively 16,384 and 4,096. The method of doing this is system
|
||||||
|
dependent, but on Fedora Linux it would require editing the
|
||||||
|
`/etc/security/limits.conf` file as root.
|
||||||
|
|
||||||
|
=== Continuous Integration
|
||||||
|
|
||||||
|
Verilator has a https://travis-ci.com/verilator/verilator[Travis CI environment]
|
||||||
|
which automatically tests the master branch for test failures on new commits. It
|
||||||
|
also runs a daily cron job to validate all of the tests against different OS and
|
||||||
|
compiler versions.
|
||||||
|
|
||||||
|
Developers can connect Travis CI to their GitHub account so that the CI
|
||||||
|
environment can check their branches too by doing the following:
|
||||||
|
|
||||||
|
* Go to https://github.com/marketplace/travis-ci and follow the prompts
|
||||||
|
|
||||||
|
* Only the Open Source (FREE) version of Travis CI is required
|
||||||
|
|
||||||
|
* Under a Travis CI project click More options > Settings in order to set up a
|
||||||
|
cron job on a particular branch
|
||||||
|
|
||||||
|
=== Fuzzing
|
||||||
|
|
||||||
|
There are scripts included to facilitate fuzzing of Verilator. These have
|
||||||
|
been successfully used to find a number of bugs in the frontend.
|
||||||
|
|
||||||
|
The scripts are based on using http://lcamtuf.coredump.cx/afl/[American fuzzy lop]
|
||||||
|
on a Debian-like system.
|
||||||
|
|
||||||
|
To get started, cd to "nodist/fuzzer/" and run "./all". A sudo password
|
||||||
|
may be required to setup the system for fuzzing.
|
||||||
|
|
||||||
|
== Debugging
|
||||||
|
|
||||||
|
=== --debug
|
||||||
|
|
||||||
|
When you run with `--debug` there are two primary output file types placed
|
||||||
|
into the obj_dir, .tree and .dot files.
|
||||||
|
|
||||||
|
=== .dot Output
|
||||||
|
|
||||||
|
Dot files are dumps of internal graphs in
|
||||||
|
https://www.graphviz.org[Graphviz] dot format. When a dot file is dumped,
|
||||||
|
Verilator will also print a line on stdout that can be used to format the
|
||||||
|
output, for example:
|
||||||
|
|
||||||
|
dot -Tps -o ~/a.ps obj_dir/Vtop_foo.dot
|
||||||
|
|
||||||
|
You can then print a.ps. You may prefer gif format, which doesn't get
|
||||||
|
scaled so can be more useful with large graphs.
|
||||||
|
|
||||||
|
For dynamic graph viewing consider
|
||||||
|
http://zvtm.sourceforge.net/zgrviewer.html[ZGRViewer]. If you know of
|
||||||
|
better viewers let us know; ZGRViewer isn't great for large graphs.
|
||||||
|
|
||||||
|
=== .tree Output
|
||||||
|
|
||||||
|
Tree files are dumps of the AST Tree and are produced between every major
|
||||||
|
algorithmic stage. An example:
|
||||||
|
|
||||||
|
NETLIST 0x90fb00 <e1> {a0}
|
||||||
|
1: MODULE 0x912b20 <e8822> {a8} top L2 [P]
|
||||||
|
*1:2: VAR 0x91a780 <e74#> {a22} @dt=0xa2e640(w32) out_wide [O] WIRE
|
||||||
|
1:2:1: BASICDTYPE 0xa2e640 <e2149> {e24} @dt=this(sw32) integer kwd=integer range=[31:0]
|
||||||
|
|
||||||
|
The following summarizes the above example dump, with more detail on each
|
||||||
|
field in the section below.
|
||||||
|
|
||||||
|
[cols="20%,80%"]
|
||||||
|
|===
|
||||||
|
|
||||||
|
|`1:2:` | indicates the hierarchy of the `VAR` is the `op2p` pointer under
|
||||||
|
the `MODULE`, which in turn is the `op1p` pointer under the `NETLIST`
|
||||||
|
|
||||||
|
|`VAR` | is the AstNodeType.
|
||||||
|
|
||||||
|
| `0x91a780` | is the address of this node.
|
||||||
|
|
||||||
|
| `<e74>` | means the 74th edit to the netlist was the last modification to
|
||||||
|
this node.
|
||||||
|
|
||||||
|
| `{a22}` | indicates this node is related to line 22 in the source filename
|
||||||
|
"a", where "a" is the first file read, "z" the 26th, and "aa" the 27th.
|
||||||
|
|
||||||
|
| `@dt=0x...` | indicates the address of the data type this node contains.
|
||||||
|
|
||||||
|
| `w32` | indicates the width is 32 bits.
|
||||||
|
|
||||||
|
| `out_wide` | is the name of the node, in this case the name of the variable.
|
||||||
|
|
||||||
|
| `[O]` | are flags which vary with the type of node, in this case it means the
|
||||||
|
variable is an output.
|
||||||
|
|
||||||
|
|===
|
||||||
|
|
||||||
|
In more detail the following fields are dumped common to all nodes. They
|
||||||
|
are produced by the `AstNode::dump()` method:
|
||||||
|
|
||||||
|
Tree Hierarchy::
|
||||||
|
|
||||||
|
The dump lines begin with numbers and colons to indicate the child node
|
||||||
|
hierarchy. As noted above, `AstNode` has lists of items at the same level
|
||||||
|
in the AST, connected by the `nextp()` and `prevp()` pointers. These appear
|
||||||
|
as nodes at the same level. For example after inlining:
|
||||||
|
|
||||||
|
NETLIST 0x929c1c8 <e1> {a0} w0
|
||||||
|
1: MODULE 0x92bac80 <e3144> {e14} w0 TOP_t L1 [P]
|
||||||
|
1:1: CELLINLINE 0x92bab18 <e3686#> {e14} w0 v -> t
|
||||||
|
1:1: CELLINLINE 0x92bc1d8 <e3688#> {e24} w0 v__DOT__i_test_gen -> test_gen
|
||||||
|
...
|
||||||
|
1: MODULE 0x92b9bb0 <e503> {e47} w0 test_gen L3
|
||||||
|
...
|
||||||
|
|
||||||
|
AstNode type::
|
||||||
|
|
||||||
|
The textual name of this node AST type (always in capitals). Many of these
|
||||||
|
correspond directly to Verilog entities (for example `MODULE` and
|
||||||
|
`TASK`), but others are internal to Verilator (for example `NETLIST` and
|
||||||
|
`BASICDTYPE`).
|
||||||
|
|
||||||
|
Address of the node::
|
||||||
|
|
||||||
|
A hexadecimal address of the node in memory. Useful for examining with the
|
||||||
|
debugger.
|
||||||
|
|
||||||
|
Last edit number::
|
||||||
|
|
||||||
|
Of the form `<ennnn>` or `<ennnn#>` , where `nnnn` is the number
|
||||||
|
of the last edit to modify this node. The trailing `#` indicates the node
|
||||||
|
has been edited since the last tree dump (which typically means in the last
|
||||||
|
refinement or optimization pass). GDB can watch for this, see << /Debugging >>.
|
||||||
|
|
||||||
|
Source file and line::
|
||||||
|
|
||||||
|
Of the form `{xxnnnn}`, where C{xx} is the filename letter (or
|
||||||
|
letters) and `nnnn` is the line number within that file. The first file is
|
||||||
|
`a`, the 26th is `z`, the 27th is `aa` and so on.
|
||||||
|
|
||||||
|
User pointers::
|
||||||
|
|
||||||
|
Shows the value of the node's user1p...user5p, if non-NULL.
|
||||||
|
|
||||||
|
Data type::
|
||||||
|
|
||||||
|
Many nodes have an explicit data type. "@dt=0x..." indicates the address
|
||||||
|
of the data type (AstNodeDType) this node uses.
|
||||||
|
+
|
||||||
|
If a data type is present and is numeric, it then prints the width of the
|
||||||
|
item. This field is a sequence of flag characters and width data as follows:
|
||||||
|
+
|
||||||
|
* `s` if the node is signed.
|
||||||
|
* `d` if the node is a double (i.e a floating point entity).
|
||||||
|
* `w` always present, indicating this is the width field.
|
||||||
|
* `u` if the node is unsized.
|
||||||
|
* `/nnnn` if the node is unsized, where `nnnn` is the minimum width.
|
||||||
|
|
||||||
|
Name of the entity represented by the node if it exists::
|
||||||
|
|
||||||
|
For example for a `VAR` it is the name of the variable.
|
||||||
|
|
||||||
|
Many nodes follow these fields with additional node specific
|
||||||
|
information. Thus the `VARREF` node will print either `[LV]` or `[RV]`
|
||||||
|
to indicate a left value or right value, followed by the node of the
|
||||||
|
variable being referred to. For example:
|
||||||
|
|
||||||
|
1:2:1:1: VARREF 0x92c2598 <e509> {e24} w0 clk [RV] <- VAR 0x92a2e90 <e79> {e18} w0 clk [I] INPUT
|
||||||
|
|
||||||
|
In general, examine the `dump()` method in `V3AstNodes.cpp` of the node
|
||||||
|
type in question to determine additional fields that may be printed.
|
||||||
|
|
||||||
|
The `MODULE` has a list of `CELLINLINE` nodes referred to by its
|
||||||
|
`op1p()` pointer, connected by `nextp()` and `prevp()` pointers.
|
||||||
|
|
||||||
|
Similarly the `NETLIST` has a list of modules referred to by its `op1p()`
|
||||||
|
pointer.
|
||||||
|
|
||||||
|
=== Debugging with GDB
|
||||||
|
|
||||||
|
The test_regress/driver.pl script accepts `--debug --gdb` to start
|
||||||
|
Verilator under gdb and break when an error is hit or the program is about
|
||||||
|
to exit. You can also use `--debug --gdbbt` to just backtrace and then
|
||||||
|
exit gdb. To debug the Verilated executable, use `--gdbsim`.
|
||||||
|
|
||||||
|
If you wish to start Verilator under GDB (or another debugger), then you
|
||||||
|
can use `--debug` and look at the underlying invocation of
|
||||||
|
`verilator_dbg`. For example
|
||||||
|
|
||||||
|
t/t_alw_dly.pl --debug
|
||||||
|
|
||||||
|
shows it invokes the command:
|
||||||
|
|
||||||
|
../verilator_bin_dbg --prefix Vt_alw_dly --x-assign unique --debug
|
||||||
|
-cc -Mdir obj_dir/t_alw_dly --debug-check -f input.vc t/t_alw_dly.v
|
||||||
|
|
||||||
|
Start GDB, then `start` with the remaining arguments.
|
||||||
|
|
||||||
|
gdb ../verilator_bin_dbg
|
||||||
|
...
|
||||||
|
(gdb) start --prefix Vt_alw_dly --x-assign unique --debug -cc -Mdir
|
||||||
|
obj_dir/t_alw_dly --debug-check -f input.vc t/t_alw_dly.v
|
||||||
|
> obj_dir/t_alw_dly/vlt_compile.log
|
||||||
|
...
|
||||||
|
Temporary breakpoint 1, main (argc=13, argv=0xbfffefa4, env=0xbfffefdc)
|
||||||
|
at ../Verilator.cpp:615
|
||||||
|
615 ios::sync_with_stdio();
|
||||||
|
(gdb)
|
||||||
|
|
||||||
|
You can then continue execution with breakpoints as required.
|
||||||
|
|
||||||
|
To break at a specific edit number which changed a node (presumably to find
|
||||||
|
what made a <e####> line in the tree dumps):
|
||||||
|
|
||||||
|
watch AstNode::s_editCntGbl==####
|
||||||
|
|
||||||
|
Then, when the watch fires, to break at every following change to that node:
|
||||||
|
|
||||||
|
watch m_editCount
|
||||||
|
|
||||||
|
To print a node:
|
||||||
|
|
||||||
|
pn nodep
|
||||||
|
# or: call nodep->dumpGdb() # aliased to "pn" in src/.gdbinit
|
||||||
|
pnt nodep
|
||||||
|
# or: call nodep->dumpTreeGdb() # aliased to "pnt" in src/.gdbinit
|
||||||
|
|
||||||
|
When GDB halts, it is useful to understand that the backtrace will commonly
|
||||||
|
show the iterator functions between each invocation of `visit` in the
|
||||||
|
backtrace. You will typically see a frame sequence something like
|
||||||
|
|
||||||
|
...
|
||||||
|
visit()
|
||||||
|
iterateChildren()
|
||||||
|
iterateAndNext()
|
||||||
|
accept()
|
||||||
|
visit()
|
||||||
|
...
|
||||||
|
|
||||||
|
== Adding a New Feature
|
||||||
|
|
||||||
|
Generally what would you do to add a new feature?
|
||||||
|
|
||||||
|
. File an issue (if there isn't already) so others know what you're working on.
|
||||||
|
|
||||||
|
. Make a testcase in the test_regress/t/t_EXAMPLE format, see << /TESTING >>.
|
||||||
|
|
||||||
|
. If grammar changes are needed, look at the git version of VerilogPerl's
|
||||||
|
src/VParseGrammar.y, as this grammar supports the full SystemVerilog
|
||||||
|
language and has a lot of back-and-forth with Verilator's grammar. Copy
|
||||||
|
the appropriate rules to src/verilog.y and modify the productions.
|
||||||
|
|
||||||
|
. If a new Ast type is needed, add it to V3AstNodes.h.
|
||||||
|
|
||||||
|
. Now you can run "test_regress/t/t_{new testcase}.pl --debug" and it'll
|
||||||
|
probably fail but you'll see a test_regress/obj_dir/t_{newtestcase}/*.tree
|
||||||
|
file which you can examine to see if the parsing worked. See also the
|
||||||
|
sections above on debugging.
|
||||||
|
|
||||||
|
. Modify the later visitor functions to process the new feature as needed.
|
||||||
|
|
||||||
|
=== Adding a New Pass
|
||||||
|
|
||||||
|
For more substantial changes you may need to add a new pass. The simplest
|
||||||
|
way to do this is to copy the `.cpp` and `.h` files from an existing
|
||||||
|
pass. You'll need to add a call into your pass from the `process()`
|
||||||
|
function in `src/verilator.cpp`.
|
||||||
|
|
||||||
|
To get your pass to build you'll need to add its binary filename to the
|
||||||
|
list in `src/Makefile_obj.in` and reconfigure.
|
||||||
|
|
||||||
|
== Distribution
|
||||||
|
|
||||||
|
Copyright 2008-2019 by Wilson Snyder. Verilator is free software; you can
|
||||||
|
redistribute it and/or modify it under the terms of either the GNU Lesser
|
||||||
|
General Public License Version 3 or the Perl Artistic License Version 2.0.
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 9.9 KiB |
@@ -0,0 +1 @@
|
|||||||
|
build*
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# DESCRIPTION: Verilator CMake Example: Small CMakeLists.txt
|
||||||
|
#
|
||||||
|
# This is an example cmake script to build a verilog to systemc project
|
||||||
|
# using cmake and verilator.
|
||||||
|
#
|
||||||
|
# Copyright 2003-2019 by Wilson Snyder. This program is free software; you can
|
||||||
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
# Version 2.0.
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
# This example builds the tracing_c example using CMake
|
||||||
|
# To use it, run the following:
|
||||||
|
|
||||||
|
# cd /path/to/verilator/examples/cmake_c
|
||||||
|
# rm -rf build && mkdir build && cd build
|
||||||
|
# cmake ..
|
||||||
|
# cmake --build .
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.8)
|
||||||
|
project(cmake_hello_c)
|
||||||
|
|
||||||
|
find_package(verilator HINTS $ENV{VERILATOR_ROOT} ${VERILATOR_ROOT})
|
||||||
|
if (NOT verilator_FOUND)
|
||||||
|
message(FATAL_ERROR "Verilator was not found. Either install it, or set the VERILATOR_ROOT environment variable")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Create a new executable target that will contain all your sources
|
||||||
|
add_executable(example ../make_hello_c/sim_main.cpp)
|
||||||
|
|
||||||
|
# Add the Verilated circuit to the target
|
||||||
|
verilate(example
|
||||||
|
INCLUDE_DIRS "../make_hello_c"
|
||||||
|
SOURCES ../make_hello_c/top.v)
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# DESCRIPTION: Verilator CMake example usage
|
||||||
|
#
|
||||||
|
# This file shows usage of the CMake script.
|
||||||
|
# This makefile is here for testing the examples and should
|
||||||
|
# generally not be added to a CMake project.
|
||||||
|
#
|
||||||
|
# Copyright 2003-2019 by Wilson Snyder. This program is free software; you can
|
||||||
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
# Version 2.0.
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Set up variables
|
||||||
|
|
||||||
|
# If $VERILATOR_ROOT isn't in the environment, we assume it is part of a
|
||||||
|
# package install, and verilator is in your path. Otherwise find the
|
||||||
|
# binary relative to $VERILATOR_ROOT (such as when inside the git sources).
|
||||||
|
|
||||||
|
ifeq ($(VERILATOR_ROOT),)
|
||||||
|
VERILATOR_COVERAGE = verilator_coverage
|
||||||
|
else
|
||||||
|
export VERILATOR_ROOT
|
||||||
|
VERILATOR_COVERAGE = $(VERILATOR_ROOT)/bin/verilator_coverage
|
||||||
|
endif
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
# Check if CMake is installed and of correct version
|
||||||
|
ifeq ($(shell which cmake),)
|
||||||
|
TARGET := nocmake
|
||||||
|
else
|
||||||
|
CMAKE_VERSION := $(shell cmake --version | grep -Po '(\d[\.\d]+)')
|
||||||
|
CMAKE_MAJOR := $(shell echo $(CMAKE_VERSION) | cut -f1 -d.)
|
||||||
|
CMAKE_MINOR := $(shell echo $(CMAKE_VERSION) | cut -f2 -d.)
|
||||||
|
CMAKE_GT_3_8 := $(shell [ $(CMAKE_MAJOR) -gt 3 -o \( $(CMAKE_MAJOR) -eq 3 -a $(CMAKE_MINOR) -ge 8 \) ] && echo true)
|
||||||
|
ifeq ($(CMAKE_GT_3_8),true)
|
||||||
|
TARGET := run
|
||||||
|
else
|
||||||
|
TARGET := oldcmake
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
default: $(TARGET)
|
||||||
|
|
||||||
|
run:
|
||||||
|
@echo
|
||||||
|
@echo "-- Verilator CMake hello world example"
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- CMake ----------------"
|
||||||
|
mkdir -p build && cd build && cmake ..
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- COMPILE -----------------"
|
||||||
|
cmake --build build
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- RUN ---------------------"
|
||||||
|
build/example
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- DONE --------------------"
|
||||||
|
@echo
|
||||||
|
|
||||||
|
clean mostlyclean distclean maintainer-clean:
|
||||||
|
@rm -rf build logs
|
||||||
|
|
||||||
|
nocmake:
|
||||||
|
@echo
|
||||||
|
@echo "%Skip: CMake has not been found"
|
||||||
|
@echo
|
||||||
|
|
||||||
|
oldcmake:
|
||||||
|
@echo
|
||||||
|
@echo "%Skip: CMake version is too old (need at least 3.8)"
|
||||||
|
@echo
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
build*
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# DESCRIPTION: Verilator CMake Example: Small CMakeLists.txt with SystemC
|
||||||
|
#
|
||||||
|
# This is an example cmake script to build a verilog to SystemC project
|
||||||
|
# using CMake and Verilator.
|
||||||
|
#
|
||||||
|
# Copyright 2003-2019 by Wilson Snyder. This program is free software; you can
|
||||||
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
# Version 2.0.
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
# This example builds the tracing_sc example using CMake
|
||||||
|
# To use it, run the following:
|
||||||
|
|
||||||
|
# cd /path/to/verilator/examples/cmake_sc
|
||||||
|
# rm -rf build && mkdir build && cd build
|
||||||
|
# cmake ..
|
||||||
|
# cmake --build .
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.8)
|
||||||
|
project(cmake_hello_sc)
|
||||||
|
|
||||||
|
find_package(verilator HINTS $ENV{VERILATOR_ROOT} ${VERILATOR_ROOT})
|
||||||
|
if (NOT verilator_FOUND)
|
||||||
|
message(FATAL_ERROR "Verilator was not found. Either install it, or set the VERILATOR_ROOT environment variable")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# SystemC dependencies
|
||||||
|
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||||||
|
find_package(Threads REQUIRED)
|
||||||
|
|
||||||
|
# Find SystemC using SystemC's CMake integration
|
||||||
|
find_package(SystemCLanguage QUIET)
|
||||||
|
|
||||||
|
# Create a new executable target that will contain all your sources
|
||||||
|
add_executable(example ../make_hello_sc/sc_main.cpp)
|
||||||
|
|
||||||
|
# Add the Verilated circuit to the target
|
||||||
|
verilate(example SYSTEMC
|
||||||
|
INCLUDE_DIRS "../make_hello_sc"
|
||||||
|
SOURCES ../make_hello_sc/top.v)
|
||||||
|
|
||||||
|
verilator_link_systemc(example)
|
||||||
@@ -0,0 +1,129 @@
|
|||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# DESCRIPTION: Verilator CMake example usage
|
||||||
|
#
|
||||||
|
# This file shows usage of the CMake script.
|
||||||
|
# This makefile is here for testing the examples and should
|
||||||
|
# generally not be added to a CMake project.
|
||||||
|
#
|
||||||
|
# Copyright 2003-2019 by Wilson Snyder. This program is free software; you can
|
||||||
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
# Version 2.0.
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Set up variables
|
||||||
|
|
||||||
|
# If $VERILATOR_ROOT isn't in the environment, we assume it is part of a
|
||||||
|
# package install, and verilator is in your path. Otherwise find the
|
||||||
|
# binary relative to $VERILATOR_ROOT (such as when inside the git sources).
|
||||||
|
|
||||||
|
ifeq ($(VERILATOR_ROOT),)
|
||||||
|
VERILATOR_COVERAGE = verilator_coverage
|
||||||
|
else
|
||||||
|
export VERILATOR_ROOT
|
||||||
|
VERILATOR_COVERAGE = $(VERILATOR_ROOT)/bin/verilator_coverage
|
||||||
|
endif
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
# Check if CMake is installed and of correct version
|
||||||
|
ifeq ($(shell which cmake),)
|
||||||
|
TARGET := nocmake
|
||||||
|
else
|
||||||
|
CMAKE_VERSION := $(shell cmake --version | grep -Po '(\d[\.\d]+)')
|
||||||
|
CMAKE_MAJOR := $(shell echo $(CMAKE_VERSION) | cut -f1 -d.)
|
||||||
|
CMAKE_MINOR := $(shell echo $(CMAKE_VERSION) | cut -f2 -d.)
|
||||||
|
CMAKE_GT_3_8 := $(shell [ $(CMAKE_MAJOR) -gt 3 -o \( $(CMAKE_MAJOR) -eq 3 -a $(CMAKE_MINOR) -ge 8 \) ] && echo true)
|
||||||
|
ifneq ($(CMAKE_GT_3_8),true)
|
||||||
|
TARGET := oldcmake
|
||||||
|
else
|
||||||
|
|
||||||
|
# Test existence of SYSTEMC_INCLUDE and SYSTEMC_LIBDIR environment variabless
|
||||||
|
ifneq (,$(SYSTEMC_INCLUDE))
|
||||||
|
ifneq (,${SYSTEMC_LIBDIR})
|
||||||
|
SYSTEMC_SET := true
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Test existence of SYSTEMC_ROOT environment variable
|
||||||
|
ifneq (SYSTEMC_SET, true)
|
||||||
|
ifneq (,${SYSTEMC_ROOT})
|
||||||
|
SYSTEMC_SET := true
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Test existence of SYSTEMC environment variable
|
||||||
|
ifneq (SYSTEMC_SET, true)
|
||||||
|
ifneq (,${SYSTEMC})
|
||||||
|
SYSTEMC_SET := true
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Test whether SystemC is installed with CMake support
|
||||||
|
# This will print a CMake error about processing arguments that can (currently) be ignored.
|
||||||
|
ifneq (SYSTEMC_SET, true)
|
||||||
|
FINDSC := $(shell mkdir -p build && cd build && cmake --find-package -DNAME=SystemCLanguage -DCMAKE_USE_PTHREADS_INIT=ON -DCOMPILER_ID=GNU -DLANGUAGE=CXX -DMODE=EXIST -DThreads_FOUND=ON)
|
||||||
|
ifneq (,$(findstring SystemCLanguage found,$(FINDSC)))
|
||||||
|
SYSTEMC_SET := true
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(SYSTEMC_SET), true)
|
||||||
|
TARGET := run
|
||||||
|
else
|
||||||
|
TARGET := nosc
|
||||||
|
endif
|
||||||
|
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
default: $(TARGET)
|
||||||
|
|
||||||
|
run:
|
||||||
|
@echo
|
||||||
|
@echo "-- Verilator CMake SystemC hello-world simple example"
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- CMake ----------------"
|
||||||
|
mkdir -p build && cd build && cmake ..
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- COMPILE -----------------"
|
||||||
|
cmake --build build
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- RUN ---------------------"
|
||||||
|
@mkdir -p logs
|
||||||
|
build/example
|
||||||
|
|
||||||
|
@echo "-- DONE --------------------"
|
||||||
|
@echo "Note: Once this example is understood, see examples/cmake_tracing_sc."
|
||||||
|
@echo "Note: Also see the EXAMPLE section in the verilator manpage/document."
|
||||||
|
|
||||||
|
clean mostlyclean distclean maintainer-clean:
|
||||||
|
@rm -rf build logs
|
||||||
|
|
||||||
|
nocmake:
|
||||||
|
@echo
|
||||||
|
@echo "%Skip: CMake has not been found"
|
||||||
|
@echo
|
||||||
|
|
||||||
|
oldcmake:
|
||||||
|
@echo
|
||||||
|
@echo "%Skip: CMake version is too old (need at least 3.8)"
|
||||||
|
@echo
|
||||||
|
|
||||||
|
nosc:
|
||||||
|
@echo
|
||||||
|
@echo "%Skip: CMake could not find SystemC."
|
||||||
|
@echo "% Make sure that either:"
|
||||||
|
@echo "% - The environment variables SYSTEMC_INCLUDE and SYSTEMC_LIBDIR are exported."
|
||||||
|
@echo "% - Or, the environment variable SYSTEMC_ROOT is exported."
|
||||||
|
@echo "% - Or, The environment variable SYSTEMC is exported."
|
||||||
|
@echo "% - Or, if the SystemC installation provides CMake support,"
|
||||||
|
@echo "% that its installation prefix is in CMAKE_PREFIX_PATH."
|
||||||
|
@echo "% Also that the C++ standard of the SystemC library is the same as this example."
|
||||||
|
@echo "% Please see the Verilator documentation's CMake section for more information."
|
||||||
|
@echo
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
build*
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# DESCRIPTION: Verilator CMake Example: Small CMakeLists.txt
|
||||||
|
#
|
||||||
|
# This is an example cmake script to build a verilog to systemc project
|
||||||
|
# using cmake and verilator.
|
||||||
|
#
|
||||||
|
# Copyright 2003-2019 by Wilson Snyder. This program is free software; you can
|
||||||
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
# Version 2.0.
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
# This example builds the tracing_c example using CMake
|
||||||
|
# To use it, run the following:
|
||||||
|
|
||||||
|
# cd /path/to/verilator/examples/cmake_c
|
||||||
|
# rm -rf build && mkdir build && cd build
|
||||||
|
# cmake ..
|
||||||
|
# cmake --build .
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.8)
|
||||||
|
project(cmake_protect_lib)
|
||||||
|
|
||||||
|
find_package(verilator HINTS $ENV{VERILATOR_ROOT} ${VERILATOR_ROOT})
|
||||||
|
if (NOT verilator_FOUND)
|
||||||
|
message(FATAL_ERROR "Verilator was not found. Either install it, or set the VERILATOR_ROOT environment variable")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Create the main executable target
|
||||||
|
add_executable(example ../make_protect_lib/sim_main.cpp)
|
||||||
|
|
||||||
|
# Create a secret library
|
||||||
|
add_library(verilated_secret STATIC) # or SHARED for a shared library
|
||||||
|
target_link_libraries(example PRIVATE verilated_secret)
|
||||||
|
# To create both libraries on CMake >= 3.12 replace the above 2 lines with the following:
|
||||||
|
# add_library(verilated_secret OBJECT)
|
||||||
|
# set_property(TARGET verilated_secret PROPERTY POSITION_INDEPENDENT_CODE 1)
|
||||||
|
# add_library(verilated_secret_static STATIC $<TARGET_OBJECTS:verilated_secret>)
|
||||||
|
# set_target_properties(verilated_secret_static PROPERTIES OUTPUT_NAME verilated_secret)
|
||||||
|
# add_library(verilated_secret_shared SHARED $<TARGET_OBJECTS:verilated_secret>)
|
||||||
|
# set_target_properties(verilated_secret_shared PROPERTIES OUTPUT_NAME verilated_secret)
|
||||||
|
# target_link_libraries(example PRIVATE verilated_secret_static)
|
||||||
|
|
||||||
|
# Setup random seed
|
||||||
|
verilator_generate_key(KEY_INIT)
|
||||||
|
set(PROTECT_KEY ${KEY_INIT} CACHE STRING "Random seed for protection")
|
||||||
|
|
||||||
|
# Add the Verilated modules to the targets
|
||||||
|
verilate(verilated_secret
|
||||||
|
VERILATOR_ARGS --protect-lib verilated_secret
|
||||||
|
--protect-key ${PROTECT_KEY}
|
||||||
|
DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/verilated_secret
|
||||||
|
SOURCES ../make_protect_lib/secret_impl.v)
|
||||||
|
|
||||||
|
# Include location of verilated_secret.sv wrapper
|
||||||
|
verilate(example
|
||||||
|
VERILATOR_ARGS "-I${CMAKE_CURRENT_BINARY_DIR}/verilated_secret"
|
||||||
|
SOURCES ../make_protect_lib/top.v)
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# DESCRIPTION: Verilator CMake example usage
|
||||||
|
#
|
||||||
|
# This file shows usage of the CMake script.
|
||||||
|
# This makefile is here for testing the examples and should
|
||||||
|
# generally not be added to a CMake project.
|
||||||
|
#
|
||||||
|
# Copyright 2003-2019 by Wilson Snyder. This program is free software; you can
|
||||||
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
# Version 2.0.
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Set up variables
|
||||||
|
|
||||||
|
# If $VERILATOR_ROOT isn't in the environment, we assume it is part of a
|
||||||
|
# package install, and verilator is in your path. Otherwise find the
|
||||||
|
# binary relative to $VERILATOR_ROOT (such as when inside the git sources).
|
||||||
|
|
||||||
|
ifeq ($(VERILATOR_ROOT),)
|
||||||
|
VERILATOR_COVERAGE = verilator_coverage
|
||||||
|
else
|
||||||
|
export VERILATOR_ROOT
|
||||||
|
VERILATOR_COVERAGE = $(VERILATOR_ROOT)/bin/verilator_coverage
|
||||||
|
endif
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
# Check if CMake is installed and of correct version
|
||||||
|
ifeq ($(shell which cmake),)
|
||||||
|
TARGET := nocmake
|
||||||
|
else
|
||||||
|
CMAKE_VERSION := $(shell cmake --version | grep -Po '(\d[\.\d]+)')
|
||||||
|
CMAKE_MAJOR := $(shell echo $(CMAKE_VERSION) | cut -f1 -d.)
|
||||||
|
CMAKE_MINOR := $(shell echo $(CMAKE_VERSION) | cut -f2 -d.)
|
||||||
|
CMAKE_GT_3_8 := $(shell [ $(CMAKE_MAJOR) -gt 3 -o \( $(CMAKE_MAJOR) -eq 3 -a $(CMAKE_MINOR) -ge 8 \) ] && echo true)
|
||||||
|
ifeq ($(CMAKE_GT_3_8),true)
|
||||||
|
TARGET := run
|
||||||
|
else
|
||||||
|
TARGET := oldcmake
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
default: $(TARGET)
|
||||||
|
|
||||||
|
run:
|
||||||
|
@echo
|
||||||
|
@echo "-- Verilator CMake protect_lib example"
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- CMake ----------------"
|
||||||
|
mkdir -p build && cd build && cmake ..
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- COMPILE -----------------"
|
||||||
|
cmake --build build
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- RUN ---------------------"
|
||||||
|
build/example
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- DONE --------------------"
|
||||||
|
@echo
|
||||||
|
|
||||||
|
clean mostlyclean distclean maintainer-clean:
|
||||||
|
@rm -rf build logs
|
||||||
|
|
||||||
|
nocmake:
|
||||||
|
@echo
|
||||||
|
@echo "%Skip: CMake has not been found"
|
||||||
|
@echo
|
||||||
|
|
||||||
|
oldcmake:
|
||||||
|
@echo
|
||||||
|
@echo "%Skip: CMake version is too old (need at least 3.8)"
|
||||||
|
@echo
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
build*
|
||||||
|
logs
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# DESCRIPTION: Verilator CMake Example: Small CMakeLists.txt with tracing
|
||||||
|
#
|
||||||
|
# This is an example cmake script to build a verilog to systemc project
|
||||||
|
# using cmake and verilator.
|
||||||
|
#
|
||||||
|
# Copyright 2003-2019 by Wilson Snyder. This program is free software; you can
|
||||||
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
# Version 2.0.
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
# This example builds the make_tracing_c example using CMake
|
||||||
|
# To use it, run the following:
|
||||||
|
|
||||||
|
# cd /path/to/verilator/examples/cmake_tracing_c
|
||||||
|
# rm -rf build && mkdir build && cd build
|
||||||
|
# cmake ..
|
||||||
|
# cmake --build .
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.8)
|
||||||
|
project(cmake_tracing_c)
|
||||||
|
|
||||||
|
find_package(verilator HINTS $ENV{VERILATOR_ROOT} ${VERILATOR_ROOT})
|
||||||
|
if (NOT verilator_FOUND)
|
||||||
|
message(FATAL_ERROR "Verilator was not found. Either install it, or set the VERILATOR_ROOT environment variable")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Create a new executable target that will contain all your sources
|
||||||
|
add_executable(example ../make_tracing_c/sim_main.cpp)
|
||||||
|
|
||||||
|
# Add the Verilated circuit to the target
|
||||||
|
verilate(example COVERAGE TRACE
|
||||||
|
INCLUDE_DIRS "../make_tracing_c"
|
||||||
|
VERILATOR_ARGS -f ../make_tracing_c/input.vc -O2 -x-assign 0
|
||||||
|
SOURCES ../make_tracing_c/top.v)
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# DESCRIPTION: Verilator CMake example usage
|
||||||
|
#
|
||||||
|
# This file shows usage of the CMake script.
|
||||||
|
# This makefile is here for testing the examples and should
|
||||||
|
# generally not be added to a CMake project.
|
||||||
|
#
|
||||||
|
# Copyright 2003-2019 by Wilson Snyder. This program is free software; you can
|
||||||
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
# Version 2.0.
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Set up variables
|
||||||
|
|
||||||
|
# If $VERILATOR_ROOT isn't in the environment, we assume it is part of a
|
||||||
|
# package install, and verilator is in your path. Otherwise find the
|
||||||
|
# binary relative to $VERILATOR_ROOT (such as when inside the git sources).
|
||||||
|
|
||||||
|
ifeq ($(VERILATOR_ROOT),)
|
||||||
|
VERILATOR_COVERAGE = verilator_coverage
|
||||||
|
else
|
||||||
|
export VERILATOR_ROOT
|
||||||
|
VERILATOR_COVERAGE = $(VERILATOR_ROOT)/bin/verilator_coverage
|
||||||
|
endif
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
# Check if CMake is installed and of correct version
|
||||||
|
ifeq ($(shell which cmake),)
|
||||||
|
TARGET := nocmake
|
||||||
|
else
|
||||||
|
CMAKE_VERSION := $(shell cmake --version | grep -Po '(\d[\.\d]+)')
|
||||||
|
CMAKE_MAJOR := $(shell echo $(CMAKE_VERSION) | cut -f1 -d.)
|
||||||
|
CMAKE_MINOR := $(shell echo $(CMAKE_VERSION) | cut -f2 -d.)
|
||||||
|
CMAKE_GT_3_8 := $(shell [ $(CMAKE_MAJOR) -gt 3 -o \( $(CMAKE_MAJOR) -eq 3 -a $(CMAKE_MINOR) -ge 8 \) ] && echo true)
|
||||||
|
ifeq ($(CMAKE_GT_3_8),true)
|
||||||
|
TARGET := run
|
||||||
|
else
|
||||||
|
TARGET := oldcmake
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
default: $(TARGET)
|
||||||
|
|
||||||
|
run:
|
||||||
|
@echo
|
||||||
|
@echo "-- Verilator CMake tracing example"
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- CMake ----------------"
|
||||||
|
mkdir -p build && cd build && cmake ..
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- COMPILE -----------------"
|
||||||
|
cmake --build build
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- RUN ---------------------"
|
||||||
|
@mkdir -p logs
|
||||||
|
build/example +trace
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- COVERAGE ----------------"
|
||||||
|
$(VERILATOR_COVERAGE) --annotate logs/annotated logs/coverage.dat
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- DONE --------------------"
|
||||||
|
@echo "To see waveforms, open vlt_dump.vcd in a waveform viewer"
|
||||||
|
@echo
|
||||||
|
|
||||||
|
clean mostlyclean distclean maintainer-clean:
|
||||||
|
@rm -rf build logs
|
||||||
|
|
||||||
|
nocmake:
|
||||||
|
@echo
|
||||||
|
@echo "%Skip: CMake has not been found"
|
||||||
|
@echo
|
||||||
|
|
||||||
|
oldcmake:
|
||||||
|
@echo
|
||||||
|
@echo "%Skip: CMake version is too old (need at least 3.8)"
|
||||||
|
@echo
|
||||||
@@ -1,8 +1,7 @@
|
|||||||
*.old
|
|
||||||
*.dmp
|
*.dmp
|
||||||
*.log
|
*.log
|
||||||
*.csrc
|
*.csrc
|
||||||
*.vcd
|
*.vcd
|
||||||
obj_*
|
obj_*
|
||||||
logs
|
logs
|
||||||
project
|
build*
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# DESCRIPTION: Verilator CMake Example: Small CMakeLists.txt with SystemC tracing
|
||||||
|
#
|
||||||
|
# This is an example cmake script to build a verilog to SystemC project
|
||||||
|
# using CMake and Verilator.
|
||||||
|
#
|
||||||
|
# Copyright 2003-2019 by Wilson Snyder. This program is free software; you can
|
||||||
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
# Version 2.0.
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
# This example builds the tracing_sc example using CMake
|
||||||
|
# To use it, run the following:
|
||||||
|
|
||||||
|
# cd /path/to/verilator/examples/cmake_tracing_sc
|
||||||
|
# rm -rf build && mkdir build && cd build
|
||||||
|
# cmake ..
|
||||||
|
# cmake --build .
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.8)
|
||||||
|
project(cmake_tracing_sc_example)
|
||||||
|
|
||||||
|
find_package(verilator HINTS $ENV{VERILATOR_ROOT} ${VERILATOR_ROOT})
|
||||||
|
if (NOT verilator_FOUND)
|
||||||
|
message(FATAL_ERROR "Verilator was not found. Either install it, or set the VERILATOR_ROOT environment variable")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# SystemC dependencies
|
||||||
|
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||||||
|
find_package(Threads REQUIRED)
|
||||||
|
|
||||||
|
# Find SystemC using SystemC's CMake integration
|
||||||
|
find_package(SystemCLanguage QUIET)
|
||||||
|
|
||||||
|
# Create a new executable target that will contain all your sources
|
||||||
|
add_executable(example ../make_tracing_sc/sc_main.cpp)
|
||||||
|
|
||||||
|
# Add the Verilated circuit to the target
|
||||||
|
verilate(example SYSTEMC COVERAGE TRACE
|
||||||
|
INCLUDE_DIRS "../make_tracing_sc"
|
||||||
|
VERILATOR_ARGS -f ../make_tracing_sc/input.vc -O2 -x-assign 0
|
||||||
|
SOURCES ../make_tracing_sc/top.v)
|
||||||
|
|
||||||
|
verilator_link_systemc(example)
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# DESCRIPTION: Verilator CMake example usage
|
||||||
|
#
|
||||||
|
# This file shows usage of the CMake script.
|
||||||
|
# This makefile is here for testing the examples and should
|
||||||
|
# generally not be added to a CMake project.
|
||||||
|
#
|
||||||
|
# Copyright 2003-2019 by Wilson Snyder. This program is free software; you can
|
||||||
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
# Version 2.0.
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Set up variables
|
||||||
|
|
||||||
|
# If $VERILATOR_ROOT isn't in the environment, we assume it is part of a
|
||||||
|
# package install, and verilator is in your path. Otherwise find the
|
||||||
|
# binary relative to $VERILATOR_ROOT (such as when inside the git sources).
|
||||||
|
|
||||||
|
ifeq ($(VERILATOR_ROOT),)
|
||||||
|
VERILATOR_COVERAGE = verilator_coverage
|
||||||
|
else
|
||||||
|
export VERILATOR_ROOT
|
||||||
|
VERILATOR_COVERAGE = $(VERILATOR_ROOT)/bin/verilator_coverage
|
||||||
|
endif
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
# Check if CMake is installed and of correct version
|
||||||
|
ifeq ($(shell which cmake),)
|
||||||
|
TARGET := nocmake
|
||||||
|
else
|
||||||
|
CMAKE_VERSION := $(shell cmake --version | grep -Po '(\d[\.\d]+)')
|
||||||
|
CMAKE_MAJOR := $(shell echo $(CMAKE_VERSION) | cut -f1 -d.)
|
||||||
|
CMAKE_MINOR := $(shell echo $(CMAKE_VERSION) | cut -f2 -d.)
|
||||||
|
CMAKE_GT_3_8 := $(shell [ $(CMAKE_MAJOR) -gt 3 -o \( $(CMAKE_MAJOR) -eq 3 -a $(CMAKE_MINOR) -ge 8 \) ] && echo true)
|
||||||
|
ifneq ($(CMAKE_GT_3_8),true)
|
||||||
|
TARGET := oldcmake
|
||||||
|
else
|
||||||
|
|
||||||
|
# Test existence of SYSTEMC_INCLUDE and SYSTEMC_LIBDIR environment variabless
|
||||||
|
ifneq (,$(SYSTEMC_INCLUDE))
|
||||||
|
ifneq (,${SYSTEMC_LIBDIR})
|
||||||
|
SYSTEMC_SET := true
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Test existence of SYSTEMC_ROOT environment variable
|
||||||
|
ifneq (SYSTEMC_SET, true)
|
||||||
|
ifneq (,${SYSTEMC_ROOT})
|
||||||
|
SYSTEMC_SET := true
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Test existence of SYSTEMC environment variable
|
||||||
|
ifneq (SYSTEMC_SET, true)
|
||||||
|
ifneq (,${SYSTEMC})
|
||||||
|
SYSTEMC_SET := true
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Test whether SystemC is installed with CMake support
|
||||||
|
# This will print a CMake error about processing arguments that can (currently) be ignored.
|
||||||
|
ifneq (SYSTEMC_SET, true)
|
||||||
|
FINDSC := $(shell mkdir -p build && cd build && cmake --find-package -DNAME=SystemCLanguage -DCMAKE_USE_PTHREADS_INIT=ON -DCOMPILER_ID=GNU -DLANGUAGE=CXX -DMODE=EXIST -DThreads_FOUND=ON)
|
||||||
|
ifneq (,$(findstring SystemCLanguage found,$(FINDSC)))
|
||||||
|
SYSTEMC_SET := true
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(SYSTEMC_SET), true)
|
||||||
|
TARGET := run
|
||||||
|
else
|
||||||
|
TARGET := nosc
|
||||||
|
endif
|
||||||
|
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
default: $(TARGET)
|
||||||
|
|
||||||
|
run:
|
||||||
|
@echo
|
||||||
|
@echo "-- Verilator CMake SystemC tracing example"
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- CMake ----------------"
|
||||||
|
mkdir -p build && cd build && cmake ..
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- COMPILE -----------------"
|
||||||
|
cmake --build build
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- RUN ---------------------"
|
||||||
|
@mkdir -p logs
|
||||||
|
build/example +trace
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- COVERAGE ----------------"
|
||||||
|
$(VERILATOR_COVERAGE) --annotate logs/annotated logs/coverage.dat
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- DONE --------------------"
|
||||||
|
@echo "To see waveforms, open vlt_dump.vcd in a waveform viewer"
|
||||||
|
@echo
|
||||||
|
|
||||||
|
clean mostlyclean distclean maintainer-clean:
|
||||||
|
@rm -rf build logs
|
||||||
|
|
||||||
|
nocmake:
|
||||||
|
@echo
|
||||||
|
@echo "%Skip: CMake has not been found"
|
||||||
|
@echo
|
||||||
|
|
||||||
|
oldcmake:
|
||||||
|
@echo
|
||||||
|
@echo "%Skip: CMake version is too old (need at least 3.8)"
|
||||||
|
@echo
|
||||||
|
|
||||||
|
nosc:
|
||||||
|
@echo
|
||||||
|
@echo "%Skip: CMake could not find SystemC."
|
||||||
|
@echo "% Make sure that either:"
|
||||||
|
@echo "% - The environment variables SYSTEMC_INCLUDE and SYSTEMC_LIBDIR are exported."
|
||||||
|
@echo "% - Or, the environment variable SYSTEMC_ROOT is exported."
|
||||||
|
@echo "% - Or, The environment variable SYSTEMC is exported."
|
||||||
|
@echo "% - Or, if the SystemC installation provides CMake support,"
|
||||||
|
@echo "% that its installation prefix is in CMAKE_PREFIX_PATH."
|
||||||
|
@echo "% Also that the C++ standard of the SystemC library is the same as this example."
|
||||||
|
@echo "% Please see the Verilator documentation's CMake section for more information."
|
||||||
|
@echo
|
||||||
@@ -3,4 +3,4 @@
|
|||||||
*.csrc
|
*.csrc
|
||||||
*.vcd
|
*.vcd
|
||||||
obj_*
|
obj_*
|
||||||
project
|
logs
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# DESCRIPTION: Verilator Example: Small Makefile
|
||||||
|
#
|
||||||
|
# This calls the object directory makefile. That allows the objects to
|
||||||
|
# be placed in the "current directory" which simplifies the Makefile.
|
||||||
|
#
|
||||||
|
# Copyright 2003-2019 by Wilson Snyder. This program is free software; you can
|
||||||
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
# Version 2.0.
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
# Check for sanity to avoid later confusion
|
||||||
|
|
||||||
|
ifneq ($(words $(CURDIR)),1)
|
||||||
|
$(error Unsupported: GNU Make cannot build in directories containing spaces, build elsewhere: '$(CURDIR)')
|
||||||
|
endif
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
# This is intended to be a minimal example. Before copying this to start a
|
||||||
|
# real project, it is better to start with a more complete example,
|
||||||
|
# e.g. examples/make_tracing_c.
|
||||||
|
|
||||||
|
# If $VERILATOR_ROOT isn't in the environment, we assume it is part of a
|
||||||
|
# package install, and verilator is in your path. Otherwise find the
|
||||||
|
# binary relative to $VERILATOR_ROOT (such as when inside the git sources).
|
||||||
|
ifeq ($(VERILATOR_ROOT),)
|
||||||
|
VERILATOR = verilator
|
||||||
|
else
|
||||||
|
export VERILATOR_ROOT
|
||||||
|
VERILATOR = $(VERILATOR_ROOT)/bin/verilator
|
||||||
|
endif
|
||||||
|
|
||||||
|
default:
|
||||||
|
@echo "-- Verilator hello-world simple example"
|
||||||
|
@echo "-- VERILATE ----------------"
|
||||||
|
$(VERILATOR) -cc --exe top.v sim_main.cpp
|
||||||
|
@echo "-- COMPILE -----------------"
|
||||||
|
$(MAKE) -j 4 -C obj_dir -f Vtop.mk
|
||||||
|
@echo "-- RUN ---------------------"
|
||||||
|
obj_dir/Vtop
|
||||||
|
@echo "-- DONE --------------------"
|
||||||
|
@echo "Note: Once this example is understood, see examples/make_tracing_c."
|
||||||
|
@echo "Note: Also see the EXAMPLE section in the verilator manpage/document."
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
maintainer-copy::
|
||||||
|
clean mostlyclean distclean maintainer-clean::
|
||||||
|
-rm -rf obj_dir *.log *.dmp *.vpd core
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog example module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2017 by Wilson Snyder.
|
||||||
|
//======================================================================
|
||||||
|
|
||||||
|
// Include common routines
|
||||||
|
#include <verilated.h>
|
||||||
|
|
||||||
|
// Include model header, generated from Verilating "top.v"
|
||||||
|
#include "Vtop.h"
|
||||||
|
|
||||||
|
int main(int argc, char** argv, char** env) {
|
||||||
|
// See a similar example walkthrough in the verilator manpage.
|
||||||
|
|
||||||
|
// This is intended to be a minimal example. Before copying this to start a
|
||||||
|
// real project, it is better to start with a more complete example,
|
||||||
|
// e.g. examples/c_tracing.
|
||||||
|
|
||||||
|
// Prevent unused variable warnings
|
||||||
|
if (0 && argc && argv && env) {}
|
||||||
|
|
||||||
|
// Construct the Verilated model, from Vtop.h generated from Verilating "top.v"
|
||||||
|
Vtop* top = new Vtop;
|
||||||
|
|
||||||
|
// Simulate until $finish
|
||||||
|
while (!Verilated::gotFinish()) {
|
||||||
|
|
||||||
|
// Evaluate model
|
||||||
|
top->eval();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Final model cleanup
|
||||||
|
top->final();
|
||||||
|
|
||||||
|
// Destroy model
|
||||||
|
delete top;
|
||||||
|
|
||||||
|
// Fin
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog example module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2017 by Wilson Snyder.
|
||||||
|
|
||||||
|
// See also the EXAMPLE section in the verilator manpage/document.
|
||||||
|
module top;
|
||||||
|
initial begin
|
||||||
|
$display("Hello World!");
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
endmodule
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
*.old
|
|
||||||
*.dmp
|
*.dmp
|
||||||
*.log
|
*.log
|
||||||
*.csrc
|
*.csrc
|
||||||
*.vcd
|
*.vcd
|
||||||
obj_*
|
obj_*
|
||||||
logs
|
logs
|
||||||
project
|
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# DESCRIPTION: Verilator Example: Small Makefile
|
||||||
|
#
|
||||||
|
# This calls the object directory makefile. That allows the objects to
|
||||||
|
# be placed in the "current directory" which simplifies the Makefile.
|
||||||
|
#
|
||||||
|
# Copyright 2003-2019 by Wilson Snyder. This program is free software; you can
|
||||||
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
# Version 2.0.
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
# Check for sanity to avoid later confusion
|
||||||
|
|
||||||
|
ifneq ($(words $(CURDIR)),1)
|
||||||
|
$(error Unsupported: GNU Make cannot build in directories containing spaces, build elsewhere: '$(CURDIR)')
|
||||||
|
endif
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
# This is intended to be a minimal example. Before copying this to start a
|
||||||
|
# real project, it is better to start with a more complete example,
|
||||||
|
# e.g. examples/make_tracing_sc.
|
||||||
|
|
||||||
|
# If $VERILATOR_ROOT isn't in the environment, we assume it is part of a
|
||||||
|
# package install, and verilator is in your path. Otherwise find the
|
||||||
|
# binary relative to $VERILATOR_ROOT (such as when inside the git sources).
|
||||||
|
ifeq ($(VERILATOR_ROOT),)
|
||||||
|
VERILATOR = verilator
|
||||||
|
else
|
||||||
|
export VERILATOR_ROOT
|
||||||
|
VERILATOR = $(VERILATOR_ROOT)/bin/verilator
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Check if SC exists via a verilator call (empty if not)
|
||||||
|
SYSTEMC_EXISTS := $(shell $(VERILATOR) --getenv SYSTEMC_INCLUDE)
|
||||||
|
|
||||||
|
ifneq ($(SYSTEMC_EXISTS),)
|
||||||
|
default: run
|
||||||
|
else
|
||||||
|
default: nosc
|
||||||
|
endif
|
||||||
|
|
||||||
|
run:
|
||||||
|
@echo "-- Verilator hello-world simple example"
|
||||||
|
@echo "-- VERILATE ----------------"
|
||||||
|
$(VERILATOR) -sc --exe top.v sc_main.cpp
|
||||||
|
@echo "-- COMPILE -----------------"
|
||||||
|
$(MAKE) -j 4 -C obj_dir -f Vtop.mk
|
||||||
|
@echo "-- RUN ---------------------"
|
||||||
|
obj_dir/Vtop
|
||||||
|
@echo "-- DONE --------------------"
|
||||||
|
@echo "Note: Once this example is understood, see examples/make_tracing_sc."
|
||||||
|
@echo "Note: Also see the EXAMPLE section in the verilator manpage/document."
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
nosc:
|
||||||
|
@echo
|
||||||
|
@echo "%Skip: SYSTEMC_INCLUDE not in environment"
|
||||||
|
@echo "(If you have SystemC see the README, and rebuild Verilator)"
|
||||||
|
@echo
|
||||||
|
|
||||||
|
maintainer-copy::
|
||||||
|
clean mostlyclean distclean maintainer-clean::
|
||||||
|
-rm -rf obj_dir *.log *.dmp *.vpd core
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
// -*- SystemC -*-
|
||||||
|
// DESCRIPTION: Verilator Example: Top level main for invoking SystemC model
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2017 by Wilson Snyder.
|
||||||
|
//======================================================================
|
||||||
|
|
||||||
|
// SystemC global header
|
||||||
|
#include <systemc.h>
|
||||||
|
|
||||||
|
// Include common routines
|
||||||
|
#include <verilated.h>
|
||||||
|
|
||||||
|
// Include model header, generated from Verilating "top.v"
|
||||||
|
#include "Vtop.h"
|
||||||
|
|
||||||
|
int sc_main(int argc, char* argv[]) {
|
||||||
|
// See a similar example walkthrough in the verilator manpage.
|
||||||
|
|
||||||
|
// This is intended to be a minimal example. Before copying this to start a
|
||||||
|
// real project, it is better to start with a more complete example,
|
||||||
|
// e.g. examples/c_tracing.
|
||||||
|
|
||||||
|
// Prevent unused variable warnings
|
||||||
|
if (0 && argc && argv) {}
|
||||||
|
|
||||||
|
// Construct the Verilated model, from Vtop.h generated from Verilating "top.v"
|
||||||
|
Vtop* top = new Vtop("top");
|
||||||
|
|
||||||
|
// Initialize SC model
|
||||||
|
#if (SYSTEMC_VERSION>=20070314)
|
||||||
|
sc_start(1,SC_NS);
|
||||||
|
#else
|
||||||
|
sc_start(1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Simulate until $finish
|
||||||
|
while (!Verilated::gotFinish()) {
|
||||||
|
#if (SYSTEMC_VERSION>=20070314)
|
||||||
|
sc_start(1,SC_NS);
|
||||||
|
#else
|
||||||
|
sc_start(1);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Final model cleanup
|
||||||
|
top->final();
|
||||||
|
|
||||||
|
// Fin
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog example module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2017 by Wilson Snyder.
|
||||||
|
|
||||||
|
// See also the EXAMPLE section in the verilator manpage/document.
|
||||||
|
module top;
|
||||||
|
initial begin
|
||||||
|
$display("Hello World!");
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
endmodule
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
obj_*
|
||||||
|
logs
|
||||||
@@ -0,0 +1,97 @@
|
|||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# DESCRIPTION: Verilator Example: --protect-lib Makefile
|
||||||
|
#
|
||||||
|
# This calls the object directory makefiles. That allows the objects to
|
||||||
|
# be placed in the "current directory" which simplifies the Makefile.
|
||||||
|
#
|
||||||
|
# Copyright 2019 by Todd Strader. This program is free software; you can
|
||||||
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
# Version 2.0.
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
# Check for sanity to avoid later confusion
|
||||||
|
|
||||||
|
ifneq ($(words $(CURDIR)),1)
|
||||||
|
$(error Unsupported: GNU Make cannot build in directories containing spaces, build elsewhere: '$(CURDIR)')
|
||||||
|
endif
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Set up variables
|
||||||
|
|
||||||
|
# If $VERILATOR_ROOT isn't in the environment, we assume it is part of a
|
||||||
|
# package install, and verilator is in your path. Otherwise find the
|
||||||
|
# binary relative to $VERILATOR_ROOT (such as when inside the git sources).
|
||||||
|
ifeq ($(VERILATOR_ROOT),)
|
||||||
|
VERILATOR = verilator
|
||||||
|
else
|
||||||
|
export VERILATOR_ROOT
|
||||||
|
VERILATOR = $(VERILATOR_ROOT)/bin/verilator
|
||||||
|
endif
|
||||||
|
|
||||||
|
VERILATOR_FLAGS =
|
||||||
|
# Generate C++
|
||||||
|
VERILATOR_FLAGS += -cc
|
||||||
|
# Optimize
|
||||||
|
VERILATOR_FLAGS += -O2 -x-assign 0
|
||||||
|
# Warn abount lint issues; may not want this on less solid designs
|
||||||
|
VERILATOR_FLAGS += -Wall
|
||||||
|
# Make waveforms
|
||||||
|
TOP_VERILATOR_FLAGS = $(VERILATOR_FLAGS) --trace
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
default: run
|
||||||
|
|
||||||
|
run:
|
||||||
|
@echo
|
||||||
|
@echo "-- Verilator --protect-lib example -_--------------------------"
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- VERILATE secret module -------------------------------------"
|
||||||
|
@echo " --protect-lib will produce both a static and shared library"
|
||||||
|
@echo " In this example the static library is used, but some"
|
||||||
|
@echo " simulators may require the shared library."
|
||||||
|
@echo "---------------------------------------------------------------"
|
||||||
|
$(VERILATOR) $(VERILATOR_FLAGS) --protect-lib verilated_secret -Mdir obj_dir_secret/ secret_impl.v
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- COMPILE protected library ----------------------------------"
|
||||||
|
@echo " This builds verilated_secret.sv, libverilated_secret.a and"
|
||||||
|
@echo " libverilated_secret.so which can be distributed apart from"
|
||||||
|
@echo " the source"
|
||||||
|
@echo "---------------------------------------------------------------"
|
||||||
|
$(MAKE) -j 4 -C obj_dir_secret -f Vsecret_impl.mk
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- VERILATE top module ----------------------------------------"
|
||||||
|
@echo " Use the SystemVerilog wrapper (verilated_secret.sv) and the"
|
||||||
|
@echo " library (libverilated_secret.a) generated from the previous"
|
||||||
|
@echo " step"
|
||||||
|
@echo "---------------------------------------------------------------"
|
||||||
|
$(VERILATOR) $(TOP_VERILATOR_FLAGS) --exe -LDFLAGS '-L../obj_dir_secret -lverilated_secret -static' top.v obj_dir_secret/verilated_secret.sv sim_main.cpp
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- COMPILE entire design --------------------------------------"
|
||||||
|
$(MAKE) -j 4 -C obj_dir -f Vtop.mk
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- RUN --------------------------------------------------------"
|
||||||
|
@mkdir -p logs
|
||||||
|
obj_dir/Vtop +trace
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- DONE -------------------------------------------------------"
|
||||||
|
@echo "To see waveforms, open logs/vlt_dump.vcd in a waveform viewer"
|
||||||
|
@echo
|
||||||
|
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Other targets
|
||||||
|
|
||||||
|
show-config:
|
||||||
|
$(VERILATOR) -V
|
||||||
|
|
||||||
|
maintainer-copy::
|
||||||
|
clean mostlyclean distclean maintainer-clean::
|
||||||
|
-rm -rf obj_dir* logs *.log core
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
// DESCRIPTION: Verilator: --protect-lib example secret module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2019 by Todd Strader.
|
||||||
|
|
||||||
|
// This module will be used as libsecret.a or libsecret.so without
|
||||||
|
// exposing the source.
|
||||||
|
module secret_impl(
|
||||||
|
input [31:0] a,
|
||||||
|
input [31:0] b,
|
||||||
|
output logic [31:0] x,
|
||||||
|
input clk);
|
||||||
|
|
||||||
|
logic [31:0] accum_q = 0;
|
||||||
|
logic [31:0] secret_value = 9;
|
||||||
|
|
||||||
|
initial $display("%m: initialized");
|
||||||
|
|
||||||
|
always @(posedge clk) begin
|
||||||
|
accum_q <= accum_q + a;
|
||||||
|
if (accum_q > 10)
|
||||||
|
x <= b;
|
||||||
|
else
|
||||||
|
x <= a + b + secret_value;
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
// DESCRIPTION: Verilator: --protect-lib example module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2019 by Todd Strader.
|
||||||
|
//======================================================================
|
||||||
|
|
||||||
|
// See examples/tracing_c for notes on tracing
|
||||||
|
|
||||||
|
// Include common routines
|
||||||
|
#include <verilated.h>
|
||||||
|
|
||||||
|
#include "Vtop.h"
|
||||||
|
|
||||||
|
#if VM_TRACE
|
||||||
|
# include <verilated_vcd_c.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
vluint64_t main_time = 0;
|
||||||
|
double sc_time_stamp() {
|
||||||
|
return main_time;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char** argv, char** env) {
|
||||||
|
if (0 && argc && argv && env) {}
|
||||||
|
|
||||||
|
Verilated::debug(0);
|
||||||
|
Verilated::randReset(2);
|
||||||
|
Verilated::commandArgs(argc, argv);
|
||||||
|
|
||||||
|
// Construct the Verilated model, including the secret module
|
||||||
|
Vtop* top = new Vtop;
|
||||||
|
|
||||||
|
#if VM_TRACE
|
||||||
|
// When tracing, the contents of the secret module will not be seen
|
||||||
|
VerilatedVcdC* tfp = NULL;
|
||||||
|
const char* flag = Verilated::commandArgsPlusMatch("trace");
|
||||||
|
if (flag && 0==strcmp(flag, "+trace")) {
|
||||||
|
Verilated::traceEverOn(true);
|
||||||
|
VL_PRINTF("Enabling waves into logs/vlt_dump.vcd...\n");
|
||||||
|
tfp = new VerilatedVcdC;
|
||||||
|
top->trace(tfp, 99);
|
||||||
|
Verilated::mkdir("logs");
|
||||||
|
tfp->open("logs/vlt_dump.vcd");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
top->clk = 0;
|
||||||
|
|
||||||
|
// Simulate until $finish
|
||||||
|
while (!Verilated::gotFinish()) {
|
||||||
|
main_time++;
|
||||||
|
top->clk = ~top->clk & 0x1;
|
||||||
|
top->eval();
|
||||||
|
#if VM_TRACE
|
||||||
|
if (tfp) tfp->dump(main_time);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Final model cleanup
|
||||||
|
top->final();
|
||||||
|
|
||||||
|
// Close trace if opened
|
||||||
|
#if VM_TRACE
|
||||||
|
if (tfp) { tfp->close(); tfp = NULL; }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Destroy model
|
||||||
|
delete top; top = NULL;
|
||||||
|
|
||||||
|
// Fin
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
// DESCRIPTION: Verilator: --protect-lib example module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2019 by Todd Strader.
|
||||||
|
|
||||||
|
// See also the EXAMPLE section in the verilator manpage/document.
|
||||||
|
module top (input clk);
|
||||||
|
|
||||||
|
integer cyc = 0;
|
||||||
|
logic [31:0] a = 0;
|
||||||
|
logic [31:0] b = 0;
|
||||||
|
logic [31:0] x;
|
||||||
|
|
||||||
|
verilated_secret secret (.a, .b, .x, .clk);
|
||||||
|
|
||||||
|
always @(posedge clk) begin
|
||||||
|
$display("[%0t] cyc=%0d a=%0d b=%0d x=%0d", $time, cyc, a, b, x);
|
||||||
|
cyc <= cyc + 1;
|
||||||
|
if (cyc == 0) begin
|
||||||
|
a <= 5;
|
||||||
|
b <= 7;
|
||||||
|
end else if (cyc == 1) begin
|
||||||
|
a <= 6;
|
||||||
|
b <= 2;
|
||||||
|
end else if (cyc == 2) begin
|
||||||
|
a <= 1;
|
||||||
|
b <= 9;
|
||||||
|
end else if (cyc > 3) begin
|
||||||
|
$display("Done");
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
*.dmp
|
||||||
|
*.log
|
||||||
|
*.csrc
|
||||||
|
*.vcd
|
||||||
|
obj_*
|
||||||
|
logs
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# DESCRIPTION: Verilator Example: Small Makefile
|
||||||
|
#
|
||||||
|
# This calls the object directory makefile. That allows the objects to
|
||||||
|
# be placed in the "current directory" which simplifies the Makefile.
|
||||||
|
#
|
||||||
|
# Copyright 2003-2019 by Wilson Snyder. This program is free software; you can
|
||||||
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
# Version 2.0.
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
# Check for sanity to avoid later confusion
|
||||||
|
|
||||||
|
ifneq ($(words $(CURDIR)),1)
|
||||||
|
$(error Unsupported: GNU Make cannot build in directories containing spaces, build elsewhere: '$(CURDIR)')
|
||||||
|
endif
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Set up variables
|
||||||
|
|
||||||
|
# If $VERILATOR_ROOT isn't in the environment, we assume it is part of a
|
||||||
|
# package install, and verilator is in your path. Otherwise find the
|
||||||
|
# binary relative to $VERILATOR_ROOT (such as when inside the git sources).
|
||||||
|
ifeq ($(VERILATOR_ROOT),)
|
||||||
|
VERILATOR = verilator
|
||||||
|
VERILATOR_COVERAGE = verilator_coverage
|
||||||
|
else
|
||||||
|
export VERILATOR_ROOT
|
||||||
|
VERILATOR = $(VERILATOR_ROOT)/bin/verilator
|
||||||
|
VERILATOR_COVERAGE = $(VERILATOR_ROOT)/bin/verilator_coverage
|
||||||
|
endif
|
||||||
|
|
||||||
|
VERILATOR_FLAGS =
|
||||||
|
# Generate C++ in executable form
|
||||||
|
VERILATOR_FLAGS += -cc --exe
|
||||||
|
# Generate makefile dependencies (not shown as complicates the Makefile)
|
||||||
|
#VERILATOR_FLAGS += -MMD
|
||||||
|
# Optimize
|
||||||
|
VERILATOR_FLAGS += -O2 -x-assign 0
|
||||||
|
# Warn abount lint issues; may not want this on less solid designs
|
||||||
|
VERILATOR_FLAGS += -Wall
|
||||||
|
# Make waveforms
|
||||||
|
VERILATOR_FLAGS += --trace
|
||||||
|
# Check SystemVerilog assertions
|
||||||
|
VERILATOR_FLAGS += --assert
|
||||||
|
# Generate coverage analysis
|
||||||
|
VERILATOR_FLAGS += --coverage
|
||||||
|
# Run Verilator in debug mode
|
||||||
|
#VERILATOR_FLAGS += --debug
|
||||||
|
# Add this trace to get a backtrace in gdb
|
||||||
|
#VERILATOR_FLAGS += --gdbbt
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
default: run
|
||||||
|
|
||||||
|
run:
|
||||||
|
@echo
|
||||||
|
@echo "-- Verilator tracing example"
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- VERILATE ----------------"
|
||||||
|
$(VERILATOR) $(VERILATOR_FLAGS) -f input.vc top.v sim_main.cpp
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- COMPILE -----------------"
|
||||||
|
# To compile, we can either just do what Verilator asks,
|
||||||
|
# or call a submakefile where we can override the rules ourselves
|
||||||
|
# $(MAKE) -j 4 -C obj_dir -f Vtop.mk
|
||||||
|
$(MAKE) -j 4 -C obj_dir -f ../Makefile_obj
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- RUN ---------------------"
|
||||||
|
@mkdir -p logs
|
||||||
|
obj_dir/Vtop +trace
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- COVERAGE ----------------"
|
||||||
|
$(VERILATOR_COVERAGE) --annotate logs/annotated logs/coverage.dat
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- DONE --------------------"
|
||||||
|
@echo "To see waveforms, open vlt_dump.vcd in a waveform viewer"
|
||||||
|
@echo
|
||||||
|
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Other targets
|
||||||
|
|
||||||
|
show-config:
|
||||||
|
$(VERILATOR) -V
|
||||||
|
|
||||||
|
maintainer-copy::
|
||||||
|
clean mostlyclean distclean maintainer-clean::
|
||||||
|
-rm -rf obj_dir logs *.log *.dmp *.vpd coverage.dat core
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
# -*- Makefile -*-
|
||||||
|
#######################################################################
|
||||||
|
#
|
||||||
|
# DESCRIPTION: Verilator Example: Makefile for inside object directory
|
||||||
|
#
|
||||||
|
# This is executed in the object directory, and called by ../Makefile
|
||||||
|
#
|
||||||
|
# Copyright 2003-2019 by Wilson Snyder. This program is free software; you can
|
||||||
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
# Version 2.0.
|
||||||
|
#
|
||||||
|
#######################################################################
|
||||||
|
|
||||||
|
default: Vtop
|
||||||
|
|
||||||
|
# Include the rules made by Verilator
|
||||||
|
include Vtop.mk
|
||||||
|
|
||||||
|
# Use OBJCACHE (ccache) if using gmake and its installed
|
||||||
|
COMPILE.cc = $(OBJCACHE) $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
# Compile flags
|
||||||
|
|
||||||
|
# Override some default compile flags
|
||||||
|
CPPFLAGS += -MMD -MP
|
||||||
|
CPPFLAGS += -DVL_DEBUG=1
|
||||||
|
# Turn on some more flags (when configured appropriately)
|
||||||
|
# For testing inside Verilator, "configure --enable-ccwarn" will do this
|
||||||
|
# automatically; otherwise you may want this unconditionally enabled
|
||||||
|
ifeq ($(CFG_WITH_CCWARN),yes) # Local... Else don't burden users
|
||||||
|
USER_CPPFLAGS_WALL += -W -Werror -Wall
|
||||||
|
endif
|
||||||
|
|
||||||
|
# See the benchmarking section of bin/verilator.
|
||||||
|
# Support class optimizations. This includes the tracing and symbol table.
|
||||||
|
# SystemC takes minutes to optimize, thus it is off by default.
|
||||||
|
OPT_SLOW =
|
||||||
|
# Fast path optimizations. Most time is spent in these classes.
|
||||||
|
OPT_FAST = -O2 -fstrict-aliasing
|
||||||
|
#OPT_FAST = -O
|
||||||
|
#OPT_FAST =
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
# Linking final exe -- presumes have a sim_main.cpp
|
||||||
|
|
||||||
|
# Special compile rule
|
||||||
|
sim_main.o: sim_main.cpp $(VM_PREFIX).h
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
######################################################################
|
||||||
|
# Automatically understand dependencies
|
||||||
|
|
||||||
|
DEPS := $(wildcard *.d)
|
||||||
|
ifneq ($(DEPS),)
|
||||||
|
include $(DEPS)
|
||||||
|
endif
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// This file typically lists flags required by a large project, e.g. include directories
|
||||||
|
+librescan +libext+.v+.sv+.vh+.svh -y .
|
||||||
@@ -0,0 +1,126 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog example module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2017 by Wilson Snyder.
|
||||||
|
//======================================================================
|
||||||
|
|
||||||
|
// Include common routines
|
||||||
|
#include <verilated.h>
|
||||||
|
|
||||||
|
// Include model header, generated from Verilating "top.v"
|
||||||
|
#include "Vtop.h"
|
||||||
|
|
||||||
|
// If "verilator --trace" is used, include the tracing class
|
||||||
|
#if VM_TRACE
|
||||||
|
# include <verilated_vcd_c.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Current simulation time (64-bit unsigned)
|
||||||
|
vluint64_t main_time = 0;
|
||||||
|
// Called by $time in Verilog
|
||||||
|
double sc_time_stamp() {
|
||||||
|
return main_time; // Note does conversion to real, to match SystemC
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char** argv, char** env) {
|
||||||
|
// This is a more complicated example, please also see the simpler examples/make_hello_c.
|
||||||
|
|
||||||
|
// Prevent unused variable warnings
|
||||||
|
if (0 && argc && argv && env) {}
|
||||||
|
|
||||||
|
// Set debug level, 0 is off, 9 is highest presently used
|
||||||
|
// May be overridden by commandArgs
|
||||||
|
Verilated::debug(0);
|
||||||
|
|
||||||
|
// Randomization reset policy
|
||||||
|
// May be overridden by commandArgs
|
||||||
|
Verilated::randReset(2);
|
||||||
|
|
||||||
|
// Pass arguments so Verilated code can see them, e.g. $value$plusargs
|
||||||
|
// This needs to be called before you create any model
|
||||||
|
Verilated::commandArgs(argc, argv);
|
||||||
|
|
||||||
|
// Construct the Verilated model, from Vtop.h generated from Verilating "top.v"
|
||||||
|
Vtop* top = new Vtop; // Or use a const unique_ptr, or the VL_UNIQUE_PTR wrapper
|
||||||
|
|
||||||
|
#if VM_TRACE
|
||||||
|
// If verilator was invoked with --trace argument,
|
||||||
|
// and if at run time passed the +trace argument, turn on tracing
|
||||||
|
VerilatedVcdC* tfp = NULL;
|
||||||
|
const char* flag = Verilated::commandArgsPlusMatch("trace");
|
||||||
|
if (flag && 0==strcmp(flag, "+trace")) {
|
||||||
|
Verilated::traceEverOn(true); // Verilator must compute traced signals
|
||||||
|
VL_PRINTF("Enabling waves into logs/vlt_dump.vcd...\n");
|
||||||
|
tfp = new VerilatedVcdC;
|
||||||
|
top->trace(tfp, 99); // Trace 99 levels of hierarchy
|
||||||
|
Verilated::mkdir("logs");
|
||||||
|
tfp->open("logs/vlt_dump.vcd"); // Open the dump file
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Set some inputs
|
||||||
|
top->reset_l = !0;
|
||||||
|
top->fastclk = 0;
|
||||||
|
top->clk = 0;
|
||||||
|
top->in_small = 1;
|
||||||
|
top->in_quad = 0x1234;
|
||||||
|
top->in_wide[0] = 0x11111111;
|
||||||
|
top->in_wide[1] = 0x22222222;
|
||||||
|
top->in_wide[2] = 0x3;
|
||||||
|
|
||||||
|
// Simulate until $finish
|
||||||
|
while (!Verilated::gotFinish()) {
|
||||||
|
main_time++; // Time passes...
|
||||||
|
|
||||||
|
// Toggle clocks and such
|
||||||
|
top->fastclk = !top->fastclk;
|
||||||
|
if ((main_time % 10) == 3) {
|
||||||
|
top->clk = 1;
|
||||||
|
}
|
||||||
|
if ((main_time % 10) == 8) {
|
||||||
|
top->clk = 0;
|
||||||
|
}
|
||||||
|
if (main_time > 1 && main_time < 10) {
|
||||||
|
top->reset_l = !1; // Assert reset
|
||||||
|
} else {
|
||||||
|
top->reset_l = !0; // Deassert reset
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assign some other inputs
|
||||||
|
top->in_quad += 0x12;
|
||||||
|
|
||||||
|
// Evaluate model
|
||||||
|
top->eval();
|
||||||
|
|
||||||
|
#if VM_TRACE
|
||||||
|
// Dump trace data for this cycle
|
||||||
|
if (tfp) tfp->dump(main_time);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Read outputs
|
||||||
|
VL_PRINTF("[%" VL_PRI64 "d] clk=%x rstl=%x iquad=%" VL_PRI64 "x"
|
||||||
|
" -> oquad=%" VL_PRI64"x owide=%x_%08x_%08x\n",
|
||||||
|
main_time, top->clk, top->reset_l, top->in_quad,
|
||||||
|
top->out_quad, top->out_wide[2], top->out_wide[1], top->out_wide[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Final model cleanup
|
||||||
|
top->final();
|
||||||
|
|
||||||
|
// Close trace if opened
|
||||||
|
#if VM_TRACE
|
||||||
|
if (tfp) { tfp->close(); tfp = NULL; }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Coverage analysis (since test passed)
|
||||||
|
#if VM_COVERAGE
|
||||||
|
Verilated::mkdir("logs");
|
||||||
|
VerilatedCov::write("logs/coverage.dat");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Destroy model
|
||||||
|
delete top; top = NULL;
|
||||||
|
|
||||||
|
// Fin
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2003 by Wilson Snyder.
|
||||||
|
// ======================================================================
|
||||||
|
|
||||||
|
module sub
|
||||||
|
(
|
||||||
|
input clk,
|
||||||
|
input fastclk,
|
||||||
|
input reset_l
|
||||||
|
);
|
||||||
|
|
||||||
|
// Example counter/flop
|
||||||
|
reg [31:0] count_f;
|
||||||
|
always_ff @ (posedge fastclk) begin
|
||||||
|
if (!reset_l) begin
|
||||||
|
/*AUTORESET*/
|
||||||
|
// Beginning of autoreset for uninitialized flops
|
||||||
|
count_f <= 32'h0;
|
||||||
|
// End of automatics
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
count_f <= count_f + 1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
// Another example flop
|
||||||
|
reg [31:0] count_c;
|
||||||
|
always_ff @ (posedge clk) begin
|
||||||
|
if (!reset_l) begin
|
||||||
|
/*AUTORESET*/
|
||||||
|
// Beginning of autoreset for uninitialized flops
|
||||||
|
count_c <= 32'h0;
|
||||||
|
// End of automatics
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
count_c <= count_c + 1;
|
||||||
|
if (count_c >= 3) begin
|
||||||
|
$display("[%0t] fastclk is %0d times faster than clk\n",
|
||||||
|
$time, count_f/count_c);
|
||||||
|
// This write is a magic value the Makefile uses to make sure the
|
||||||
|
// test completes successfully.
|
||||||
|
$write("*-* All Finished *-*\n");
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
// An example assertion
|
||||||
|
always_ff @ (posedge clk) begin
|
||||||
|
AssertionExample: assert (!reset_l || count_c<100);
|
||||||
|
end
|
||||||
|
|
||||||
|
// And example coverage analysis
|
||||||
|
cover property (@(posedge clk) count_c==3);
|
||||||
|
|
||||||
|
endmodule
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog example module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2003 by Wilson Snyder.
|
||||||
|
// ======================================================================
|
||||||
|
|
||||||
|
// This is intended to be a complex example of several features, please also
|
||||||
|
// see the simpler examples/make_hello_c.
|
||||||
|
|
||||||
|
module top
|
||||||
|
(
|
||||||
|
// Declare some signals so we can see how I/O works
|
||||||
|
input clk,
|
||||||
|
input fastclk,
|
||||||
|
input reset_l,
|
||||||
|
|
||||||
|
output wire [1:0] out_small,
|
||||||
|
output wire [39:0] out_quad,
|
||||||
|
output wire [69:0] out_wide,
|
||||||
|
input [1:0] in_small,
|
||||||
|
input [39:0] in_quad,
|
||||||
|
input [69:0] in_wide
|
||||||
|
);
|
||||||
|
|
||||||
|
// Connect up the outputs, using some trivial logic
|
||||||
|
assign out_small = ~reset_l ? '0 : (in_small + 2'b1);
|
||||||
|
assign out_quad = ~reset_l ? '0 : (in_quad + 40'b1);
|
||||||
|
assign out_wide = ~reset_l ? '0 : (in_wide + 70'b1);
|
||||||
|
|
||||||
|
// And an example sub module. The submodule will print stuff.
|
||||||
|
sub sub (/*AUTOINST*/
|
||||||
|
// Inputs
|
||||||
|
.clk (clk),
|
||||||
|
.fastclk (fastclk),
|
||||||
|
.reset_l (reset_l));
|
||||||
|
|
||||||
|
// Print some stuff as an example
|
||||||
|
initial begin
|
||||||
|
$display("[%0t] Model running...\n", $time);
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
*.dmp
|
||||||
|
*.log
|
||||||
|
*.csrc
|
||||||
|
*.vcd
|
||||||
|
obj_*
|
||||||
|
logs
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# DESCRIPTION: Verilator Example: Small Makefile
|
||||||
|
#
|
||||||
|
# This calls the object directory makefile. That allows the objects to
|
||||||
|
# be placed in the "current directory" which simplifies the Makefile.
|
||||||
|
#
|
||||||
|
# Copyright 2003-2019 by Wilson Snyder. This program is free software; you can
|
||||||
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
# Version 2.0.
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
# Check for sanity to avoid later confusion
|
||||||
|
|
||||||
|
ifneq ($(words $(CURDIR)),1)
|
||||||
|
$(error Unsupported: GNU Make cannot build in directories containing spaces, build elsewhere: '$(CURDIR)')
|
||||||
|
endif
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Set up variables
|
||||||
|
|
||||||
|
# If $VERILATOR_ROOT isn't in the environment, we assume it is part of a
|
||||||
|
# package install, and verilator is in your path. Otherwise find the
|
||||||
|
# binary relative to $VERILATOR_ROOT (such as when inside the git sources).
|
||||||
|
ifeq ($(VERILATOR_ROOT),)
|
||||||
|
VERILATOR = verilator
|
||||||
|
VERILATOR_COVERAGE = verilator_coverage
|
||||||
|
else
|
||||||
|
export VERILATOR_ROOT
|
||||||
|
VERILATOR = $(VERILATOR_ROOT)/bin/verilator
|
||||||
|
VERILATOR_COVERAGE = $(VERILATOR_ROOT)/bin/verilator_coverage
|
||||||
|
endif
|
||||||
|
|
||||||
|
VERILATOR_FLAGS =
|
||||||
|
# Generate SystemC in executable form
|
||||||
|
VERILATOR_FLAGS += -sc --exe
|
||||||
|
# Generate makefile dependencies (not shown as complicates the Makefile)
|
||||||
|
#VERILATOR_FLAGS += -MMD
|
||||||
|
# Optimize
|
||||||
|
VERILATOR_FLAGS += -O2 -x-assign 0
|
||||||
|
# Warn abount lint issues; may not want this on less solid designs
|
||||||
|
VERILATOR_FLAGS += -Wall
|
||||||
|
# Make waveforms
|
||||||
|
VERILATOR_FLAGS += --trace
|
||||||
|
# Check SystemVerilog assertions
|
||||||
|
VERILATOR_FLAGS += --assert
|
||||||
|
# Generate coverage analysis
|
||||||
|
VERILATOR_FLAGS += --coverage
|
||||||
|
# Run Verilator in debug mode
|
||||||
|
#VERILATOR_FLAGS += --debug
|
||||||
|
# Add this trace to get a backtrace in gdb
|
||||||
|
#VERILATOR_FLAGS += --gdbbt
|
||||||
|
|
||||||
|
# Check if SC exists via a verilator call (empty if not)
|
||||||
|
SYSTEMC_EXISTS := $(shell $(VERILATOR) --getenv SYSTEMC_INCLUDE)
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
ifneq ($(SYSTEMC_EXISTS),)
|
||||||
|
default: run
|
||||||
|
else
|
||||||
|
default: nosc
|
||||||
|
endif
|
||||||
|
|
||||||
|
run:
|
||||||
|
@echo
|
||||||
|
@echo "-- Verilator tracing example"
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- VERILATE ----------------"
|
||||||
|
$(VERILATOR) $(VERILATOR_FLAGS) -f input.vc top.v sc_main.cpp
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- COMPILE ----------------="
|
||||||
|
# To compile, we can either just do what Verilator asks,
|
||||||
|
# or call a submakefile where we can override the rules ourselves
|
||||||
|
# $(MAKE) -j 4 -C obj_dir -f Vtop.mk
|
||||||
|
$(MAKE) -j 4 -C obj_dir -f ../Makefile_obj
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- RUN ---------------------"
|
||||||
|
@mkdir -p logs
|
||||||
|
obj_dir/Vtop +trace
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- COVERAGE ----------------"
|
||||||
|
$(VERILATOR_COVERAGE) --annotate logs/annotated logs/coverage.dat
|
||||||
|
|
||||||
|
@echo
|
||||||
|
@echo "-- DONE --------------------"
|
||||||
|
@echo "To see waveforms, open vlt_dump.vcd in a waveform viewer"
|
||||||
|
@echo
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Other targets
|
||||||
|
|
||||||
|
nosc:
|
||||||
|
@echo
|
||||||
|
@echo "%Skip: SYSTEMC_INCLUDE not in environment"
|
||||||
|
@echo "(If you have SystemC see the README, and rebuild Verilator)"
|
||||||
|
@echo
|
||||||
|
|
||||||
|
show-config:
|
||||||
|
$(VERILATOR) -V
|
||||||
|
|
||||||
|
maintainer-copy::
|
||||||
|
clean mostlyclean distclean maintainer-clean::
|
||||||
|
-rm -rf obj_dir logs *.log *.dmp *.vpd coverage.dat core
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
# -*- Makefile -*-
|
||||||
|
#######################################################################
|
||||||
|
#
|
||||||
|
# DESCRIPTION: Verilator Example: Makefile for inside object directory
|
||||||
|
#
|
||||||
|
# This is executed in the object directory, and called by ../Makefile
|
||||||
|
#
|
||||||
|
# Copyright 2003-2019 by Wilson Snyder. This program is free software; you can
|
||||||
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
# Version 2.0.
|
||||||
|
#
|
||||||
|
#######################################################################
|
||||||
|
|
||||||
|
default: Vtop
|
||||||
|
|
||||||
|
# Include the rules made by Verilator
|
||||||
|
include Vtop.mk
|
||||||
|
|
||||||
|
# Use OBJCACHE (ccache) if using gmake and its installed
|
||||||
|
COMPILE.cc = $(OBJCACHE) $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
# Compile flags
|
||||||
|
|
||||||
|
# Override some default compile flags
|
||||||
|
CPPFLAGS += -MMD -MP
|
||||||
|
CPPFLAGS += -DVL_DEBUG=1
|
||||||
|
# SystemC isn't too clean
|
||||||
|
CPPFLAGS += -Wno-deprecated
|
||||||
|
# Turn on some more flags (when configured appropriately)
|
||||||
|
# For testing inside Verilator, "configure --enable-ccwarn" will do this
|
||||||
|
# automatically; otherwise you may want this unconditionally enabled
|
||||||
|
ifeq ($(CFG_WITH_CCWARN),yes) # Local... Else don't burden users
|
||||||
|
USER_CPPFLAGS_WALL += -W -Werror -Wall
|
||||||
|
endif
|
||||||
|
|
||||||
|
# If you build your own rules from scratch, note you need to include
|
||||||
|
# SystemC as follows (Vtop.mk file includes verilated.mk with these
|
||||||
|
# already).
|
||||||
|
# CPPFLAGS += $(SYSTEMC_CXX_FLAGS) -I$(SYSTEMC_INCLUDE)
|
||||||
|
# LDFLAGS += $(SYSTEMC_CXX_FLAGS) -L$(SYSTEMC_LIBDIR)
|
||||||
|
|
||||||
|
# See the benchmarking section of bin/verilator.
|
||||||
|
# Support class optimizations. This includes the tracing and symbol table.
|
||||||
|
# SystemC takes minutes to optimize, thus it is off by default.
|
||||||
|
OPT_SLOW =
|
||||||
|
# Fast path optimizations. Most time is spent in these classes.
|
||||||
|
OPT_FAST = -O2 -fstrict-aliasing
|
||||||
|
#OPT_FAST = -O
|
||||||
|
#OPT_FAST =
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
# Linking final exe -- presumes have a sim_main.cpp
|
||||||
|
|
||||||
|
# Special compile rule
|
||||||
|
sim_main.o: sim_main.cpp $(VM_PREFIX).h
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
######################################################################
|
||||||
|
# Automatically understand dependencies
|
||||||
|
|
||||||
|
DEPS := $(wildcard *.d)
|
||||||
|
ifneq ($(DEPS),)
|
||||||
|
include $(DEPS)
|
||||||
|
endif
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// This file typically lists flags required by a large project, e.g. include directories
|
||||||
|
+librescan +libext+.v+.sv+.vh+.svh -y .
|
||||||
@@ -0,0 +1,150 @@
|
|||||||
|
// -*- SystemC -*-
|
||||||
|
// DESCRIPTION: Verilator Example: Top level main for invoking SystemC model
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2017 by Wilson Snyder.
|
||||||
|
//======================================================================
|
||||||
|
|
||||||
|
// SystemC global header
|
||||||
|
#include <systemc.h>
|
||||||
|
|
||||||
|
// Include common routines
|
||||||
|
#include <verilated.h>
|
||||||
|
#if VM_TRACE
|
||||||
|
#include <verilated_vcd_sc.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <sys/stat.h> // mkdir
|
||||||
|
|
||||||
|
// Include model header, generated from Verilating "top.v"
|
||||||
|
#include "Vtop.h"
|
||||||
|
|
||||||
|
int sc_main(int argc, char* argv[]) {
|
||||||
|
// This is a more complicated example, please also see the simpler examples/make_hello_c.
|
||||||
|
|
||||||
|
// Prevent unused variable warnings
|
||||||
|
if (0 && argc && argv) {}
|
||||||
|
|
||||||
|
// Set debug level, 0 is off, 9 is highest presently used
|
||||||
|
// May be overridden by commandArgs
|
||||||
|
Verilated::debug(0);
|
||||||
|
|
||||||
|
// Randomization reset policy
|
||||||
|
// May be overridden by commandArgs
|
||||||
|
Verilated::randReset(2);
|
||||||
|
|
||||||
|
// Pass arguments so Verilated code can see them, e.g. $value$plusargs
|
||||||
|
// This needs to be called before you create any model
|
||||||
|
Verilated::commandArgs(argc, argv);
|
||||||
|
|
||||||
|
// General logfile
|
||||||
|
ios::sync_with_stdio();
|
||||||
|
|
||||||
|
// Defaults time
|
||||||
|
#if (SYSTEMC_VERSION>20011000)
|
||||||
|
#else
|
||||||
|
sc_time dut(1.0, sc_ns);
|
||||||
|
sc_set_default_time_unit(dut);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Define clocks
|
||||||
|
#if (SYSTEMC_VERSION>=20070314)
|
||||||
|
sc_clock clk ("clk", 10,SC_NS, 0.5, 3,SC_NS, true);
|
||||||
|
sc_clock fastclk ("fastclk", 2,SC_NS, 0.5, 2,SC_NS, true);
|
||||||
|
#else
|
||||||
|
sc_clock clk ("clk", 10, 0.5, 3, true);
|
||||||
|
sc_clock fastclk ("fastclk", 2, 0.5, 2, true);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Define interconnect
|
||||||
|
sc_signal<bool> reset_l;
|
||||||
|
sc_signal<vluint32_t> in_small;
|
||||||
|
sc_signal<vluint64_t> in_quad;
|
||||||
|
sc_signal<sc_bv<70> > in_wide;
|
||||||
|
sc_signal<vluint32_t> out_small;
|
||||||
|
sc_signal<vluint64_t> out_quad;
|
||||||
|
sc_signal<sc_bv<70> > out_wide;
|
||||||
|
|
||||||
|
// Construct the Verilated model, from inside Vtop.h
|
||||||
|
Vtop* top = new Vtop("top");
|
||||||
|
// Attach signals to the model
|
||||||
|
top->clk (clk);
|
||||||
|
top->fastclk (fastclk);
|
||||||
|
top->reset_l (reset_l);
|
||||||
|
top->in_small (in_small);
|
||||||
|
top->in_quad (in_quad);
|
||||||
|
top->in_wide (in_wide);
|
||||||
|
top->out_small (out_small);
|
||||||
|
top->out_quad (out_quad);
|
||||||
|
top->out_wide (out_wide);
|
||||||
|
|
||||||
|
#if VM_TRACE
|
||||||
|
// Before any evaluation, need to know to calculate those signals only used for tracing
|
||||||
|
Verilated::traceEverOn(true);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// You must do one evaluation before enabling waves, in order to allow
|
||||||
|
// SystemC to interconnect everything for testing.
|
||||||
|
#if (SYSTEMC_VERSION>=20070314)
|
||||||
|
sc_start(1,SC_NS);
|
||||||
|
#else
|
||||||
|
sc_start(1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if VM_TRACE
|
||||||
|
// If verilator was invoked with --trace argument,
|
||||||
|
// and if at run time passed the +trace argument, turn on tracing
|
||||||
|
VerilatedVcdSc* tfp = NULL;
|
||||||
|
const char* flag = Verilated::commandArgsPlusMatch("trace");
|
||||||
|
if (flag && 0==strcmp(flag, "+trace")) {
|
||||||
|
cout << "Enabling waves into logs/vlt_dump.vcd...\n";
|
||||||
|
tfp = new VerilatedVcdSc;
|
||||||
|
top->trace(tfp, 99); // Trace 99 levels of hierarchy
|
||||||
|
Verilated::mkdir("logs");
|
||||||
|
tfp->open("logs/vlt_dump.vcd");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Simulate until $finish
|
||||||
|
while (!Verilated::gotFinish()) {
|
||||||
|
#if VM_TRACE
|
||||||
|
// Flush the wave files each cycle so we can immediately see the output
|
||||||
|
// Don't do this in "real" programs, do it in an abort() handler instead
|
||||||
|
if (tfp) tfp->flush();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Apply inputs
|
||||||
|
if (VL_TIME_Q() > 1 && VL_TIME_Q() < 10) {
|
||||||
|
reset_l = !1; // Assert reset
|
||||||
|
} else if (VL_TIME_Q() > 1) {
|
||||||
|
reset_l = !0; // Deassert reset
|
||||||
|
}
|
||||||
|
|
||||||
|
// Simulate 1ns
|
||||||
|
#if (SYSTEMC_VERSION>=20070314)
|
||||||
|
sc_start(1,SC_NS);
|
||||||
|
#else
|
||||||
|
sc_start(1);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Final model cleanup
|
||||||
|
top->final();
|
||||||
|
|
||||||
|
// Close trace if opened
|
||||||
|
#if VM_TRACE
|
||||||
|
if (tfp) { tfp->close(); tfp = NULL; }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Coverage analysis (since test passed)
|
||||||
|
#if VM_COVERAGE
|
||||||
|
Verilated::mkdir("logs");
|
||||||
|
VerilatedCov::write("logs/coverage.dat");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Destroy model
|
||||||
|
delete top; top = NULL;
|
||||||
|
|
||||||
|
// Fin
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2003 by Wilson Snyder.
|
||||||
|
// ======================================================================
|
||||||
|
|
||||||
|
module sub
|
||||||
|
(
|
||||||
|
input clk,
|
||||||
|
input fastclk,
|
||||||
|
input reset_l
|
||||||
|
);
|
||||||
|
|
||||||
|
// Example counter/flop
|
||||||
|
reg [31:0] count_f;
|
||||||
|
always_ff @ (posedge fastclk) begin
|
||||||
|
if (!reset_l) begin
|
||||||
|
/*AUTORESET*/
|
||||||
|
// Beginning of autoreset for uninitialized flops
|
||||||
|
count_f <= 32'h0;
|
||||||
|
// End of automatics
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
count_f <= count_f + 1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
// Another example flop
|
||||||
|
reg [31:0] count_c;
|
||||||
|
always_ff @ (posedge clk) begin
|
||||||
|
if (!reset_l) begin
|
||||||
|
/*AUTORESET*/
|
||||||
|
// Beginning of autoreset for uninitialized flops
|
||||||
|
count_c <= 32'h0;
|
||||||
|
// End of automatics
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
count_c <= count_c + 1;
|
||||||
|
if (count_c >= 3) begin
|
||||||
|
$display("[%0t] fastclk is %0d times faster than clk\n",
|
||||||
|
$time, count_f/count_c);
|
||||||
|
// This write is a magic value the Makefile uses to make sure the
|
||||||
|
// test completes successfully.
|
||||||
|
$write("*-* All Finished *-*\n");
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
// An example assertion
|
||||||
|
always_ff @ (posedge clk) begin
|
||||||
|
AssertionExample: assert(!reset_l || count_c<100);
|
||||||
|
end
|
||||||
|
|
||||||
|
// And example coverage analysis
|
||||||
|
cover property (@(posedge clk) count_c==3);
|
||||||
|
|
||||||
|
endmodule
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog example module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2003 by Wilson Snyder.
|
||||||
|
// ======================================================================
|
||||||
|
|
||||||
|
// This is intended to be a complex example of several features, please also
|
||||||
|
// see the simpler examples/make_hello_c.
|
||||||
|
|
||||||
|
module top
|
||||||
|
(
|
||||||
|
// Declare some signals so we can see how I/O works
|
||||||
|
input clk,
|
||||||
|
input fastclk,
|
||||||
|
input reset_l,
|
||||||
|
|
||||||
|
output wire [1:0] out_small,
|
||||||
|
output wire [39:0] out_quad,
|
||||||
|
output wire [69:0] out_wide,
|
||||||
|
input [1:0] in_small,
|
||||||
|
input [39:0] in_quad,
|
||||||
|
input [69:0] in_wide
|
||||||
|
);
|
||||||
|
|
||||||
|
// Connect up the outputs, using some trivial logic
|
||||||
|
assign out_small = ~reset_l ? '0 : (in_small + 2'b1);
|
||||||
|
assign out_quad = ~reset_l ? '0 : (in_quad + 40'b1);
|
||||||
|
assign out_wide = ~reset_l ? '0 : (in_wide + 70'b1);
|
||||||
|
|
||||||
|
// And an example sub module. The submodule will print stuff.
|
||||||
|
sub sub (/*AUTOINST*/
|
||||||
|
// Inputs
|
||||||
|
.clk (clk),
|
||||||
|
.fastclk (fastclk),
|
||||||
|
.reset_l (reset_l));
|
||||||
|
|
||||||
|
// Print some stuff as an example
|
||||||
|
initial begin
|
||||||
|
$display("[%0t] Model running...\n", $time);
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
obj_*
|
||||||
|
copied
|
||||||
|
*.csv
|
||||||
|
*.dot
|
||||||
|
*.dmp
|
||||||
|
*.pdf
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# DESCRIPTION: Verilator Example: XML tests
|
||||||
|
#
|
||||||
|
# Copyright 2003-2019 by Wilson Snyder. This program is free software; you can
|
||||||
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
# Version 2.0.
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
# This makefile is not intended to be useful as an example itself,
|
||||||
|
# it is just to run the small example scripts in this directory.
|
||||||
|
|
||||||
|
# If $VERILATOR_ROOT isn't in the environment, we assume it is part of a
|
||||||
|
# package install, and verilator is in your path. Otherwise find the
|
||||||
|
# binary relative to $VERILATOR_ROOT (such as when inside the git sources).
|
||||||
|
ifeq ($(VERILATOR_ROOT),)
|
||||||
|
VERILATOR = verilator
|
||||||
|
else
|
||||||
|
export VERILATOR_ROOT
|
||||||
|
VERILATOR = $(VERILATOR_ROOT)/bin/verilator
|
||||||
|
endif
|
||||||
|
|
||||||
|
DOT = dot
|
||||||
|
PYTHON = python3
|
||||||
|
|
||||||
|
PYTHON_VERSION := $(shell ${PYTHON} --version 2>&1)
|
||||||
|
PYTHON_VERSION_FULL := $(wordlist 2,4,$(subst ., ,${PYTHON_VERSION}))
|
||||||
|
PYTHON_VERSION_MAJOR := $(word 1,${PYTHON_VERSION_FULL})
|
||||||
|
PYTHON_VERSION_MINOR := $(word 2,${PYTHON_VERSION_FULL})
|
||||||
|
PYTHON_GE_3_5 := $(shell [ ${PYTHON_VERSION_MAJOR} -eq 3 -a ${PYTHON_VERSION_MINOR} -ge 5 ] && echo true)
|
||||||
|
|
||||||
|
ifeq (${PYTHON_GE_3_5},true)
|
||||||
|
default: test
|
||||||
|
else
|
||||||
|
default: python_message
|
||||||
|
endif
|
||||||
|
|
||||||
|
python_message:
|
||||||
|
@echo "Found Python version ${PYTHON_VERSION}, but require >= 3.5"
|
||||||
|
|
||||||
|
test: \
|
||||||
|
test-vl_file_copy \
|
||||||
|
test-vl_hier_graph \
|
||||||
|
|
||||||
|
test-vl_file_copy:
|
||||||
|
@echo "-- vl_file_copy example"
|
||||||
|
$(PYTHON) vl_file_copy -odir copied top.v
|
||||||
|
@cmp copied/top.v top.v
|
||||||
|
@cmp copied/sub.v sub.v
|
||||||
|
|
||||||
|
test-vl_hier_graph:
|
||||||
|
@echo "-- vl_hier_graph example"
|
||||||
|
$(PYTHON) vl_hier_graph -o graph.dot top.v
|
||||||
|
@echo "Manually run: " $(DOT) -Tpdf -o graph.pdf graph.dot
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
maintainer-copy::
|
||||||
|
clean mostlyclean distclean maintainer-clean::
|
||||||
|
-rm -rf obj_dir *.log *.csv *.dmp *.dot *.vpd *.pdf core copied
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2019 by Wilson Snyder.
|
||||||
|
// ======================================================================
|
||||||
|
|
||||||
|
module sub
|
||||||
|
#(parameter type TYPE_t = logic)
|
||||||
|
(
|
||||||
|
input TYPE_t in,
|
||||||
|
output TYPE_t out
|
||||||
|
);
|
||||||
|
|
||||||
|
// Some simple logic
|
||||||
|
always_comb out = ~ in;
|
||||||
|
|
||||||
|
endmodule
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog example module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2019 by Wilson Snyder.
|
||||||
|
// ======================================================================
|
||||||
|
|
||||||
|
module top
|
||||||
|
(
|
||||||
|
input clk,
|
||||||
|
input fastclk,
|
||||||
|
input reset_l,
|
||||||
|
|
||||||
|
output wire [1:0] out_small,
|
||||||
|
output wire [39:0] out_quad,
|
||||||
|
output wire [69:0] out_wide,
|
||||||
|
input [1:0] in_small,
|
||||||
|
input [39:0] in_quad,
|
||||||
|
input [69:0] in_wide
|
||||||
|
);
|
||||||
|
|
||||||
|
sub #(.TYPE_t(logic [1:0])) sub_small
|
||||||
|
(.in(in_small),
|
||||||
|
.out(out_small));
|
||||||
|
|
||||||
|
sub #(.TYPE_t(logic [39:0])) sub_quad
|
||||||
|
(.in(in_quad),
|
||||||
|
.out(out_quad));
|
||||||
|
|
||||||
|
sub #(.TYPE_t(logic [69:0])) sub_wide
|
||||||
|
(.in(in_wide),
|
||||||
|
.out(out_wide));
|
||||||
|
endmodule
|
||||||
Executable
+112
@@ -0,0 +1,112 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- Python -*- See copyright, etc below
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import tempfile
|
||||||
|
import xml.etree.ElementTree as ET
|
||||||
|
from shutil import copy2
|
||||||
|
from pprint import pprint,pformat
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
|
||||||
|
class VlFileCopy:
|
||||||
|
def __init__(self,
|
||||||
|
verilator_args, # presently all verilator options are passed-thru
|
||||||
|
# ideally this script would check against options mentioned in help
|
||||||
|
debug=0,
|
||||||
|
output_dir='copied'): # directory name we output file uses
|
||||||
|
self.debug = debug
|
||||||
|
|
||||||
|
xml_temp = tempfile.NamedTemporaryFile()
|
||||||
|
|
||||||
|
args = ['--xml-output', xml_temp.name,
|
||||||
|
'--bbox-sys', # Parse some stuff can't translate
|
||||||
|
'--bbox-unsup',
|
||||||
|
'--prefix vlxml'] # So we know name of .xml output
|
||||||
|
args += verilator_args
|
||||||
|
self.run_verilator(args)
|
||||||
|
self.tree = ET.parse(xml_temp.name)
|
||||||
|
|
||||||
|
os.makedirs(output_dir, 0o777, True)
|
||||||
|
|
||||||
|
# Find and copy the files
|
||||||
|
root = self.tree.getroot()
|
||||||
|
xfiles = root.find('files')
|
||||||
|
for xfile in xfiles.findall('file'):
|
||||||
|
filename = xfile.get('filename')
|
||||||
|
if not re.match('^<', filename): # e.g. <built-in>
|
||||||
|
if self.debug:
|
||||||
|
print("\tcp %s %s" % (filename, output_dir))
|
||||||
|
copy2(filename, output_dir)
|
||||||
|
|
||||||
|
def run_verilator(self, args):
|
||||||
|
"""Run Verilator command, check errors"""
|
||||||
|
if os.getenv("VERILATOR_ROOT"):
|
||||||
|
command = os.getenv("VERILATOR_ROOT") + "/bin/verilator"
|
||||||
|
else:
|
||||||
|
command = "verilator"
|
||||||
|
command += ' ' + ' '.join(args)
|
||||||
|
if self.debug:
|
||||||
|
print("\t%s " % command)
|
||||||
|
status = subprocess.call(command, shell=True)
|
||||||
|
if status != 0:
|
||||||
|
raise Exception("Command failed running Verilator with '"+command+"', stopped")
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
|
||||||
|
if __name__=='__main__':
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
allow_abbrev=False,
|
||||||
|
formatter_class=argparse.RawTextHelpFormatter,
|
||||||
|
description=
|
||||||
|
"""Example of using Verilator XML output to copy a list of files to an
|
||||||
|
output directory (-odir, defaults to 'copied'), e.g. to easily create a
|
||||||
|
tarball of the design to pass to others.
|
||||||
|
|
||||||
|
Example usage:
|
||||||
|
vl_file_copy -f input.vc top.v -odir mycopy
|
||||||
|
# This will make at least mycopy/top.v
|
||||||
|
""",
|
||||||
|
epilog=
|
||||||
|
"""All other arguments are pass-thru to Verilator: e.g.:
|
||||||
|
|
||||||
|
+define+<var>=<value> Set preprocessor define
|
||||||
|
-F <file> Parse options from a file, relatively
|
||||||
|
-f <file> Parse options from a file
|
||||||
|
-G<name>=<value> Overwrite toplevel parameter
|
||||||
|
+incdir+<dir> Directory to search for includes
|
||||||
|
+libext+<ext>+[ext]... Extensions for finding modules
|
||||||
|
-v <filename> Verilog library
|
||||||
|
-y <dir> Directory to search for modules
|
||||||
|
|
||||||
|
This file ONLY is placed into the Public Domain, for any use, without
|
||||||
|
warranty, 2019 by Wilson Snyder."""
|
||||||
|
)
|
||||||
|
parser.add_argument('-debug', '--debug',
|
||||||
|
action='store_const', const=9,
|
||||||
|
help='enable debug')
|
||||||
|
parser.add_argument('-odir', '--odir',
|
||||||
|
action='store', metavar='directory', required=True,
|
||||||
|
help='target output directory')
|
||||||
|
(args, rem) = parser.parse_known_args()
|
||||||
|
|
||||||
|
print("NOTE: vl_file_copy is only an example starting point for writing your own tool.")
|
||||||
|
# That is:
|
||||||
|
# 1. We will accept basic patches
|
||||||
|
# 2. We are not expecting to make this globally useful. (e.g. we don't cleanup obj_dir)
|
||||||
|
# 3. "make install" will not install this.
|
||||||
|
# 4. This has not had production-worthy validation.
|
||||||
|
|
||||||
|
fc = VlFileCopy(output_dir = args.odir,
|
||||||
|
debug = args.debug,
|
||||||
|
verilator_args = rem)
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
### Local Variables:
|
||||||
|
### compile-command: "./vl_file_copy -h ; VERILATOR_ROOT=$V4 ./vl_file_copy +define+thru top.v"
|
||||||
|
### End:
|
||||||
Executable
+136
@@ -0,0 +1,136 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- Python -*- See copyright, etc below
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import tempfile
|
||||||
|
import xml.etree.ElementTree as ET
|
||||||
|
from shutil import copy2
|
||||||
|
from pprint import pprint,pformat
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
|
||||||
|
class VlHierGraph:
|
||||||
|
def __init__(self,
|
||||||
|
verilator_args, # presently all verilator options are passed-thru
|
||||||
|
# ideally this script would check against options mentioned in help
|
||||||
|
debug=0,
|
||||||
|
output_filename='graph.dot'): # output filename
|
||||||
|
self.debug = debug
|
||||||
|
self.next_vertex_number = 0
|
||||||
|
self.name_to_number = {}
|
||||||
|
|
||||||
|
xml_temp = tempfile.NamedTemporaryFile()
|
||||||
|
|
||||||
|
args = ['--xml-output', xml_temp.name,
|
||||||
|
'--bbox-sys', # Parse some stuff can't translate
|
||||||
|
'--bbox-unsup',
|
||||||
|
'--prefix vlxml'] # So we know name of .xml output
|
||||||
|
args += verilator_args
|
||||||
|
self.run_verilator(args)
|
||||||
|
self.tree = ET.parse(xml_temp.name)
|
||||||
|
|
||||||
|
with open(output_filename, "w") as fh:
|
||||||
|
# For more serious purposes, use the python graphviz package instead
|
||||||
|
fh.write("digraph {\n")
|
||||||
|
fh.write(" dpi=300;\n")
|
||||||
|
fh.write(" order=LR;\n")
|
||||||
|
fh.write(" node [fontsize=8 shape=\"box\" margin=0.01 width=0 height=0]")
|
||||||
|
fh.write(" edge [fontsize=6]")
|
||||||
|
# Find cells
|
||||||
|
root = self.tree.getroot()
|
||||||
|
netlist = root.find('netlist')
|
||||||
|
for module in netlist.findall('module'):
|
||||||
|
# origNames are before parameterization, name if after
|
||||||
|
mod_name = module.get('name')
|
||||||
|
mod_number = self.name_to_vertex_number(mod_name)
|
||||||
|
fh.write(" n%d [label=\"%s\""
|
||||||
|
% (mod_number, mod_name))
|
||||||
|
if module.get('topModule'):
|
||||||
|
fh.write(" color=\"red\" rank=1")
|
||||||
|
fh.write("];\n")
|
||||||
|
|
||||||
|
for instance in module.findall('instance'):
|
||||||
|
inst_name = instance.get('name')
|
||||||
|
def_name = instance.get('defName')
|
||||||
|
def_number = self.name_to_vertex_number(def_name)
|
||||||
|
fh.write(" n%d->n%d [label=\"%s\"];\n"
|
||||||
|
% (mod_number, def_number, inst_name));
|
||||||
|
|
||||||
|
fh.write("}\n")
|
||||||
|
|
||||||
|
def name_to_vertex_number(self, name):
|
||||||
|
if not name in self.name_to_number:
|
||||||
|
self.next_vertex_number += 1
|
||||||
|
self.name_to_number[name] = self.next_vertex_number
|
||||||
|
return self.name_to_number[name]
|
||||||
|
|
||||||
|
def run_verilator(self, args):
|
||||||
|
"""Run Verilator command, check errors"""
|
||||||
|
if os.getenv("VERILATOR_ROOT"):
|
||||||
|
command = os.getenv("VERILATOR_ROOT") + "/bin/verilator"
|
||||||
|
else:
|
||||||
|
command = "verilator"
|
||||||
|
command += ' ' + ' '.join(args)
|
||||||
|
if self.debug:
|
||||||
|
print("\t%s " % command)
|
||||||
|
status = subprocess.call(command, shell=True)
|
||||||
|
if status != 0:
|
||||||
|
raise Exception("Command failed running Verilator with '"+command+"', stopped")
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
|
||||||
|
if __name__=='__main__':
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
allow_abbrev=False,
|
||||||
|
formatter_class=argparse.RawTextHelpFormatter,
|
||||||
|
description=
|
||||||
|
"""Example of using Verilator XML output to create a .dot file showing the
|
||||||
|
design module hierarchy.
|
||||||
|
|
||||||
|
Example usage:
|
||||||
|
vl_hier_graph -f input.vc top.v -o graph.dot
|
||||||
|
dot -Tpdf -o graph.pdf graph.dot
|
||||||
|
""",
|
||||||
|
epilog=
|
||||||
|
"""All other arguments are pass-thru to Verilator: e.g.:
|
||||||
|
|
||||||
|
+define+<var>=<value> Set preprocessor define
|
||||||
|
-F <file> Parse options from a file, relatively
|
||||||
|
-f <file> Parse options from a file
|
||||||
|
-G<name>=<value> Overwrite toplevel parameter
|
||||||
|
+incdir+<dir> Directory to search for includes
|
||||||
|
+libext+<ext>+[ext]... Extensions for finding modules
|
||||||
|
-v <filename> Verilog library
|
||||||
|
-y <dir> Directory to search for modules
|
||||||
|
|
||||||
|
This file ONLY is placed into the Public Domain, for any use, without
|
||||||
|
warranty, 2019 by Wilson Snyder."""
|
||||||
|
)
|
||||||
|
parser.add_argument('-debug', '--debug',
|
||||||
|
action='store_const', const=9,
|
||||||
|
help='enable debug')
|
||||||
|
parser.add_argument('-o', '--o',
|
||||||
|
action='store', metavar='filename', required=True,
|
||||||
|
help='output filename')
|
||||||
|
(args, rem) = parser.parse_known_args()
|
||||||
|
|
||||||
|
print("NOTE: vl_hier_graph is only an example starting point for writing your own tool.")
|
||||||
|
# That is:
|
||||||
|
# 1. We will accept basic patches
|
||||||
|
# 2. We are not expecting to make this globally useful. (e.g. we don't cleanup obj_dir)
|
||||||
|
# 3. "make install" will not install this.
|
||||||
|
# 4. This has not had production-worthy validation.
|
||||||
|
|
||||||
|
fc = VlHierGraph(output_filename = args.o,
|
||||||
|
debug = args.debug,
|
||||||
|
verilator_args = rem)
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
### Local Variables:
|
||||||
|
### compile-command: "./vl_hier_graph -h ; VERILATOR_ROOT=$V4 ./vl_hier_graph +define+thru top.v"
|
||||||
|
### End:
|
||||||
@@ -1 +0,0 @@
|
|||||||
verilated.mk
|
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
verilated.mk
|
||||||
|
verilated_config.h
|
||||||
@@ -0,0 +1,549 @@
|
|||||||
|
/*
|
||||||
|
FastLZ - lightning-fast lossless compression library
|
||||||
|
|
||||||
|
Copyright (C) 2007 Ariya Hidayat (ariya@kde.org)
|
||||||
|
Copyright (C) 2006 Ariya Hidayat (ariya@kde.org)
|
||||||
|
Copyright (C) 2005 Ariya Hidayat (ariya@kde.org)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "fastlz.h"
|
||||||
|
|
||||||
|
#if !defined(FASTLZ__COMPRESSOR) && !defined(FASTLZ_DECOMPRESSOR)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Always check for bound when decompressing.
|
||||||
|
* Generally it is best to leave it defined.
|
||||||
|
*/
|
||||||
|
#define FASTLZ_SAFE
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Give hints to the compiler for branch prediction optimization.
|
||||||
|
*/
|
||||||
|
#if defined(__GNUC__) && (__GNUC__ > 2)
|
||||||
|
#define FASTLZ_EXPECT_CONDITIONAL(c) (__builtin_expect((c), 1))
|
||||||
|
#define FASTLZ_UNEXPECT_CONDITIONAL(c) (__builtin_expect((c), 0))
|
||||||
|
#else
|
||||||
|
#define FASTLZ_EXPECT_CONDITIONAL(c) (c)
|
||||||
|
#define FASTLZ_UNEXPECT_CONDITIONAL(c) (c)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Use inlined functions for supported systems.
|
||||||
|
*/
|
||||||
|
#if defined(__GNUC__) || defined(__DMC__) || defined(__POCC__) || defined(__WATCOMC__) || defined(__SUNPRO_C)
|
||||||
|
#define FASTLZ_INLINE inline
|
||||||
|
#elif defined(__BORLANDC__) || defined(_MSC_VER) || defined(__LCC__)
|
||||||
|
#define FASTLZ_INLINE __inline
|
||||||
|
#else
|
||||||
|
#define FASTLZ_INLINE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Prevent accessing more than 8-bit at once, except on x86 architectures.
|
||||||
|
*/
|
||||||
|
#if !defined(FASTLZ_STRICT_ALIGN)
|
||||||
|
#define FASTLZ_STRICT_ALIGN
|
||||||
|
#if defined(__i386__) || defined(__386) /* GNU C, Sun Studio */
|
||||||
|
#undef FASTLZ_STRICT_ALIGN
|
||||||
|
#elif defined(__i486__) || defined(__i586__) || defined(__i686__) || defined(__amd64) /* GNU C */
|
||||||
|
#undef FASTLZ_STRICT_ALIGN
|
||||||
|
#elif defined(_M_IX86) /* Intel, MSVC */
|
||||||
|
#undef FASTLZ_STRICT_ALIGN
|
||||||
|
#elif defined(__386)
|
||||||
|
#undef FASTLZ_STRICT_ALIGN
|
||||||
|
#elif defined(_X86_) /* MinGW */
|
||||||
|
#undef FASTLZ_STRICT_ALIGN
|
||||||
|
#elif defined(__I86__) /* Digital Mars */
|
||||||
|
#undef FASTLZ_STRICT_ALIGN
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* prototypes */
|
||||||
|
int fastlz_compress(const void* input, int length, void* output);
|
||||||
|
int fastlz_compress_level(int level, const void* input, int length, void* output);
|
||||||
|
int fastlz_decompress(const void* input, int length, void* output, int maxout);
|
||||||
|
|
||||||
|
#define MAX_COPY 32
|
||||||
|
#define MAX_LEN 264 /* 256 + 8 */
|
||||||
|
#define MAX_DISTANCE 8192
|
||||||
|
|
||||||
|
#if !defined(FASTLZ_STRICT_ALIGN)
|
||||||
|
#define FASTLZ_READU16(p) *((const flzuint16*)(p))
|
||||||
|
#else
|
||||||
|
#define FASTLZ_READU16(p) ((p)[0] | (p)[1]<<8)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define HASH_LOG 13
|
||||||
|
#define HASH_SIZE (1<< HASH_LOG)
|
||||||
|
#define HASH_MASK (HASH_SIZE-1)
|
||||||
|
#define HASH_FUNCTION(v,p) { v = FASTLZ_READU16(p); v ^= FASTLZ_READU16(p+1)^(v>>(16-HASH_LOG));v &= HASH_MASK; }
|
||||||
|
|
||||||
|
#undef FASTLZ_LEVEL
|
||||||
|
#define FASTLZ_LEVEL 1
|
||||||
|
|
||||||
|
#undef FASTLZ_COMPRESSOR
|
||||||
|
#undef FASTLZ_DECOMPRESSOR
|
||||||
|
#define FASTLZ_COMPRESSOR fastlz1_compress
|
||||||
|
#define FASTLZ_DECOMPRESSOR fastlz1_decompress
|
||||||
|
static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void* input, int length, void* output);
|
||||||
|
static FASTLZ_INLINE int FASTLZ_DECOMPRESSOR(const void* input, int length, void* output, int maxout);
|
||||||
|
#include "fastlz.c"
|
||||||
|
|
||||||
|
#undef FASTLZ_LEVEL
|
||||||
|
#define FASTLZ_LEVEL 2
|
||||||
|
|
||||||
|
#undef MAX_DISTANCE
|
||||||
|
#define MAX_DISTANCE 8191
|
||||||
|
#define MAX_FARDISTANCE (65535+MAX_DISTANCE-1)
|
||||||
|
|
||||||
|
#undef FASTLZ_COMPRESSOR
|
||||||
|
#undef FASTLZ_DECOMPRESSOR
|
||||||
|
#define FASTLZ_COMPRESSOR fastlz2_compress
|
||||||
|
#define FASTLZ_DECOMPRESSOR fastlz2_decompress
|
||||||
|
static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void* input, int length, void* output);
|
||||||
|
static FASTLZ_INLINE int FASTLZ_DECOMPRESSOR(const void* input, int length, void* output, int maxout);
|
||||||
|
#include "fastlz.c"
|
||||||
|
|
||||||
|
int fastlz_compress(const void* input, int length, void* output)
|
||||||
|
{
|
||||||
|
/* for short block, choose fastlz1 */
|
||||||
|
if(length < 65536)
|
||||||
|
return fastlz1_compress(input, length, output);
|
||||||
|
|
||||||
|
/* else... */
|
||||||
|
return fastlz2_compress(input, length, output);
|
||||||
|
}
|
||||||
|
|
||||||
|
int fastlz_decompress(const void* input, int length, void* output, int maxout)
|
||||||
|
{
|
||||||
|
/* magic identifier for compression level */
|
||||||
|
int level = ((*(const flzuint8*)input) >> 5) + 1;
|
||||||
|
|
||||||
|
if(level == 1)
|
||||||
|
return fastlz1_decompress(input, length, output, maxout);
|
||||||
|
if(level == 2)
|
||||||
|
return fastlz2_decompress(input, length, output, maxout);
|
||||||
|
|
||||||
|
/* unknown level, trigger error */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fastlz_compress_level(int level, const void* input, int length, void* output)
|
||||||
|
{
|
||||||
|
if(level == 1)
|
||||||
|
return fastlz1_compress(input, length, output);
|
||||||
|
if(level == 2)
|
||||||
|
return fastlz2_compress(input, length, output);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* !defined(FASTLZ_COMPRESSOR) && !defined(FASTLZ_DECOMPRESSOR) */
|
||||||
|
|
||||||
|
static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void* input, int length, void* output)
|
||||||
|
{
|
||||||
|
const flzuint8* ip = (const flzuint8*) input;
|
||||||
|
const flzuint8* ip_bound = ip + length - 2;
|
||||||
|
const flzuint8* ip_limit = ip + length - 12;
|
||||||
|
flzuint8* op = (flzuint8*) output;
|
||||||
|
|
||||||
|
const flzuint8* htab[HASH_SIZE];
|
||||||
|
const flzuint8** hslot;
|
||||||
|
flzuint32 hval;
|
||||||
|
|
||||||
|
flzuint32 copy;
|
||||||
|
|
||||||
|
/* sanity check */
|
||||||
|
if(FASTLZ_UNEXPECT_CONDITIONAL(length < 4))
|
||||||
|
{
|
||||||
|
if(length)
|
||||||
|
{
|
||||||
|
/* create literal copy only */
|
||||||
|
*op++ = length-1;
|
||||||
|
ip_bound++;
|
||||||
|
while(ip <= ip_bound)
|
||||||
|
*op++ = *ip++;
|
||||||
|
return length+1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* initializes hash table */
|
||||||
|
for (hslot = htab; hslot < htab + HASH_SIZE; hslot++)
|
||||||
|
*hslot = ip;
|
||||||
|
|
||||||
|
/* we start with literal copy */
|
||||||
|
copy = 2;
|
||||||
|
*op++ = MAX_COPY-1;
|
||||||
|
*op++ = *ip++;
|
||||||
|
*op++ = *ip++;
|
||||||
|
|
||||||
|
/* main loop */
|
||||||
|
while(FASTLZ_EXPECT_CONDITIONAL(ip < ip_limit))
|
||||||
|
{
|
||||||
|
const flzuint8* ref;
|
||||||
|
flzuint32 distance;
|
||||||
|
|
||||||
|
/* minimum match length */
|
||||||
|
flzuint32 len = 3;
|
||||||
|
|
||||||
|
/* comparison starting-point */
|
||||||
|
const flzuint8* anchor = ip;
|
||||||
|
|
||||||
|
/* check for a run */
|
||||||
|
#if FASTLZ_LEVEL==2
|
||||||
|
if(ip[0] == ip[-1] && FASTLZ_READU16(ip-1)==FASTLZ_READU16(ip+1))
|
||||||
|
{
|
||||||
|
distance = 1;
|
||||||
|
/* ip += 3; */ /* scan-build, never used */
|
||||||
|
ref = anchor - 1 + 3;
|
||||||
|
goto match;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* find potential match */
|
||||||
|
HASH_FUNCTION(hval,ip);
|
||||||
|
hslot = htab + hval;
|
||||||
|
ref = htab[hval];
|
||||||
|
|
||||||
|
/* calculate distance to the match */
|
||||||
|
distance = anchor - ref;
|
||||||
|
|
||||||
|
/* update hash table */
|
||||||
|
*hslot = anchor;
|
||||||
|
|
||||||
|
/* is this a match? check the first 3 bytes */
|
||||||
|
if(distance==0 ||
|
||||||
|
#if FASTLZ_LEVEL==1
|
||||||
|
(distance >= MAX_DISTANCE) ||
|
||||||
|
#else
|
||||||
|
(distance >= MAX_FARDISTANCE) ||
|
||||||
|
#endif
|
||||||
|
*ref++ != *ip++ || *ref++!=*ip++ || *ref++!=*ip++)
|
||||||
|
goto literal;
|
||||||
|
|
||||||
|
#if FASTLZ_LEVEL==2
|
||||||
|
/* far, needs at least 5-byte match */
|
||||||
|
if(distance >= MAX_DISTANCE)
|
||||||
|
{
|
||||||
|
if(*ip++ != *ref++ || *ip++!= *ref++)
|
||||||
|
goto literal;
|
||||||
|
len += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
match:
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* last matched byte */
|
||||||
|
ip = anchor + len;
|
||||||
|
|
||||||
|
/* distance is biased */
|
||||||
|
distance--;
|
||||||
|
|
||||||
|
if(!distance)
|
||||||
|
{
|
||||||
|
/* zero distance means a run */
|
||||||
|
flzuint8 x = ip[-1];
|
||||||
|
while(ip < ip_bound)
|
||||||
|
if(*ref++ != x) break; else ip++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
/* safe because the outer check against ip limit */
|
||||||
|
if(*ref++ != *ip++) break;
|
||||||
|
if(*ref++ != *ip++) break;
|
||||||
|
if(*ref++ != *ip++) break;
|
||||||
|
if(*ref++ != *ip++) break;
|
||||||
|
if(*ref++ != *ip++) break;
|
||||||
|
if(*ref++ != *ip++) break;
|
||||||
|
if(*ref++ != *ip++) break;
|
||||||
|
if(*ref++ != *ip++) break;
|
||||||
|
while(ip < ip_bound)
|
||||||
|
if(*ref++ != *ip++) break;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if we have copied something, adjust the copy count */
|
||||||
|
if(copy)
|
||||||
|
/* copy is biased, '0' means 1 byte copy */
|
||||||
|
*(op-copy-1) = copy-1;
|
||||||
|
else
|
||||||
|
/* back, to overwrite the copy count */
|
||||||
|
op--;
|
||||||
|
|
||||||
|
/* reset literal counter */
|
||||||
|
copy = 0;
|
||||||
|
|
||||||
|
/* length is biased, '1' means a match of 3 bytes */
|
||||||
|
ip -= 3;
|
||||||
|
len = ip - anchor;
|
||||||
|
|
||||||
|
/* encode the match */
|
||||||
|
#if FASTLZ_LEVEL==2
|
||||||
|
if(distance < MAX_DISTANCE)
|
||||||
|
{
|
||||||
|
if(len < 7)
|
||||||
|
{
|
||||||
|
*op++ = (len << 5) + (distance >> 8);
|
||||||
|
*op++ = (distance & 255);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*op++ = (7 << 5) + (distance >> 8);
|
||||||
|
for(len-=7; len >= 255; len-= 255)
|
||||||
|
*op++ = 255;
|
||||||
|
*op++ = len;
|
||||||
|
*op++ = (distance & 255);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* far away, but not yet in the another galaxy... */
|
||||||
|
if(len < 7)
|
||||||
|
{
|
||||||
|
distance -= MAX_DISTANCE;
|
||||||
|
*op++ = (len << 5) + 31;
|
||||||
|
*op++ = 255;
|
||||||
|
*op++ = distance >> 8;
|
||||||
|
*op++ = distance & 255;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
distance -= MAX_DISTANCE;
|
||||||
|
*op++ = (7 << 5) + 31;
|
||||||
|
for(len-=7; len >= 255; len-= 255)
|
||||||
|
*op++ = 255;
|
||||||
|
*op++ = len;
|
||||||
|
*op++ = 255;
|
||||||
|
*op++ = distance >> 8;
|
||||||
|
*op++ = distance & 255;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
|
||||||
|
if(FASTLZ_UNEXPECT_CONDITIONAL(len > MAX_LEN-2))
|
||||||
|
while(len > MAX_LEN-2)
|
||||||
|
{
|
||||||
|
*op++ = (7 << 5) + (distance >> 8);
|
||||||
|
*op++ = MAX_LEN - 2 - 7 -2;
|
||||||
|
*op++ = (distance & 255);
|
||||||
|
len -= MAX_LEN-2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(len < 7)
|
||||||
|
{
|
||||||
|
*op++ = (len << 5) + (distance >> 8);
|
||||||
|
*op++ = (distance & 255);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*op++ = (7 << 5) + (distance >> 8);
|
||||||
|
*op++ = len - 7;
|
||||||
|
*op++ = (distance & 255);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* update the hash at match boundary */
|
||||||
|
HASH_FUNCTION(hval,ip);
|
||||||
|
htab[hval] = ip++;
|
||||||
|
HASH_FUNCTION(hval,ip);
|
||||||
|
htab[hval] = ip++;
|
||||||
|
|
||||||
|
/* assuming literal copy */
|
||||||
|
*op++ = MAX_COPY-1;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
|
||||||
|
literal:
|
||||||
|
*op++ = *anchor++;
|
||||||
|
ip = anchor;
|
||||||
|
copy++;
|
||||||
|
if(FASTLZ_UNEXPECT_CONDITIONAL(copy == MAX_COPY))
|
||||||
|
{
|
||||||
|
copy = 0;
|
||||||
|
*op++ = MAX_COPY-1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* left-over as literal copy */
|
||||||
|
ip_bound++;
|
||||||
|
while(ip <= ip_bound)
|
||||||
|
{
|
||||||
|
*op++ = *ip++;
|
||||||
|
copy++;
|
||||||
|
if(copy == MAX_COPY)
|
||||||
|
{
|
||||||
|
copy = 0;
|
||||||
|
*op++ = MAX_COPY-1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if we have copied something, adjust the copy length */
|
||||||
|
if(copy)
|
||||||
|
*(op-copy-1) = copy-1;
|
||||||
|
else
|
||||||
|
op--;
|
||||||
|
|
||||||
|
#if FASTLZ_LEVEL==2
|
||||||
|
/* marker for fastlz2 */
|
||||||
|
*(flzuint8*)output |= (1 << 5);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return op - (flzuint8*)output;
|
||||||
|
}
|
||||||
|
|
||||||
|
static FASTLZ_INLINE int FASTLZ_DECOMPRESSOR(const void* input, int length, void* output, int maxout)
|
||||||
|
{
|
||||||
|
const flzuint8* ip = (const flzuint8*) input;
|
||||||
|
const flzuint8* ip_limit = ip + length;
|
||||||
|
flzuint8* op = (flzuint8*) output;
|
||||||
|
#ifdef FASTLZ_SAFE
|
||||||
|
flzuint8* op_limit = op + maxout;
|
||||||
|
#endif
|
||||||
|
flzuint32 ctrl = (*ip++) & 31;
|
||||||
|
int loop = 1;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
const flzuint8* ref = op;
|
||||||
|
flzuint32 len = ctrl >> 5;
|
||||||
|
flzuint32 ofs = (ctrl & 31) << 8;
|
||||||
|
|
||||||
|
if(ctrl >= 32)
|
||||||
|
{
|
||||||
|
#if FASTLZ_LEVEL==2
|
||||||
|
flzuint8 code;
|
||||||
|
#endif
|
||||||
|
len--;
|
||||||
|
ref -= ofs;
|
||||||
|
if (len == 7-1)
|
||||||
|
#if FASTLZ_LEVEL==1
|
||||||
|
len += *ip++;
|
||||||
|
ref -= *ip++;
|
||||||
|
#else
|
||||||
|
do
|
||||||
|
{
|
||||||
|
code = *ip++;
|
||||||
|
len += code;
|
||||||
|
} while (code==255);
|
||||||
|
code = *ip++;
|
||||||
|
ref -= code;
|
||||||
|
|
||||||
|
/* match from 16-bit distance */
|
||||||
|
if(FASTLZ_UNEXPECT_CONDITIONAL(code==255))
|
||||||
|
if(FASTLZ_EXPECT_CONDITIONAL(ofs==(31 << 8)))
|
||||||
|
{
|
||||||
|
ofs = (*ip++) << 8;
|
||||||
|
ofs += *ip++;
|
||||||
|
ref = op - ofs - MAX_DISTANCE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef FASTLZ_SAFE
|
||||||
|
if (FASTLZ_UNEXPECT_CONDITIONAL(op + len + 3 > op_limit))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (FASTLZ_UNEXPECT_CONDITIONAL(ref-1 < (flzuint8 *)output))
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if(FASTLZ_EXPECT_CONDITIONAL(ip < ip_limit))
|
||||||
|
ctrl = *ip++;
|
||||||
|
else
|
||||||
|
loop = 0;
|
||||||
|
|
||||||
|
if(ref == op)
|
||||||
|
{
|
||||||
|
/* optimize copy for a run */
|
||||||
|
flzuint8 b = ref[-1];
|
||||||
|
*op++ = b;
|
||||||
|
*op++ = b;
|
||||||
|
*op++ = b;
|
||||||
|
for(; len; --len)
|
||||||
|
*op++ = b;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if !defined(FASTLZ_STRICT_ALIGN)
|
||||||
|
const flzuint16* p;
|
||||||
|
flzuint16* q;
|
||||||
|
#endif
|
||||||
|
/* copy from reference */
|
||||||
|
ref--;
|
||||||
|
*op++ = *ref++;
|
||||||
|
*op++ = *ref++;
|
||||||
|
*op++ = *ref++;
|
||||||
|
|
||||||
|
#if !defined(FASTLZ_STRICT_ALIGN)
|
||||||
|
/* copy a byte, so that now it's word aligned */
|
||||||
|
if(len & 1)
|
||||||
|
{
|
||||||
|
*op++ = *ref++;
|
||||||
|
len--;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* copy 16-bit at once */
|
||||||
|
q = (flzuint16*) op;
|
||||||
|
op += len;
|
||||||
|
p = (const flzuint16*) ref;
|
||||||
|
for(len>>=1; len > 4; len-=4)
|
||||||
|
{
|
||||||
|
*q++ = *p++;
|
||||||
|
*q++ = *p++;
|
||||||
|
*q++ = *p++;
|
||||||
|
*q++ = *p++;
|
||||||
|
}
|
||||||
|
for(; len; --len)
|
||||||
|
*q++ = *p++;
|
||||||
|
#else
|
||||||
|
for(; len; --len)
|
||||||
|
*op++ = *ref++;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ctrl++;
|
||||||
|
#ifdef FASTLZ_SAFE
|
||||||
|
if (FASTLZ_UNEXPECT_CONDITIONAL(op + ctrl > op_limit))
|
||||||
|
return 0;
|
||||||
|
if (FASTLZ_UNEXPECT_CONDITIONAL(ip + ctrl > ip_limit))
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
*op++ = *ip++;
|
||||||
|
for(--ctrl; ctrl; ctrl--)
|
||||||
|
*op++ = *ip++;
|
||||||
|
|
||||||
|
loop = FASTLZ_EXPECT_CONDITIONAL(ip < ip_limit);
|
||||||
|
if(loop)
|
||||||
|
ctrl = *ip++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while(FASTLZ_EXPECT_CONDITIONAL(loop));
|
||||||
|
|
||||||
|
return op - (flzuint8*)output;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !defined(FASTLZ_COMPRESSOR) && !defined(FASTLZ_DECOMPRESSOR) */
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
FastLZ - lightning-fast lossless compression library
|
||||||
|
|
||||||
|
Copyright (C) 2007 Ariya Hidayat (ariya@kde.org)
|
||||||
|
Copyright (C) 2006 Ariya Hidayat (ariya@kde.org)
|
||||||
|
Copyright (C) 2005 Ariya Hidayat (ariya@kde.org)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FASTLZ_H
|
||||||
|
#define FASTLZ_H
|
||||||
|
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
#define flzuint8 uint8_t
|
||||||
|
#define flzuint16 uint16_t
|
||||||
|
#define flzuint32 uint32_t
|
||||||
|
|
||||||
|
|
||||||
|
#define FASTLZ_VERSION 0x000100
|
||||||
|
|
||||||
|
#define FASTLZ_VERSION_MAJOR 0
|
||||||
|
#define FASTLZ_VERSION_MINOR 0
|
||||||
|
#define FASTLZ_VERSION_REVISION 0
|
||||||
|
|
||||||
|
#define FASTLZ_VERSION_STRING "0.1.0"
|
||||||
|
|
||||||
|
#if defined (__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
Compress a block of data in the input buffer and returns the size of
|
||||||
|
compressed block. The size of input buffer is specified by length. The
|
||||||
|
minimum input buffer size is 16.
|
||||||
|
|
||||||
|
The output buffer must be at least 5% larger than the input buffer
|
||||||
|
and can not be smaller than 66 bytes.
|
||||||
|
|
||||||
|
If the input is not compressible, the return value might be larger than
|
||||||
|
length (input buffer size).
|
||||||
|
|
||||||
|
The input buffer and the output buffer can not overlap.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int fastlz_compress(const void* input, int length, void* output);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Decompress a block of compressed data and returns the size of the
|
||||||
|
decompressed block. If error occurs, e.g. the compressed data is
|
||||||
|
corrupted or the output buffer is not large enough, then 0 (zero)
|
||||||
|
will be returned instead.
|
||||||
|
|
||||||
|
The input buffer and the output buffer can not overlap.
|
||||||
|
|
||||||
|
Decompression is memory safe and guaranteed not to write the output buffer
|
||||||
|
more than what is specified in maxout.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int fastlz_decompress(const void* input, int length, void* output, int maxout);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Compress a block of data in the input buffer and returns the size of
|
||||||
|
compressed block. The size of input buffer is specified by length. The
|
||||||
|
minimum input buffer size is 16.
|
||||||
|
|
||||||
|
The output buffer must be at least 5% larger than the input buffer
|
||||||
|
and can not be smaller than 66 bytes.
|
||||||
|
|
||||||
|
If the input is not compressible, the return value might be larger than
|
||||||
|
length (input buffer size).
|
||||||
|
|
||||||
|
The input buffer and the output buffer can not overlap.
|
||||||
|
|
||||||
|
Compression level can be specified in parameter level. At the moment,
|
||||||
|
only level 1 and level 2 are supported.
|
||||||
|
Level 1 is the fastest compression and generally useful for short data.
|
||||||
|
Level 2 is slightly slower but it gives better compression ratio.
|
||||||
|
|
||||||
|
Note that the compressed data, regardless of the level, can always be
|
||||||
|
decompressed using the function fastlz_decompress above.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int fastlz_compress_level(int level, const void* input, int length, void* output);
|
||||||
|
|
||||||
|
#if defined (__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* FASTLZ_H */
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
/* This file specifically for FST usage */
|
||||||
|
/* config.h. Generated from config.h.in by configure. */
|
||||||
|
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||||
|
|
||||||
|
/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix). */
|
||||||
|
#if !defined(__MINGW32__)
|
||||||
|
# define HAVE_ALLOCA_H 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
|
||||||
|
#define HAVE_FSEEKO 1
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,452 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2009-2018 Tony Bybell.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
* copy of this software and associated documentation files (the "Software"),
|
||||||
|
* to deal in the Software without restriction, including without limitation
|
||||||
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
* and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
* Software is furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
* DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FST_API_H
|
||||||
|
#define FST_API_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <zlib.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#define FST_RDLOAD "FSTLOAD | "
|
||||||
|
|
||||||
|
typedef uint32_t fstHandle;
|
||||||
|
typedef uint32_t fstEnumHandle;
|
||||||
|
|
||||||
|
enum fstWriterPackType {
|
||||||
|
FST_WR_PT_ZLIB = 0,
|
||||||
|
FST_WR_PT_FASTLZ = 1,
|
||||||
|
FST_WR_PT_LZ4 = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
enum fstFileType {
|
||||||
|
FST_FT_MIN = 0,
|
||||||
|
|
||||||
|
FST_FT_VERILOG = 0,
|
||||||
|
FST_FT_VHDL = 1,
|
||||||
|
FST_FT_VERILOG_VHDL = 2,
|
||||||
|
|
||||||
|
FST_FT_MAX = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
enum fstBlockType {
|
||||||
|
FST_BL_HDR = 0,
|
||||||
|
FST_BL_VCDATA = 1,
|
||||||
|
FST_BL_BLACKOUT = 2,
|
||||||
|
FST_BL_GEOM = 3,
|
||||||
|
FST_BL_HIER = 4,
|
||||||
|
FST_BL_VCDATA_DYN_ALIAS = 5,
|
||||||
|
FST_BL_HIER_LZ4 = 6,
|
||||||
|
FST_BL_HIER_LZ4DUO = 7,
|
||||||
|
FST_BL_VCDATA_DYN_ALIAS2 = 8,
|
||||||
|
|
||||||
|
FST_BL_ZWRAPPER = 254, /* indicates that whole trace is gz wrapped */
|
||||||
|
FST_BL_SKIP = 255 /* used while block is being written */
|
||||||
|
};
|
||||||
|
|
||||||
|
enum fstScopeType {
|
||||||
|
FST_ST_MIN = 0,
|
||||||
|
|
||||||
|
FST_ST_VCD_MODULE = 0,
|
||||||
|
FST_ST_VCD_TASK = 1,
|
||||||
|
FST_ST_VCD_FUNCTION = 2,
|
||||||
|
FST_ST_VCD_BEGIN = 3,
|
||||||
|
FST_ST_VCD_FORK = 4,
|
||||||
|
FST_ST_VCD_GENERATE = 5,
|
||||||
|
FST_ST_VCD_STRUCT = 6,
|
||||||
|
FST_ST_VCD_UNION = 7,
|
||||||
|
FST_ST_VCD_CLASS = 8,
|
||||||
|
FST_ST_VCD_INTERFACE = 9,
|
||||||
|
FST_ST_VCD_PACKAGE = 10,
|
||||||
|
FST_ST_VCD_PROGRAM = 11,
|
||||||
|
|
||||||
|
FST_ST_VHDL_ARCHITECTURE = 12,
|
||||||
|
FST_ST_VHDL_PROCEDURE = 13,
|
||||||
|
FST_ST_VHDL_FUNCTION = 14,
|
||||||
|
FST_ST_VHDL_RECORD = 15,
|
||||||
|
FST_ST_VHDL_PROCESS = 16,
|
||||||
|
FST_ST_VHDL_BLOCK = 17,
|
||||||
|
FST_ST_VHDL_FOR_GENERATE = 18,
|
||||||
|
FST_ST_VHDL_IF_GENERATE = 19,
|
||||||
|
FST_ST_VHDL_GENERATE = 20,
|
||||||
|
FST_ST_VHDL_PACKAGE = 21,
|
||||||
|
|
||||||
|
FST_ST_MAX = 21,
|
||||||
|
|
||||||
|
FST_ST_GEN_ATTRBEGIN = 252,
|
||||||
|
FST_ST_GEN_ATTREND = 253,
|
||||||
|
|
||||||
|
FST_ST_VCD_SCOPE = 254,
|
||||||
|
FST_ST_VCD_UPSCOPE = 255
|
||||||
|
};
|
||||||
|
|
||||||
|
enum fstVarType {
|
||||||
|
FST_VT_MIN = 0, /* start of vartypes */
|
||||||
|
|
||||||
|
FST_VT_VCD_EVENT = 0,
|
||||||
|
FST_VT_VCD_INTEGER = 1,
|
||||||
|
FST_VT_VCD_PARAMETER = 2,
|
||||||
|
FST_VT_VCD_REAL = 3,
|
||||||
|
FST_VT_VCD_REAL_PARAMETER = 4,
|
||||||
|
FST_VT_VCD_REG = 5,
|
||||||
|
FST_VT_VCD_SUPPLY0 = 6,
|
||||||
|
FST_VT_VCD_SUPPLY1 = 7,
|
||||||
|
FST_VT_VCD_TIME = 8,
|
||||||
|
FST_VT_VCD_TRI = 9,
|
||||||
|
FST_VT_VCD_TRIAND = 10,
|
||||||
|
FST_VT_VCD_TRIOR = 11,
|
||||||
|
FST_VT_VCD_TRIREG = 12,
|
||||||
|
FST_VT_VCD_TRI0 = 13,
|
||||||
|
FST_VT_VCD_TRI1 = 14,
|
||||||
|
FST_VT_VCD_WAND = 15,
|
||||||
|
FST_VT_VCD_WIRE = 16,
|
||||||
|
FST_VT_VCD_WOR = 17,
|
||||||
|
FST_VT_VCD_PORT = 18,
|
||||||
|
FST_VT_VCD_SPARRAY = 19, /* used to define the rownum (index) port for a sparse array */
|
||||||
|
FST_VT_VCD_REALTIME = 20,
|
||||||
|
|
||||||
|
FST_VT_GEN_STRING = 21, /* generic string type (max len is defined dynamically via fstWriterEmitVariableLengthValueChange) */
|
||||||
|
|
||||||
|
FST_VT_SV_BIT = 22,
|
||||||
|
FST_VT_SV_LOGIC = 23,
|
||||||
|
FST_VT_SV_INT = 24, /* declare as size = 32 */
|
||||||
|
FST_VT_SV_SHORTINT = 25, /* declare as size = 16 */
|
||||||
|
FST_VT_SV_LONGINT = 26, /* declare as size = 64 */
|
||||||
|
FST_VT_SV_BYTE = 27, /* declare as size = 8 */
|
||||||
|
FST_VT_SV_ENUM = 28, /* declare as appropriate type range */
|
||||||
|
FST_VT_SV_SHORTREAL = 29, /* declare and emit same as FST_VT_VCD_REAL (needs to be emitted as double, not a float) */
|
||||||
|
|
||||||
|
FST_VT_MAX = 29 /* end of vartypes */
|
||||||
|
};
|
||||||
|
|
||||||
|
enum fstVarDir {
|
||||||
|
FST_VD_MIN = 0,
|
||||||
|
|
||||||
|
FST_VD_IMPLICIT = 0,
|
||||||
|
FST_VD_INPUT = 1,
|
||||||
|
FST_VD_OUTPUT = 2,
|
||||||
|
FST_VD_INOUT = 3,
|
||||||
|
FST_VD_BUFFER = 4,
|
||||||
|
FST_VD_LINKAGE = 5,
|
||||||
|
|
||||||
|
FST_VD_MAX = 5
|
||||||
|
};
|
||||||
|
|
||||||
|
enum fstHierType {
|
||||||
|
FST_HT_MIN = 0,
|
||||||
|
|
||||||
|
FST_HT_SCOPE = 0,
|
||||||
|
FST_HT_UPSCOPE = 1,
|
||||||
|
FST_HT_VAR = 2,
|
||||||
|
FST_HT_ATTRBEGIN = 3,
|
||||||
|
FST_HT_ATTREND = 4,
|
||||||
|
|
||||||
|
/* FST_HT_TREEBEGIN and FST_HT_TREEEND are not yet used by FST but are currently used when fstHier bridges other formats */
|
||||||
|
FST_HT_TREEBEGIN = 5,
|
||||||
|
FST_HT_TREEEND = 6,
|
||||||
|
|
||||||
|
FST_HT_MAX = 6
|
||||||
|
};
|
||||||
|
|
||||||
|
enum fstAttrType {
|
||||||
|
FST_AT_MIN = 0,
|
||||||
|
|
||||||
|
FST_AT_MISC = 0, /* self-contained: does not need matching FST_HT_ATTREND */
|
||||||
|
FST_AT_ARRAY = 1,
|
||||||
|
FST_AT_ENUM = 2,
|
||||||
|
FST_AT_PACK = 3,
|
||||||
|
|
||||||
|
FST_AT_MAX = 3
|
||||||
|
};
|
||||||
|
|
||||||
|
enum fstMiscType {
|
||||||
|
FST_MT_MIN = 0,
|
||||||
|
|
||||||
|
FST_MT_COMMENT = 0, /* use fstWriterSetComment() to emit */
|
||||||
|
FST_MT_ENVVAR = 1, /* use fstWriterSetEnvVar() to emit */
|
||||||
|
FST_MT_SUPVAR = 2, /* use fstWriterCreateVar2() to emit */
|
||||||
|
FST_MT_PATHNAME = 3, /* reserved for fstWriterSetSourceStem() string -> number management */
|
||||||
|
FST_MT_SOURCESTEM = 4, /* use fstWriterSetSourceStem() to emit */
|
||||||
|
FST_MT_SOURCEISTEM = 5, /* use fstWriterSetSourceInstantiationStem() to emit */
|
||||||
|
FST_MT_VALUELIST = 6, /* use fstWriterSetValueList() to emit, followed by fstWriterCreateVar*() */
|
||||||
|
FST_MT_ENUMTABLE = 7, /* use fstWriterCreateEnumTable() and fstWriterEmitEnumTableRef() to emit */
|
||||||
|
FST_MT_UNKNOWN = 8,
|
||||||
|
|
||||||
|
FST_MT_MAX = 8
|
||||||
|
};
|
||||||
|
|
||||||
|
enum fstArrayType {
|
||||||
|
FST_AR_MIN = 0,
|
||||||
|
|
||||||
|
FST_AR_NONE = 0,
|
||||||
|
FST_AR_UNPACKED = 1,
|
||||||
|
FST_AR_PACKED = 2,
|
||||||
|
FST_AR_SPARSE = 3,
|
||||||
|
|
||||||
|
FST_AR_MAX = 3
|
||||||
|
};
|
||||||
|
|
||||||
|
enum fstEnumValueType {
|
||||||
|
FST_EV_SV_INTEGER = 0,
|
||||||
|
FST_EV_SV_BIT = 1,
|
||||||
|
FST_EV_SV_LOGIC = 2,
|
||||||
|
FST_EV_SV_INT = 3,
|
||||||
|
FST_EV_SV_SHORTINT = 4,
|
||||||
|
FST_EV_SV_LONGINT = 5,
|
||||||
|
FST_EV_SV_BYTE = 6,
|
||||||
|
FST_EV_SV_UNSIGNED_INTEGER = 7,
|
||||||
|
FST_EV_SV_UNSIGNED_BIT = 8,
|
||||||
|
FST_EV_SV_UNSIGNED_LOGIC = 9,
|
||||||
|
FST_EV_SV_UNSIGNED_INT = 10,
|
||||||
|
FST_EV_SV_UNSIGNED_SHORTINT = 11,
|
||||||
|
FST_EV_SV_UNSIGNED_LONGINT = 12,
|
||||||
|
FST_EV_SV_UNSIGNED_BYTE = 13,
|
||||||
|
|
||||||
|
FST_EV_REG = 14,
|
||||||
|
FST_EV_TIME = 15,
|
||||||
|
|
||||||
|
FST_EV_MAX = 15
|
||||||
|
};
|
||||||
|
|
||||||
|
enum fstPackType {
|
||||||
|
FST_PT_NONE = 0,
|
||||||
|
FST_PT_UNPACKED = 1,
|
||||||
|
FST_PT_PACKED = 2,
|
||||||
|
FST_PT_TAGGED_PACKED = 3,
|
||||||
|
|
||||||
|
FST_PT_MAX = 3
|
||||||
|
};
|
||||||
|
|
||||||
|
enum fstSupplementalVarType {
|
||||||
|
FST_SVT_MIN = 0,
|
||||||
|
|
||||||
|
FST_SVT_NONE = 0,
|
||||||
|
|
||||||
|
FST_SVT_VHDL_SIGNAL = 1,
|
||||||
|
FST_SVT_VHDL_VARIABLE = 2,
|
||||||
|
FST_SVT_VHDL_CONSTANT = 3,
|
||||||
|
FST_SVT_VHDL_FILE = 4,
|
||||||
|
FST_SVT_VHDL_MEMORY = 5,
|
||||||
|
|
||||||
|
FST_SVT_MAX = 5
|
||||||
|
};
|
||||||
|
|
||||||
|
enum fstSupplementalDataType {
|
||||||
|
FST_SDT_MIN = 0,
|
||||||
|
|
||||||
|
FST_SDT_NONE = 0,
|
||||||
|
|
||||||
|
FST_SDT_VHDL_BOOLEAN = 1,
|
||||||
|
FST_SDT_VHDL_BIT = 2,
|
||||||
|
FST_SDT_VHDL_BIT_VECTOR = 3,
|
||||||
|
FST_SDT_VHDL_STD_ULOGIC = 4,
|
||||||
|
FST_SDT_VHDL_STD_ULOGIC_VECTOR = 5,
|
||||||
|
FST_SDT_VHDL_STD_LOGIC = 6,
|
||||||
|
FST_SDT_VHDL_STD_LOGIC_VECTOR = 7,
|
||||||
|
FST_SDT_VHDL_UNSIGNED = 8,
|
||||||
|
FST_SDT_VHDL_SIGNED = 9,
|
||||||
|
FST_SDT_VHDL_INTEGER = 10,
|
||||||
|
FST_SDT_VHDL_REAL = 11,
|
||||||
|
FST_SDT_VHDL_NATURAL = 12,
|
||||||
|
FST_SDT_VHDL_POSITIVE = 13,
|
||||||
|
FST_SDT_VHDL_TIME = 14,
|
||||||
|
FST_SDT_VHDL_CHARACTER = 15,
|
||||||
|
FST_SDT_VHDL_STRING = 16,
|
||||||
|
|
||||||
|
FST_SDT_MAX = 16,
|
||||||
|
|
||||||
|
FST_SDT_SVT_SHIFT_COUNT = 10, /* FST_SVT_* is ORed in by fstWriterCreateVar2() to the left after shifting FST_SDT_SVT_SHIFT_COUNT */
|
||||||
|
FST_SDT_ABS_MAX = ((1<<(FST_SDT_SVT_SHIFT_COUNT))-1)
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct fstHier
|
||||||
|
{
|
||||||
|
unsigned char htyp;
|
||||||
|
|
||||||
|
union {
|
||||||
|
/* if htyp == FST_HT_SCOPE */
|
||||||
|
struct fstHierScope {
|
||||||
|
unsigned char typ; /* FST_ST_MIN ... FST_ST_MAX */
|
||||||
|
const char *name;
|
||||||
|
const char *component;
|
||||||
|
uint32_t name_length; /* strlen(u.scope.name) */
|
||||||
|
uint32_t component_length; /* strlen(u.scope.component) */
|
||||||
|
} scope;
|
||||||
|
|
||||||
|
/* if htyp == FST_HT_VAR */
|
||||||
|
struct fstHierVar {
|
||||||
|
unsigned char typ; /* FST_VT_MIN ... FST_VT_MAX */
|
||||||
|
unsigned char direction; /* FST_VD_MIN ... FST_VD_MAX */
|
||||||
|
unsigned char svt_workspace; /* zeroed out by FST reader, for client code use */
|
||||||
|
unsigned char sdt_workspace; /* zeroed out by FST reader, for client code use */
|
||||||
|
unsigned int sxt_workspace; /* zeroed out by FST reader, for client code use */
|
||||||
|
const char *name;
|
||||||
|
uint32_t length;
|
||||||
|
fstHandle handle;
|
||||||
|
uint32_t name_length; /* strlen(u.var.name) */
|
||||||
|
unsigned is_alias : 1;
|
||||||
|
} var;
|
||||||
|
|
||||||
|
/* if htyp == FST_HT_ATTRBEGIN */
|
||||||
|
struct fstHierAttr {
|
||||||
|
unsigned char typ; /* FST_AT_MIN ... FST_AT_MAX */
|
||||||
|
unsigned char subtype; /* from fstMiscType, fstArrayType, fstEnumValueType, fstPackType */
|
||||||
|
const char *name;
|
||||||
|
uint64_t arg; /* number of array elements, struct members, or some other payload (possibly ignored) */
|
||||||
|
uint64_t arg_from_name; /* for when name is overloaded as a variable-length integer (FST_AT_MISC + FST_MT_SOURCESTEM) */
|
||||||
|
uint32_t name_length; /* strlen(u.attr.name) */
|
||||||
|
} attr;
|
||||||
|
} u;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct fstETab
|
||||||
|
{
|
||||||
|
char *name;
|
||||||
|
uint32_t elem_count;
|
||||||
|
char **literal_arr;
|
||||||
|
char **val_arr;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* writer functions
|
||||||
|
*/
|
||||||
|
void fstWriterClose(void *ctx);
|
||||||
|
void * fstWriterCreate(const char *nam, int use_compressed_hier);
|
||||||
|
fstEnumHandle fstWriterCreateEnumTable(void *ctx, const char *name, uint32_t elem_count, unsigned int min_valbits, const char **literal_arr, const char **val_arr);
|
||||||
|
/* used for Verilog/SV */
|
||||||
|
fstHandle fstWriterCreateVar(void *ctx, enum fstVarType vt, enum fstVarDir vd,
|
||||||
|
uint32_t len, const char *nam, fstHandle aliasHandle);
|
||||||
|
/* future expansion for VHDL and other languages. The variable type, data type, etc map onto
|
||||||
|
the current Verilog/SV one. The "type" string is optional for a more verbose or custom description */
|
||||||
|
fstHandle fstWriterCreateVar2(void *ctx, enum fstVarType vt, enum fstVarDir vd,
|
||||||
|
uint32_t len, const char *nam, fstHandle aliasHandle,
|
||||||
|
const char *type, enum fstSupplementalVarType svt, enum fstSupplementalDataType sdt);
|
||||||
|
void fstWriterEmitDumpActive(void *ctx, int enable);
|
||||||
|
void fstWriterEmitEnumTableRef(void *ctx, fstEnumHandle handle);
|
||||||
|
void fstWriterEmitValueChange(void *ctx, fstHandle handle, const void *val);
|
||||||
|
void fstWriterEmitVariableLengthValueChange(void *ctx, fstHandle handle, const void *val, uint32_t len);
|
||||||
|
void fstWriterEmitTimeChange(void *ctx, uint64_t tim);
|
||||||
|
void fstWriterFlushContext(void *ctx);
|
||||||
|
int fstWriterGetDumpSizeLimitReached(void *ctx);
|
||||||
|
int fstWriterGetFseekFailed(void *ctx);
|
||||||
|
void fstWriterSetAttrBegin(void *ctx, enum fstAttrType attrtype, int subtype,
|
||||||
|
const char *attrname, uint64_t arg);
|
||||||
|
void fstWriterSetAttrEnd(void *ctx);
|
||||||
|
void fstWriterSetComment(void *ctx, const char *comm);
|
||||||
|
void fstWriterSetDate(void *ctx, const char *dat);
|
||||||
|
void fstWriterSetDumpSizeLimit(void *ctx, uint64_t numbytes);
|
||||||
|
void fstWriterSetEnvVar(void *ctx, const char *envvar);
|
||||||
|
void fstWriterSetFileType(void *ctx, enum fstFileType filetype);
|
||||||
|
void fstWriterSetPackType(void *ctx, enum fstWriterPackType typ);
|
||||||
|
void fstWriterSetParallelMode(void *ctx, int enable);
|
||||||
|
void fstWriterSetRepackOnClose(void *ctx, int enable); /* type = 0 (none), 1 (libz) */
|
||||||
|
void fstWriterSetScope(void *ctx, enum fstScopeType scopetype,
|
||||||
|
const char *scopename, const char *scopecomp);
|
||||||
|
void fstWriterSetSourceInstantiationStem(void *ctx, const char *path, unsigned int line, unsigned int use_realpath);
|
||||||
|
void fstWriterSetSourceStem(void *ctx, const char *path, unsigned int line, unsigned int use_realpath);
|
||||||
|
void fstWriterSetTimescale(void *ctx, int ts);
|
||||||
|
void fstWriterSetTimescaleFromString(void *ctx, const char *s);
|
||||||
|
void fstWriterSetTimezero(void *ctx, int64_t tim);
|
||||||
|
void fstWriterSetUpscope(void *ctx);
|
||||||
|
void fstWriterSetValueList(void *ctx, const char *vl);
|
||||||
|
void fstWriterSetVersion(void *ctx, const char *vers);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* reader functions
|
||||||
|
*/
|
||||||
|
void fstReaderClose(void *ctx);
|
||||||
|
void fstReaderClrFacProcessMask(void *ctx, fstHandle facidx);
|
||||||
|
void fstReaderClrFacProcessMaskAll(void *ctx);
|
||||||
|
uint64_t fstReaderGetAliasCount(void *ctx);
|
||||||
|
const char * fstReaderGetCurrentFlatScope(void *ctx);
|
||||||
|
void * fstReaderGetCurrentScopeUserInfo(void *ctx);
|
||||||
|
int fstReaderGetCurrentScopeLen(void *ctx);
|
||||||
|
const char * fstReaderGetDateString(void *ctx);
|
||||||
|
int fstReaderGetDoubleEndianMatchState(void *ctx);
|
||||||
|
uint64_t fstReaderGetDumpActivityChangeTime(void *ctx, uint32_t idx);
|
||||||
|
unsigned char fstReaderGetDumpActivityChangeValue(void *ctx, uint32_t idx);
|
||||||
|
uint64_t fstReaderGetEndTime(void *ctx);
|
||||||
|
int fstReaderGetFacProcessMask(void *ctx, fstHandle facidx);
|
||||||
|
int fstReaderGetFileType(void *ctx);
|
||||||
|
int fstReaderGetFseekFailed(void *ctx);
|
||||||
|
fstHandle fstReaderGetMaxHandle(void *ctx);
|
||||||
|
uint64_t fstReaderGetMemoryUsedByWriter(void *ctx);
|
||||||
|
uint32_t fstReaderGetNumberDumpActivityChanges(void *ctx);
|
||||||
|
uint64_t fstReaderGetScopeCount(void *ctx);
|
||||||
|
uint64_t fstReaderGetStartTime(void *ctx);
|
||||||
|
signed char fstReaderGetTimescale(void *ctx);
|
||||||
|
int64_t fstReaderGetTimezero(void *ctx);
|
||||||
|
uint64_t fstReaderGetValueChangeSectionCount(void *ctx);
|
||||||
|
char * fstReaderGetValueFromHandleAtTime(void *ctx, uint64_t tim, fstHandle facidx, char *buf);
|
||||||
|
uint64_t fstReaderGetVarCount(void *ctx);
|
||||||
|
const char * fstReaderGetVersionString(void *ctx);
|
||||||
|
struct fstHier *fstReaderIterateHier(void *ctx);
|
||||||
|
int fstReaderIterateHierRewind(void *ctx);
|
||||||
|
int fstReaderIterBlocks(void *ctx,
|
||||||
|
void (*value_change_callback)(void *user_callback_data_pointer, uint64_t time, fstHandle facidx, const unsigned char *value),
|
||||||
|
void *user_callback_data_pointer, FILE *vcdhandle);
|
||||||
|
int fstReaderIterBlocks2(void *ctx,
|
||||||
|
void (*value_change_callback)(void *user_callback_data_pointer, uint64_t time, fstHandle facidx, const unsigned char *value),
|
||||||
|
void (*value_change_callback_varlen)(void *user_callback_data_pointer, uint64_t time, fstHandle facidx, const unsigned char *value, uint32_t len),
|
||||||
|
void *user_callback_data_pointer, FILE *vcdhandle);
|
||||||
|
void fstReaderIterBlocksSetNativeDoublesOnCallback(void *ctx, int enable);
|
||||||
|
void * fstReaderOpen(const char *nam);
|
||||||
|
void * fstReaderOpenForUtilitiesOnly(void);
|
||||||
|
const char * fstReaderPopScope(void *ctx);
|
||||||
|
int fstReaderProcessHier(void *ctx, FILE *vcdhandle);
|
||||||
|
const char * fstReaderPushScope(void *ctx, const char *nam, void *user_info);
|
||||||
|
void fstReaderResetScope(void *ctx);
|
||||||
|
void fstReaderSetFacProcessMask(void *ctx, fstHandle facidx);
|
||||||
|
void fstReaderSetFacProcessMaskAll(void *ctx);
|
||||||
|
void fstReaderSetLimitTimeRange(void *ctx, uint64_t start_time, uint64_t end_time);
|
||||||
|
void fstReaderSetUnlimitedTimeRange(void *ctx);
|
||||||
|
void fstReaderSetVcdExtensions(void *ctx, int enable);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* utility functions
|
||||||
|
*/
|
||||||
|
int fstUtilityBinToEscConvertedLen(const unsigned char *s, int len); /* used for mallocs for fstUtilityBinToEsc() */
|
||||||
|
int fstUtilityBinToEsc(unsigned char *d, const unsigned char *s, int len);
|
||||||
|
int fstUtilityEscToBin(unsigned char *d, unsigned char *s, int len);
|
||||||
|
struct fstETab *fstUtilityExtractEnumTableFromString(const char *s);
|
||||||
|
void fstUtilityFreeEnumTable(struct fstETab *etab); /* must use to free fstETab properly */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,360 @@
|
|||||||
|
/*
|
||||||
|
LZ4 - Fast LZ compression algorithm
|
||||||
|
Header File
|
||||||
|
Copyright (C) 2011-2015, Yann Collet.
|
||||||
|
|
||||||
|
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the following disclaimer
|
||||||
|
in the documentation and/or other materials provided with the
|
||||||
|
distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
You can contact the author at :
|
||||||
|
- LZ4 source repository : https://github.com/Cyan4973/lz4
|
||||||
|
- LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#if defined (__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* lz4.h provides block compression functions, and gives full buffer control to programmer.
|
||||||
|
* If you need to generate inter-operable compressed data (respecting LZ4 frame specification),
|
||||||
|
* and can let the library handle its own memory, please use lz4frame.h instead.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**************************************
|
||||||
|
* Version
|
||||||
|
**************************************/
|
||||||
|
#define LZ4_VERSION_MAJOR 1 /* for breaking interface changes */
|
||||||
|
#define LZ4_VERSION_MINOR 7 /* for new (non-breaking) interface capabilities */
|
||||||
|
#define LZ4_VERSION_RELEASE 1 /* for tweaks, bug-fixes, or development */
|
||||||
|
#define LZ4_VERSION_NUMBER (LZ4_VERSION_MAJOR *100*100 + LZ4_VERSION_MINOR *100 + LZ4_VERSION_RELEASE)
|
||||||
|
int LZ4_versionNumber (void);
|
||||||
|
|
||||||
|
/**************************************
|
||||||
|
* Tuning parameter
|
||||||
|
**************************************/
|
||||||
|
/*
|
||||||
|
* LZ4_MEMORY_USAGE :
|
||||||
|
* Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; etc.)
|
||||||
|
* Increasing memory usage improves compression ratio
|
||||||
|
* Reduced memory usage can improve speed, due to cache effect
|
||||||
|
* Default value is 14, for 16KB, which nicely fits into Intel x86 L1 cache
|
||||||
|
*/
|
||||||
|
#define LZ4_MEMORY_USAGE 14
|
||||||
|
|
||||||
|
|
||||||
|
/**************************************
|
||||||
|
* Simple Functions
|
||||||
|
**************************************/
|
||||||
|
|
||||||
|
int LZ4_compress_default(const char* source, char* dest, int sourceSize, int maxDestSize);
|
||||||
|
int LZ4_decompress_safe (const char* source, char* dest, int compressedSize, int maxDecompressedSize);
|
||||||
|
|
||||||
|
/*
|
||||||
|
LZ4_compress_default() :
|
||||||
|
Compresses 'sourceSize' bytes from buffer 'source'
|
||||||
|
into already allocated 'dest' buffer of size 'maxDestSize'.
|
||||||
|
Compression is guaranteed to succeed if 'maxDestSize' >= LZ4_compressBound(sourceSize).
|
||||||
|
It also runs faster, so it's a recommended setting.
|
||||||
|
If the function cannot compress 'source' into a more limited 'dest' budget,
|
||||||
|
compression stops *immediately*, and the function result is zero.
|
||||||
|
As a consequence, 'dest' content is not valid.
|
||||||
|
This function never writes outside 'dest' buffer, nor read outside 'source' buffer.
|
||||||
|
sourceSize : Max supported value is LZ4_MAX_INPUT_VALUE
|
||||||
|
maxDestSize : full or partial size of buffer 'dest' (which must be already allocated)
|
||||||
|
return : the number of bytes written into buffer 'dest' (necessarily <= maxOutputSize)
|
||||||
|
or 0 if compression fails
|
||||||
|
|
||||||
|
LZ4_decompress_safe() :
|
||||||
|
compressedSize : is the precise full size of the compressed block.
|
||||||
|
maxDecompressedSize : is the size of destination buffer, which must be already allocated.
|
||||||
|
return : the number of bytes decompressed into destination buffer (necessarily <= maxDecompressedSize)
|
||||||
|
If destination buffer is not large enough, decoding will stop and output an error code (<0).
|
||||||
|
If the source stream is detected malformed, the function will stop decoding and return a negative result.
|
||||||
|
This function is protected against buffer overflow exploits, including malicious data packets.
|
||||||
|
It never writes outside output buffer, nor reads outside input buffer.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**************************************
|
||||||
|
* Advanced Functions
|
||||||
|
**************************************/
|
||||||
|
#define LZ4_MAX_INPUT_SIZE 0x7E000000 /* 2 113 929 216 bytes */
|
||||||
|
#define LZ4_COMPRESSBOUND(isize) ((unsigned)(isize) > (unsigned)LZ4_MAX_INPUT_SIZE ? 0 : (isize) + ((isize)/255) + 16)
|
||||||
|
|
||||||
|
/*
|
||||||
|
LZ4_compressBound() :
|
||||||
|
Provides the maximum size that LZ4 compression may output in a "worst case" scenario (input data not compressible)
|
||||||
|
This function is primarily useful for memory allocation purposes (destination buffer size).
|
||||||
|
Macro LZ4_COMPRESSBOUND() is also provided for compilation-time evaluation (stack memory allocation for example).
|
||||||
|
Note that LZ4_compress_default() compress faster when dest buffer size is >= LZ4_compressBound(srcSize)
|
||||||
|
inputSize : max supported value is LZ4_MAX_INPUT_SIZE
|
||||||
|
return : maximum output size in a "worst case" scenario
|
||||||
|
or 0, if input size is too large ( > LZ4_MAX_INPUT_SIZE)
|
||||||
|
*/
|
||||||
|
int LZ4_compressBound(int inputSize);
|
||||||
|
|
||||||
|
/*
|
||||||
|
LZ4_compress_fast() :
|
||||||
|
Same as LZ4_compress_default(), but allows to select an "acceleration" factor.
|
||||||
|
The larger the acceleration value, the faster the algorithm, but also the lesser the compression.
|
||||||
|
It's a trade-off. It can be fine tuned, with each successive value providing roughly +~3% to speed.
|
||||||
|
An acceleration value of "1" is the same as regular LZ4_compress_default()
|
||||||
|
Values <= 0 will be replaced by ACCELERATION_DEFAULT (see lz4.c), which is 1.
|
||||||
|
*/
|
||||||
|
int LZ4_compress_fast (const char* source, char* dest, int sourceSize, int maxDestSize, int acceleration);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
LZ4_compress_fast_extState() :
|
||||||
|
Same compression function, just using an externally allocated memory space to store compression state.
|
||||||
|
Use LZ4_sizeofState() to know how much memory must be allocated,
|
||||||
|
and allocate it on 8-bytes boundaries (using malloc() typically).
|
||||||
|
Then, provide it as 'void* state' to compression function.
|
||||||
|
*/
|
||||||
|
int LZ4_sizeofState(void);
|
||||||
|
int LZ4_compress_fast_extState (void* state, const char* source, char* dest, int inputSize, int maxDestSize, int acceleration);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
LZ4_compress_destSize() :
|
||||||
|
Reverse the logic, by compressing as much data as possible from 'source' buffer
|
||||||
|
into already allocated buffer 'dest' of size 'targetDestSize'.
|
||||||
|
This function either compresses the entire 'source' content into 'dest' if it's large enough,
|
||||||
|
or fill 'dest' buffer completely with as much data as possible from 'source'.
|
||||||
|
*sourceSizePtr : will be modified to indicate how many bytes where read from 'source' to fill 'dest'.
|
||||||
|
New value is necessarily <= old value.
|
||||||
|
return : Nb bytes written into 'dest' (necessarily <= targetDestSize)
|
||||||
|
or 0 if compression fails
|
||||||
|
*/
|
||||||
|
int LZ4_compress_destSize (const char* source, char* dest, int* sourceSizePtr, int targetDestSize);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
LZ4_decompress_fast() :
|
||||||
|
originalSize : is the original and therefore uncompressed size
|
||||||
|
return : the number of bytes read from the source buffer (in other words, the compressed size)
|
||||||
|
If the source stream is detected malformed, the function will stop decoding and return a negative result.
|
||||||
|
Destination buffer must be already allocated. Its size must be a minimum of 'originalSize' bytes.
|
||||||
|
note : This function fully respect memory boundaries for properly formed compressed data.
|
||||||
|
It is a bit faster than LZ4_decompress_safe().
|
||||||
|
However, it does not provide any protection against intentionally modified data stream (malicious input).
|
||||||
|
Use this function in trusted environment only (data to decode comes from a trusted source).
|
||||||
|
*/
|
||||||
|
int LZ4_decompress_fast (const char* source, char* dest, int originalSize);
|
||||||
|
|
||||||
|
/*
|
||||||
|
LZ4_decompress_safe_partial() :
|
||||||
|
This function decompress a compressed block of size 'compressedSize' at position 'source'
|
||||||
|
into destination buffer 'dest' of size 'maxDecompressedSize'.
|
||||||
|
The function tries to stop decompressing operation as soon as 'targetOutputSize' has been reached,
|
||||||
|
reducing decompression time.
|
||||||
|
return : the number of bytes decoded in the destination buffer (necessarily <= maxDecompressedSize)
|
||||||
|
Note : this number can be < 'targetOutputSize' should the compressed block to decode be smaller.
|
||||||
|
Always control how many bytes were decoded.
|
||||||
|
If the source stream is detected malformed, the function will stop decoding and return a negative result.
|
||||||
|
This function never writes outside of output buffer, and never reads outside of input buffer. It is therefore protected against malicious data packets
|
||||||
|
*/
|
||||||
|
int LZ4_decompress_safe_partial (const char* source, char* dest, int compressedSize, int targetOutputSize, int maxDecompressedSize);
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************
|
||||||
|
* Streaming Compression Functions
|
||||||
|
***********************************************/
|
||||||
|
#define LZ4_STREAMSIZE_U64 ((1 << (LZ4_MEMORY_USAGE-3)) + 4)
|
||||||
|
#define LZ4_STREAMSIZE (LZ4_STREAMSIZE_U64 * sizeof(long long))
|
||||||
|
/*
|
||||||
|
* LZ4_stream_t
|
||||||
|
* information structure to track an LZ4 stream.
|
||||||
|
* important : init this structure content before first use !
|
||||||
|
* note : only allocated directly the structure if you are statically linking LZ4
|
||||||
|
* If you are using liblz4 as a DLL, please use below construction methods instead.
|
||||||
|
*/
|
||||||
|
typedef struct { long long table[LZ4_STREAMSIZE_U64]; } LZ4_stream_t;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* LZ4_resetStream
|
||||||
|
* Use this function to init an allocated LZ4_stream_t structure
|
||||||
|
*/
|
||||||
|
void LZ4_resetStream (LZ4_stream_t* streamPtr);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* LZ4_createStream will allocate and initialize an LZ4_stream_t structure
|
||||||
|
* LZ4_freeStream releases its memory.
|
||||||
|
* In the context of a DLL (liblz4), please use these methods rather than the static struct.
|
||||||
|
* They are more future proof, in case of a change of LZ4_stream_t size.
|
||||||
|
*/
|
||||||
|
LZ4_stream_t* LZ4_createStream(void);
|
||||||
|
int LZ4_freeStream (LZ4_stream_t* streamPtr);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* LZ4_loadDict
|
||||||
|
* Use this function to load a static dictionary into LZ4_stream.
|
||||||
|
* Any previous data will be forgotten, only 'dictionary' will remain in memory.
|
||||||
|
* Loading a size of 0 is allowed.
|
||||||
|
* Return : dictionary size, in bytes (necessarily <= 64 KB)
|
||||||
|
*/
|
||||||
|
int LZ4_loadDict (LZ4_stream_t* streamPtr, const char* dictionary, int dictSize);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* LZ4_compress_fast_continue
|
||||||
|
* Compress buffer content 'src', using data from previously compressed blocks as dictionary to improve compression ratio.
|
||||||
|
* Important : Previous data blocks are assumed to still be present and unmodified !
|
||||||
|
* 'dst' buffer must be already allocated.
|
||||||
|
* If maxDstSize >= LZ4_compressBound(srcSize), compression is guaranteed to succeed, and runs faster.
|
||||||
|
* If not, and if compressed data cannot fit into 'dst' buffer size, compression stops, and function returns a zero.
|
||||||
|
*/
|
||||||
|
int LZ4_compress_fast_continue (LZ4_stream_t* streamPtr, const char* src, char* dst, int srcSize, int maxDstSize, int acceleration);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* LZ4_saveDict
|
||||||
|
* If previously compressed data block is not guaranteed to remain available at its memory location
|
||||||
|
* save it into a safer place (char* safeBuffer)
|
||||||
|
* Note : you don't need to call LZ4_loadDict() afterwards,
|
||||||
|
* dictionary is immediately usable, you can therefore call LZ4_compress_fast_continue()
|
||||||
|
* Return : saved dictionary size in bytes (necessarily <= dictSize), or 0 if error
|
||||||
|
*/
|
||||||
|
int LZ4_saveDict (LZ4_stream_t* streamPtr, char* safeBuffer, int dictSize);
|
||||||
|
|
||||||
|
|
||||||
|
/************************************************
|
||||||
|
* Streaming Decompression Functions
|
||||||
|
************************************************/
|
||||||
|
|
||||||
|
#define LZ4_STREAMDECODESIZE_U64 4
|
||||||
|
#define LZ4_STREAMDECODESIZE (LZ4_STREAMDECODESIZE_U64 * sizeof(unsigned long long))
|
||||||
|
typedef struct { unsigned long long table[LZ4_STREAMDECODESIZE_U64]; } LZ4_streamDecode_t;
|
||||||
|
/*
|
||||||
|
* LZ4_streamDecode_t
|
||||||
|
* information structure to track an LZ4 stream.
|
||||||
|
* init this structure content using LZ4_setStreamDecode or memset() before first use !
|
||||||
|
*
|
||||||
|
* In the context of a DLL (liblz4) please prefer usage of construction methods below.
|
||||||
|
* They are more future proof, in case of a change of LZ4_streamDecode_t size in the future.
|
||||||
|
* LZ4_createStreamDecode will allocate and initialize an LZ4_streamDecode_t structure
|
||||||
|
* LZ4_freeStreamDecode releases its memory.
|
||||||
|
*/
|
||||||
|
LZ4_streamDecode_t* LZ4_createStreamDecode(void);
|
||||||
|
int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* LZ4_setStreamDecode
|
||||||
|
* Use this function to instruct where to find the dictionary.
|
||||||
|
* Setting a size of 0 is allowed (same effect as reset).
|
||||||
|
* Return : 1 if OK, 0 if error
|
||||||
|
*/
|
||||||
|
int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize);
|
||||||
|
|
||||||
|
/*
|
||||||
|
*_continue() :
|
||||||
|
These decoding functions allow decompression of multiple blocks in "streaming" mode.
|
||||||
|
Previously decoded blocks *must* remain available at the memory position where they were decoded (up to 64 KB)
|
||||||
|
In the case of a ring buffers, decoding buffer must be either :
|
||||||
|
- Exactly same size as encoding buffer, with same update rule (block boundaries at same positions)
|
||||||
|
In which case, the decoding & encoding ring buffer can have any size, including very small ones ( < 64 KB).
|
||||||
|
- Larger than encoding buffer, by a minimum of maxBlockSize more bytes.
|
||||||
|
maxBlockSize is implementation dependent. It's the maximum size you intend to compress into a single block.
|
||||||
|
In which case, encoding and decoding buffers do not need to be synchronized,
|
||||||
|
and encoding ring buffer can have any size, including small ones ( < 64 KB).
|
||||||
|
- _At least_ 64 KB + 8 bytes + maxBlockSize.
|
||||||
|
In which case, encoding and decoding buffers do not need to be synchronized,
|
||||||
|
and encoding ring buffer can have any size, including larger than decoding buffer.
|
||||||
|
Whenever these conditions are not possible, save the last 64KB of decoded data into a safe buffer,
|
||||||
|
and indicate where it is saved using LZ4_setStreamDecode()
|
||||||
|
*/
|
||||||
|
int LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int compressedSize, int maxDecompressedSize);
|
||||||
|
int LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int originalSize);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Advanced decoding functions :
|
||||||
|
*_usingDict() :
|
||||||
|
These decoding functions work the same as
|
||||||
|
a combination of LZ4_setStreamDecode() followed by LZ4_decompress_x_continue()
|
||||||
|
They are stand-alone. They don't need nor update an LZ4_streamDecode_t structure.
|
||||||
|
*/
|
||||||
|
int LZ4_decompress_safe_usingDict (const char* source, char* dest, int compressedSize, int maxDecompressedSize, const char* dictStart, int dictSize);
|
||||||
|
int LZ4_decompress_fast_usingDict (const char* source, char* dest, int originalSize, const char* dictStart, int dictSize);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**************************************
|
||||||
|
* Obsolete Functions
|
||||||
|
**************************************/
|
||||||
|
/* Deprecate Warnings */
|
||||||
|
/* Should these warnings messages be a problem,
|
||||||
|
it is generally possible to disable them,
|
||||||
|
with -Wno-deprecated-declarations for gcc
|
||||||
|
or _CRT_SECURE_NO_WARNINGS in Visual for example.
|
||||||
|
You can also define LZ4_DEPRECATE_WARNING_DEFBLOCK. */
|
||||||
|
#ifndef LZ4_DEPRECATE_WARNING_DEFBLOCK
|
||||||
|
# define LZ4_DEPRECATE_WARNING_DEFBLOCK
|
||||||
|
# define LZ4_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
|
||||||
|
# if (LZ4_GCC_VERSION >= 405) || defined(__clang__)
|
||||||
|
# define LZ4_DEPRECATED(message) __attribute__((deprecated(message)))
|
||||||
|
# elif (LZ4_GCC_VERSION >= 301)
|
||||||
|
# define LZ4_DEPRECATED(message) __attribute__((deprecated))
|
||||||
|
# elif defined(_MSC_VER)
|
||||||
|
# define LZ4_DEPRECATED(message) __declspec(deprecated(message))
|
||||||
|
# else
|
||||||
|
# pragma message("WARNING: You need to implement LZ4_DEPRECATED for this compiler")
|
||||||
|
# define LZ4_DEPRECATED(message)
|
||||||
|
# endif
|
||||||
|
#endif /* LZ4_DEPRECATE_WARNING_DEFBLOCK */
|
||||||
|
|
||||||
|
/* Obsolete compression functions */
|
||||||
|
/* These functions are planned to start generate warnings by r131 approximately */
|
||||||
|
int LZ4_compress (const char* source, char* dest, int sourceSize);
|
||||||
|
int LZ4_compress_limitedOutput (const char* source, char* dest, int sourceSize, int maxOutputSize);
|
||||||
|
int LZ4_compress_withState (void* state, const char* source, char* dest, int inputSize);
|
||||||
|
int LZ4_compress_limitedOutput_withState (void* state, const char* source, char* dest, int inputSize, int maxOutputSize);
|
||||||
|
int LZ4_compress_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize);
|
||||||
|
int LZ4_compress_limitedOutput_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize, int maxOutputSize);
|
||||||
|
|
||||||
|
/* Obsolete decompression functions */
|
||||||
|
/* These function names are completely deprecated and must no longer be used.
|
||||||
|
They are only provided here for compatibility with older programs.
|
||||||
|
- LZ4_uncompress is the same as LZ4_decompress_fast
|
||||||
|
- LZ4_uncompress_unknownOutputSize is the same as LZ4_decompress_safe
|
||||||
|
These function prototypes are now disabled; uncomment them only if you really need them.
|
||||||
|
It is highly recommended to stop using these prototypes and migrate to maintained ones */
|
||||||
|
/* int LZ4_uncompress (const char* source, char* dest, int outputSize); */
|
||||||
|
/* int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize); */
|
||||||
|
|
||||||
|
/* Obsolete streaming functions; use new streaming interface whenever possible */
|
||||||
|
LZ4_DEPRECATED("use LZ4_createStream() instead") void* LZ4_create (char* inputBuffer);
|
||||||
|
LZ4_DEPRECATED("use LZ4_createStream() instead") int LZ4_sizeofStreamState(void);
|
||||||
|
LZ4_DEPRECATED("use LZ4_resetStream() instead") int LZ4_resetStreamState(void* state, char* inputBuffer);
|
||||||
|
LZ4_DEPRECATED("use LZ4_saveDict() instead") char* LZ4_slideInputBuffer (void* state);
|
||||||
|
|
||||||
|
/* Obsolete streaming decoding functions */
|
||||||
|
LZ4_DEPRECATED("use LZ4_decompress_safe_usingDict() instead") int LZ4_decompress_safe_withPrefix64k (const char* src, char* dst, int compressedSize, int maxDstSize);
|
||||||
|
LZ4_DEPRECATED("use LZ4_decompress_fast_usingDict() instead") int LZ4_decompress_fast_withPrefix64k (const char* src, char* dst, int originalSize);
|
||||||
|
|
||||||
|
|
||||||
|
#if defined (__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1999 Tony Bybell.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
* copy of this software and associated documentation files (the "Software"),
|
||||||
|
* to deal in the Software without restriction, including without limitation
|
||||||
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
* and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
* Software is furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
* DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef WAVE_ALLOCA_H
|
||||||
|
#define WAVE_ALLOCA_H
|
||||||
|
#include <stdlib.h>
|
||||||
|
#ifdef HAVE_ALLOCA_H
|
||||||
|
#include <alloca.h>
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
#ifndef __MINGW32__
|
||||||
|
#ifndef alloca
|
||||||
|
#define alloca __builtin_alloca
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#include <malloc.h>
|
||||||
|
#endif
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
#include <malloc.h>
|
||||||
|
#define alloca _alloca
|
||||||
|
#endif
|
||||||
|
#define wave_alloca alloca
|
||||||
|
#endif
|
||||||
|
|
||||||
+2197
-245
File diff suppressed because it is too large
Load Diff
+1714
-706
File diff suppressed because it is too large
Load Diff
+104
-55
@@ -1,10 +1,10 @@
|
|||||||
# $Id$ -*- Makefile -*-
|
# -*- Makefile -*-
|
||||||
######################################################################
|
######################################################################
|
||||||
# DESCRIPTION: Makefile commands for all verilated target files
|
# DESCRIPTION: Makefile commands for all verilated target files
|
||||||
#
|
#
|
||||||
# Copyright 2003-2007 by Wilson Snyder. This program is free software; you can
|
# Copyright 2003-2019 by Wilson Snyder. Verilator is free software; you can
|
||||||
# redistribute it and/or modify it under the terms of either the GNU
|
# redistribute it and/or modify it under the terms of either the GNU Lesser
|
||||||
# Lesser General Public License or the Perl Artistic License.
|
# General Public License Version 3 or the Perl Artistic License Version 2.0.
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|
||||||
PERL = @PERL@
|
PERL = @PERL@
|
||||||
@@ -13,11 +13,32 @@ LINK = @CXX@
|
|||||||
AR = ar
|
AR = ar
|
||||||
RANLIB = ranlib
|
RANLIB = ranlib
|
||||||
|
|
||||||
|
CFG_WITH_CCWARN = @CFG_WITH_CCWARN@
|
||||||
|
CFG_WITH_LONGTESTS = @CFG_WITH_LONGTESTS@
|
||||||
|
|
||||||
|
# Select newest language
|
||||||
|
CFG_CXXFLAGS_STD_NEWEST = @CFG_CXXFLAGS_STD_NEWEST@
|
||||||
|
# Select oldest language (for Verilator internal testing only)
|
||||||
|
CFG_CXXFLAGS_STD_OLDEST = @CFG_CXXFLAGS_STD_OLDEST@
|
||||||
|
# Compiler flags to use to turn off unused and generated code warnings, such as -Wno-div-by-zero
|
||||||
|
CFG_CXXFLAGS_NO_UNUSED = @CFG_CXXFLAGS_NO_UNUSED@
|
||||||
|
# Compiler flags that turn on extra warnings
|
||||||
|
CFG_CXXFLAGS_WEXTRA = @CFG_CXXFLAGS_WEXTRA@
|
||||||
|
# Linker libraries for multithreading
|
||||||
|
CFG_LDLIBS_THREADS = @CFG_LDLIBS_THREADS@
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
# Programs
|
# Programs
|
||||||
|
|
||||||
SP_PREPROC = sp_preproc
|
VERILATOR_COVERAGE = $(PERL) $(VERILATOR_ROOT)/bin/verilator_coverage
|
||||||
SP_INCLUDER = $(PERL) $(VERILATOR_ROOT)/bin/verilator_includer
|
VERILATOR_INCLUDER = $(PERL) $(VERILATOR_ROOT)/bin/verilator_includer
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Make checks
|
||||||
|
|
||||||
|
ifneq ($(words $(CURDIR)),1)
|
||||||
|
$(error Unsupported: GNU Make cannot build in directories containing spaces, build elsewhere: '$(CURDIR)')
|
||||||
|
endif
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
# C Preprocessor flags
|
# C Preprocessor flags
|
||||||
@@ -26,25 +47,23 @@ SP_INCLUDER = $(PERL) $(VERILATOR_ROOT)/bin/verilator_includer
|
|||||||
VK_CPPFLAGS_ALWAYS += \
|
VK_CPPFLAGS_ALWAYS += \
|
||||||
-MMD \
|
-MMD \
|
||||||
-I$(VERILATOR_ROOT)/include \
|
-I$(VERILATOR_ROOT)/include \
|
||||||
-DVL_PRINTF=printf \
|
-I$(VERILATOR_ROOT)/include/vltstd \
|
||||||
|
-DVM_COVERAGE=$(VM_COVERAGE) \
|
||||||
|
-DVM_SC=$(VM_SC) \
|
||||||
-DVM_TRACE=$(VM_TRACE) \
|
-DVM_TRACE=$(VM_TRACE) \
|
||||||
|
$(CFG_CXXFLAGS_NO_UNUSED) \
|
||||||
|
|
||||||
ifeq ($(VERILATOR_AUTHOR_SITE),1) # Local... Else don't burden users
|
ifeq ($(CFG_WITH_CCWARN),yes) # Local... Else don't burden users
|
||||||
VK_CPPFLAGS_WALL += -Wall \
|
VK_CPPFLAGS_WALL += -Wall $(CFG_CXXFLAGS_WEXTRA) -Werror
|
||||||
-Wno-char-subscripts \
|
|
||||||
-Wno-sign-compare \
|
|
||||||
-Wno-unused-parameter \
|
|
||||||
-Wno-unused-variable \
|
|
||||||
-Wno-uninitialized \
|
|
||||||
-Werror
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CPPFLAGS += -I. $(VK_CPPFLAGS_ALWAYS) $(VK_CPPFLAGS_WALL)
|
CPPFLAGS += -I. $(VK_CPPFLAGS_WALL) $(VK_CPPFLAGS_ALWAYS)
|
||||||
|
|
||||||
VPATH += ..
|
VPATH += ..
|
||||||
VPATH += $(VERILATOR_ROOT)/include
|
VPATH += $(VERILATOR_ROOT)/include
|
||||||
|
VPATH += $(VERILATOR_ROOT)/include/vltstd
|
||||||
|
|
||||||
#OPT = -ggdb -DPRINTINITSTR -DDETECTCHANGE
|
#OPT = -ggdb -DPRINTINITSTR -DDETECTCHANGE
|
||||||
#OPT = -ggdb -DPRINTINITSTR
|
#OPT = -ggdb -DPRINTINITSTR
|
||||||
CPPFLAGS += $(OPT)
|
CPPFLAGS += $(OPT)
|
||||||
|
|
||||||
@@ -55,15 +74,21 @@ LDFLAGS += $(M32)
|
|||||||
# These aren't ever set by Verilator, so users are free to override them.
|
# These aren't ever set by Verilator, so users are free to override them.
|
||||||
CPPFLAGS += $(USER_CPPFLAGS)
|
CPPFLAGS += $(USER_CPPFLAGS)
|
||||||
LDFLAGS += $(USER_LDFLAGS)
|
LDFLAGS += $(USER_LDFLAGS)
|
||||||
|
LDLIBS += $(USER_LDLIBS)
|
||||||
|
|
||||||
|
# Add flags from -CFLAGS and -LDFLAGS on Verilator command line
|
||||||
|
CPPFLAGS += $(VM_USER_CFLAGS)
|
||||||
|
LDFLAGS += $(VM_USER_LDFLAGS)
|
||||||
|
LDLIBS += $(VM_USER_LDLIBS)
|
||||||
|
|
||||||
# See the benchmarking section of bin/verilator.
|
# See the benchmarking section of bin/verilator.
|
||||||
# Support class optimizations. This includes the tracing and symbol table.
|
# Support class optimizations. This includes the tracing and symbol table.
|
||||||
# SystemC takes minutes to optimize, thus it is off by default.
|
# SystemC takes minutes to optimize, thus it is off by default.
|
||||||
#OPT_SLOW =
|
#OPT_SLOW =
|
||||||
# Fast path optimizations. Most time is spent in these classes.
|
# Fast path optimizations. Most time is spent in these classes.
|
||||||
#OPT_FAST = -O2 -fstrict-aliasing
|
#OPT_FAST = -O2 -fstrict-aliasing
|
||||||
#OPT_FAST = -O
|
#OPT_FAST = -O
|
||||||
#OPT_FAST =
|
#OPT_FAST =
|
||||||
|
|
||||||
#######################################################################
|
#######################################################################
|
||||||
##### Aggregates
|
##### Aggregates
|
||||||
@@ -72,47 +97,52 @@ VM_CLASSES += $(VM_CLASSES_FAST) $(VM_CLASSES_SLOW)
|
|||||||
VM_SUPPORT += $(VM_SUPPORT_FAST) $(VM_SUPPORT_SLOW)
|
VM_SUPPORT += $(VM_SUPPORT_FAST) $(VM_SUPPORT_SLOW)
|
||||||
|
|
||||||
#######################################################################
|
#######################################################################
|
||||||
##### SystemC or SystemPerl builds
|
##### SystemC builds
|
||||||
|
|
||||||
ifeq ($(VM_SP_OR_SC),1)
|
ifeq ($(VM_SC),1)
|
||||||
CPPFLAGS += $(SYSTEMC_CXX_FLAGS) -I$(SYSTEMC)/include
|
CPPFLAGS += $(SYSTEMC_CXX_FLAGS) -I$(SYSTEMC_INCLUDE)
|
||||||
LDFLAGS += $(SYSTEMC_CXX_FLAGS) -L$(SYSTEMC)/lib-$(VM_SC_TARGET_ARCH)
|
LDFLAGS += $(SYSTEMC_CXX_FLAGS) -L$(SYSTEMC_LIBDIR)
|
||||||
LIBS += -lm -lstdc++
|
|
||||||
SC_LIBS = -lsystemc
|
SC_LIBS = -lsystemc
|
||||||
ifneq ($(wildcard $(SYSTEMC)/lib-$(VM_SC_TARGET_ARCH)/*numeric_bit*),)
|
ifneq ($(wildcard $(SYSTEMC_LIBDIR)/*numeric_bit*),)
|
||||||
# Systemc 1.2.1beta
|
# Systemc 1.2.1beta
|
||||||
SC_LIBS += -lnumeric_bit -lqt
|
SC_LIBS += -lnumeric_bit -lqt
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
#######################################################################
|
#######################################################################
|
||||||
##### SystemPerl builds
|
##### Threaded builds
|
||||||
|
|
||||||
ifeq ($(VM_SP),1)
|
ifneq ($(VM_THREADS),0)
|
||||||
CPPFLAGS += -I$(SYSTEMPERL)/src -DSYSTEMPERL
|
ifneq ($(VM_THREADS),)
|
||||||
VPATH += $(SYSTEMPERL)/src
|
CPPFLAGS += -DVL_THREADED
|
||||||
|
VK_LIBS_THREADED=1
|
||||||
VK_CLASSES_SP = $(addsuffix .sp, $(VM_CLASSES))
|
endif
|
||||||
|
|
||||||
# This rule is called manually by the upper level makefile
|
|
||||||
preproc:
|
|
||||||
@echo " SP Preprocess" $(basename $(VM_CLASSES)) ...
|
|
||||||
$(SP_PREPROC) -M sp_preproc.d --tree $(VM_PREFIX).sp_tree \
|
|
||||||
--preproc $(VK_CLASSES_SP)
|
|
||||||
else
|
|
||||||
preproc:
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifneq ($(VM_TRACE_THREADED),0)
|
||||||
|
ifneq ($(VM_TRACE_THREADED),)
|
||||||
|
CPPFLAGS += -DVL_TRACE_THREADED
|
||||||
|
VK_LIBS_THREADED=1
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq ($(VK_LIBS_THREADED),0)
|
||||||
|
ifneq ($(VK_LIBS_THREADED),)
|
||||||
|
# Need C++11 at least, so always default to newest
|
||||||
|
CPPFLAGS += $(CFG_CXXFLAGS_STD_NEWEST)
|
||||||
|
LDLIBS += $(CFG_LDLIBS_THREADS)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
##### Stub
|
||||||
|
|
||||||
|
preproc:
|
||||||
|
|
||||||
#######################################################################
|
#######################################################################
|
||||||
##### C/H builds
|
##### C/H builds
|
||||||
|
|
||||||
ifeq ($(VM_PCLI),1)
|
LIBS += -lm -lstdc++
|
||||||
LIBS += -lm -lstdc++
|
|
||||||
ifeq ($(VM_TRACE),1)
|
|
||||||
CPPFLAGS += -I$(SYSTEMPERL)/src
|
|
||||||
VPATH += $(SYSTEMPERL)/src
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
#######################################################################
|
#######################################################################
|
||||||
# Overall Objects Linking
|
# Overall Objects Linking
|
||||||
@@ -124,48 +154,67 @@ VK_SUPPORT_CPP = $(addsuffix .cpp, $(VM_SUPPORT))
|
|||||||
|
|
||||||
VK_USER_OBJS = $(addsuffix .o, $(VM_USER_CLASSES))
|
VK_USER_OBJS = $(addsuffix .o, $(VM_USER_CLASSES))
|
||||||
|
|
||||||
|
VK_GLOBAL_OBJS = $(addsuffix .o, $(VM_GLOBAL_FAST) $(VM_GLOBAL_SLOW))
|
||||||
|
|
||||||
ifneq ($(VM_PARALLEL_BUILDS),1)
|
ifneq ($(VM_PARALLEL_BUILDS),1)
|
||||||
# Fast building, all .cpp's in one fell swoop
|
# Fast building, all .cpp's in one fell swoop
|
||||||
# This saves about 5 sec per module, but can be slower if only a little changes
|
# This saves about 5 sec per module, but can be slower if only a little changes
|
||||||
VK_OBJS += $(VM_PREFIX)__ALLcls.o $(VM_PREFIX)__ALLsup.o
|
VK_OBJS += $(VM_PREFIX)__ALLcls.o $(VM_PREFIX)__ALLsup.o
|
||||||
all_cpp: $(VM_PREFIX)__ALLcls.cpp $(VM_PREFIX)__ALLsup.cpp
|
all_cpp: $(VM_PREFIX)__ALLcls.cpp $(VM_PREFIX)__ALLsup.cpp
|
||||||
$(VM_PREFIX)__ALLcls.cpp: $(VK_CLASSES_CPP)
|
$(VM_PREFIX)__ALLcls.cpp: $(VK_CLASSES_CPP)
|
||||||
$(SP_INCLUDER) $^ > $@
|
$(VERILATOR_INCLUDER) -DVL_INCLUDE_OPT=include $^ > $@
|
||||||
$(VM_PREFIX)__ALLsup.cpp: $(VK_SUPPORT_CPP)
|
$(VM_PREFIX)__ALLsup.cpp: $(VK_SUPPORT_CPP)
|
||||||
$(SP_INCLUDER) $^ > $@
|
$(VERILATOR_INCLUDER) -DVL_INCLUDE_OPT=include $^ > $@
|
||||||
else
|
else
|
||||||
#Slow way of building... Each .cpp file by itself
|
#Slow way of building... Each .cpp file by itself
|
||||||
VK_OBJS += $(addsuffix .o, $(VM_CLASSES) $(VM_SUPPORT))
|
VK_OBJS += $(addsuffix .o, $(VM_CLASSES) $(VM_SUPPORT))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
$(VM_PREFIX)__ALL.a: $(VK_OBJS)
|
$(VM_PREFIX)__ALL.a: $(VK_OBJS)
|
||||||
@echo " Archiving" $@ ...
|
$(AR) -cr $@ $^
|
||||||
$(AR) r $@ $^
|
|
||||||
$(RANLIB) $@
|
$(RANLIB) $@
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
### Compile rules
|
### Compile rules
|
||||||
|
|
||||||
#Default rule embedded in make: (Not defined so user makefiles can override it)
|
ifneq ($(VM_DEFAULT_RULES),0)
|
||||||
#.cpp.o:
|
$(VM_PREFIX)__ALLcls.o: $(VM_PREFIX)__ALLcls.cpp
|
||||||
# $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -o $@ $<
|
$(OBJCACHE) $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(OPT_FAST) -c -o $@ $<
|
||||||
|
|
||||||
$(VM_PREFIX)__ALLsup.o: $(VM_PREFIX)__ALLsup.cpp
|
$(VM_PREFIX)__ALLsup.o: $(VM_PREFIX)__ALLsup.cpp
|
||||||
$(OBJCACHE) $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(OPT_SLOW) -c -o $@ $<
|
$(OBJCACHE) $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(OPT_SLOW) -c -o $@ $<
|
||||||
|
|
||||||
$(VM_PREFIX)__ALLcls.o: $(VM_PREFIX)__ALLcls.cpp
|
# VM_GLOBAL_FAST files including verilated.o use this rule
|
||||||
|
%.o: %.cpp
|
||||||
$(OBJCACHE) $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(OPT_FAST) -c -o $@ $<
|
$(OBJCACHE) $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(OPT_FAST) -c -o $@ $<
|
||||||
|
|
||||||
|
%__Slow.o: %__Slow.cpp
|
||||||
|
$(OBJCACHE) $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(OPT_SLOW) -c -o $@ $<
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
#Default rule embedded in make:
|
||||||
|
#.cpp.o:
|
||||||
|
# $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
### Debugging
|
### Debugging
|
||||||
|
|
||||||
debug::
|
debug-make::
|
||||||
@echo
|
@echo
|
||||||
|
@echo CXXFLAGS: $(CXXFLAGS)
|
||||||
|
@echo CPPFLAGS: $(CPPFLAGS)
|
||||||
|
@echo OPT_FAST: $(OPT_FAST)
|
||||||
|
@echo OPT_SLOW: $(OPT_SLOW)
|
||||||
@echo VM_PREFIX: $(VM_PREFIX)
|
@echo VM_PREFIX: $(VM_PREFIX)
|
||||||
|
@echo VM_PARALLEL_BUILDS: $(VM_PARALLEL_BUILDS)
|
||||||
@echo VM_CLASSES_FAST: $(VM_CLASSES_FAST)
|
@echo VM_CLASSES_FAST: $(VM_CLASSES_FAST)
|
||||||
@echo VM_CLASSES_SLOW: $(VM_CLASSES_SLOW)
|
@echo VM_CLASSES_SLOW: $(VM_CLASSES_SLOW)
|
||||||
@echo VM_SUPPORT_FAST: $(VM_SUPPORT_FAST)
|
@echo VM_SUPPORT_FAST: $(VM_SUPPORT_FAST)
|
||||||
@echo VM_SUPPORT_SLOW: $(VM_SUPPORT_SLOW)
|
@echo VM_SUPPORT_SLOW: $(VM_SUPPORT_SLOW)
|
||||||
|
@echo VM_GLOBAL_FAST: $(VM_GLOBAL_FAST)
|
||||||
|
@echo VM_GLOBAL_SLOW: $(VM_GLOBAL_SLOW)
|
||||||
|
@echo VK_OBJS: $(VK_OBJS)
|
||||||
@echo
|
@echo
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|||||||
+11
-15
@@ -1,36 +1,32 @@
|
|||||||
// $Id$ -*- C++ -*-
|
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Code available from: http://www.veripool.com/verilator
|
// Code available from: https://verilator.org
|
||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2007 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2019 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License or the Perl Artistic License.
|
// Lesser General Public License Version 3 or the Perl Artistic License.
|
||||||
|
// Version 2.0.
|
||||||
//
|
//
|
||||||
// This is distributed in the hope that it will be useful,
|
// This is distributed in the hope that it will be useful,
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
// GNU General Public License for more details.
|
// GNU General Public License for more details.
|
||||||
//
|
//
|
||||||
//=========================================================================
|
//=========================================================================
|
||||||
//
|
//
|
||||||
// DESCRIPTION: Verilator: Include in verilog files to hide verilator defines
|
// DESCRIPTION: Verilator: Include in verilog files to hide verilator defines
|
||||||
|
|
||||||
`ifdef _VERILATED_V_ `else
|
`ifdef _VERILATED_V_ `else
|
||||||
`define _VERILATED_V_ 1
|
`define _VERILATED_V_ 1
|
||||||
|
|
||||||
// Hide verilator pragmas from other tools
|
// Hide verilator pragmas from other tools
|
||||||
`ifdef verilator `else
|
`ifdef VERILATOR `else
|
||||||
`define coverage_block_off
|
`define coverage_block_off
|
||||||
`endif
|
`endif
|
||||||
|
|
||||||
// Hide file descriptor difference
|
|
||||||
`ifdef verilator
|
|
||||||
`define verilator_file_descriptor reg [63:0]
|
|
||||||
`else
|
|
||||||
`define verilator_file_descriptor integer
|
|
||||||
`endif
|
|
||||||
|
|
||||||
`endif // guard
|
// Hide file descriptor difference - deprecated - for older versions
|
||||||
|
`define verilator_file_descriptor integer
|
||||||
|
|
||||||
|
`endif // guard
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
||||||
|
//*************************************************************************
|
||||||
|
//
|
||||||
|
// Copyright 2003-2019 by Wilson Snyder. This program is free software; you can
|
||||||
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
// Lesser General Public License Version 3 or the Perl Artistic License.
|
||||||
|
// Version 2.0.
|
||||||
|
//
|
||||||
|
// Verilator is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
//*************************************************************************
|
||||||
|
///
|
||||||
|
/// \file
|
||||||
|
/// \brief Verilator: Auto version information include for all Verilated C files
|
||||||
|
///
|
||||||
|
/// Code available from: https://verilator.org
|
||||||
|
///
|
||||||
|
//*************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
///**** Product and Version name
|
||||||
|
|
||||||
|
// Autoconf substitutes this with the strings from AC_INIT.
|
||||||
|
#define VERILATOR_PRODUCT "@PACKAGE_NAME@"
|
||||||
|
#define VERILATOR_VERSION "@PACKAGE_VERSION@"
|
||||||
@@ -0,0 +1,474 @@
|
|||||||
|
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
||||||
|
//=============================================================================
|
||||||
|
//
|
||||||
|
// THIS MODULE IS PUBLICLY LICENSED
|
||||||
|
//
|
||||||
|
// Copyright 2001-2019 by Wilson Snyder. This program is free software;
|
||||||
|
// you can redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
// Lesser General Public License Version 3 or the Perl Artistic License Version 2.0.
|
||||||
|
//
|
||||||
|
// This is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
// for more details.
|
||||||
|
//
|
||||||
|
//=============================================================================
|
||||||
|
///
|
||||||
|
/// \file
|
||||||
|
/// \brief Verilator coverage analysis
|
||||||
|
///
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
#include "verilatedos.h"
|
||||||
|
#include "verilated.h"
|
||||||
|
#include "verilated_cov.h"
|
||||||
|
#include "verilated_cov_key.h"
|
||||||
|
|
||||||
|
#include <deque>
|
||||||
|
#include <fstream>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
// VerilatedCovImpBase
|
||||||
|
/// Implementation base class for constants
|
||||||
|
|
||||||
|
struct VerilatedCovImpBase {
|
||||||
|
// TYPES
|
||||||
|
enum { MAX_KEYS = 33 }; /// Maximum user arguments + filename+lineno
|
||||||
|
enum { KEY_UNDEF = 0 }; /// Magic key # for unspecified values
|
||||||
|
};
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
// VerilatedCovImpItem
|
||||||
|
/// Implementation class for a VerilatedCov item
|
||||||
|
|
||||||
|
class VerilatedCovImpItem : VerilatedCovImpBase {
|
||||||
|
public: // But only local to this file
|
||||||
|
// MEMBERS
|
||||||
|
int m_keys[MAX_KEYS]; ///< Key
|
||||||
|
int m_vals[MAX_KEYS]; ///< Value for specified key
|
||||||
|
// CONSTRUCTORS
|
||||||
|
// Derived classes should call zero() in their constructor
|
||||||
|
VerilatedCovImpItem() {
|
||||||
|
for (int i=0; i<MAX_KEYS; ++i) {
|
||||||
|
m_keys[i] = KEY_UNDEF;
|
||||||
|
m_vals[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
virtual ~VerilatedCovImpItem() {}
|
||||||
|
virtual vluint64_t count() const = 0;
|
||||||
|
virtual void zero() const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/// VerilatedCoverItem templated for a specific class
|
||||||
|
/// Creates a new coverage item for the specified type.
|
||||||
|
/// This isn't in the header file for auto-magic conversion because it
|
||||||
|
/// inlines to too much code and makes compilation too slow.
|
||||||
|
|
||||||
|
template <class T> class VerilatedCoverItemSpec : public VerilatedCovImpItem {
|
||||||
|
private:
|
||||||
|
// MEMBERS
|
||||||
|
T* m_countp; ///< Count value
|
||||||
|
public:
|
||||||
|
// METHODS
|
||||||
|
// cppcheck-suppress truncLongCastReturn
|
||||||
|
virtual vluint64_t count() const { return *m_countp; }
|
||||||
|
virtual void zero() const { *m_countp = 0; }
|
||||||
|
// CONSTRUCTORS
|
||||||
|
// cppcheck-suppress noExplicitConstructor
|
||||||
|
VerilatedCoverItemSpec(T* countp) : m_countp(countp) { *m_countp = 0; }
|
||||||
|
virtual ~VerilatedCoverItemSpec() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
// VerilatedCovImp
|
||||||
|
/// Implementation class for VerilatedCov. See that class for public method information.
|
||||||
|
/// All value and keys are indexed into a unique number. Thus we can greatly reduce
|
||||||
|
/// the storage requirements for otherwise identical keys.
|
||||||
|
|
||||||
|
class VerilatedCovImp : VerilatedCovImpBase {
|
||||||
|
private:
|
||||||
|
// TYPES
|
||||||
|
typedef std::map<std::string,int> ValueIndexMap;
|
||||||
|
typedef std::map<int,std::string> IndexValueMap;
|
||||||
|
typedef std::deque<VerilatedCovImpItem*> ItemList;
|
||||||
|
|
||||||
|
private:
|
||||||
|
// MEMBERS
|
||||||
|
VerilatedMutex m_mutex; ///< Protects all members, when VL_THREADED. Wrapper deals with setting it.
|
||||||
|
ValueIndexMap m_valueIndexes VL_GUARDED_BY(m_mutex); ///< For each key/value a unique arbitrary index value
|
||||||
|
IndexValueMap m_indexValues VL_GUARDED_BY(m_mutex); ///< For each key/value a unique arbitrary index value
|
||||||
|
ItemList m_items VL_GUARDED_BY(m_mutex); ///< List of all items
|
||||||
|
|
||||||
|
VerilatedCovImpItem* m_insertp VL_GUARDED_BY(m_mutex); ///< Item about to insert
|
||||||
|
const char* m_insertFilenamep VL_GUARDED_BY(m_mutex); ///< Filename about to insert
|
||||||
|
int m_insertLineno VL_GUARDED_BY(m_mutex); ///< Line number about to insert
|
||||||
|
|
||||||
|
// CONSTRUCTORS
|
||||||
|
VerilatedCovImp() {
|
||||||
|
m_insertp = NULL;
|
||||||
|
m_insertFilenamep = NULL;
|
||||||
|
m_insertLineno = 0;
|
||||||
|
}
|
||||||
|
VL_UNCOPYABLE(VerilatedCovImp);
|
||||||
|
public:
|
||||||
|
~VerilatedCovImp() { clearGuts(); }
|
||||||
|
static VerilatedCovImp& imp() VL_MT_SAFE {
|
||||||
|
static VerilatedCovImp s_singleton;
|
||||||
|
return s_singleton;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
// PRIVATE METHODS
|
||||||
|
int valueIndex(const std::string& value) VL_REQUIRES(m_mutex) {
|
||||||
|
static int nextIndex = KEY_UNDEF+1;
|
||||||
|
ValueIndexMap::iterator iter = m_valueIndexes.find(value);
|
||||||
|
if (iter != m_valueIndexes.end()) return iter->second;
|
||||||
|
nextIndex++; assert(nextIndex>0);
|
||||||
|
m_valueIndexes.insert(std::make_pair(value, nextIndex));
|
||||||
|
m_indexValues.insert(std::make_pair(nextIndex, value));
|
||||||
|
return nextIndex;
|
||||||
|
}
|
||||||
|
static std::string dequote(const std::string& text) VL_PURE {
|
||||||
|
// Quote any special characters
|
||||||
|
std::string rtn;
|
||||||
|
for (const char* pos = text.c_str(); *pos; ++pos) {
|
||||||
|
if (!isprint(*pos) || *pos=='%' || *pos=='"') {
|
||||||
|
char hex[10]; sprintf(hex, "%%%02X", pos[0]);
|
||||||
|
rtn += hex;
|
||||||
|
} else {
|
||||||
|
rtn += *pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rtn;
|
||||||
|
}
|
||||||
|
static bool legalKey(const std::string& key) VL_PURE {
|
||||||
|
// Because we compress long keys to a single letter, and
|
||||||
|
// don't want applications to either get confused if they use
|
||||||
|
// a letter differently, nor want them to rely on our compression...
|
||||||
|
// (Considered using numeric keys, but will remain back compatible.)
|
||||||
|
if (key.length()<2) return false;
|
||||||
|
if (key.length()==2 && isdigit(key[1])) return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
static std::string keyValueFormatter(const std::string& key, const std::string& value) VL_PURE {
|
||||||
|
std::string name;
|
||||||
|
if (key.length()==1 && isalpha(key[0])) {
|
||||||
|
name += std::string("\001")+key;
|
||||||
|
} else {
|
||||||
|
name += std::string("\001")+dequote(key);
|
||||||
|
}
|
||||||
|
name += std::string("\002")+dequote(value);
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
static std::string combineHier(const std::string& old, const std::string& add) VL_PURE {
|
||||||
|
// (foo.a.x, foo.b.x) => foo.*.x
|
||||||
|
// (foo.a.x, foo.b.y) => foo.*
|
||||||
|
// (foo.a.x, foo.b) => foo.*
|
||||||
|
if (old == add) return add;
|
||||||
|
if (old.empty()) return add;
|
||||||
|
if (add.empty()) return old;
|
||||||
|
|
||||||
|
const char* a = old.c_str();
|
||||||
|
const char* b = add.c_str();
|
||||||
|
|
||||||
|
// Scan forward to first mismatch
|
||||||
|
const char* apre = a;
|
||||||
|
const char* bpre = b;
|
||||||
|
while (*apre == *bpre) { apre++; bpre++; }
|
||||||
|
|
||||||
|
// We used to backup and split on only .'s but it seems better to be verbose
|
||||||
|
// and not assume . is the separator
|
||||||
|
std::string prefix = std::string(a, apre-a);
|
||||||
|
|
||||||
|
// Scan backward to last mismatch
|
||||||
|
const char* apost = a+strlen(a)-1;
|
||||||
|
const char* bpost = b+strlen(b)-1;
|
||||||
|
while (*apost == *bpost
|
||||||
|
&& apost>apre && bpost>bpre) { apost--; bpost--; }
|
||||||
|
|
||||||
|
// Forward to . so we have a whole word
|
||||||
|
std::string suffix = *bpost ? std::string(bpost+1) : "";
|
||||||
|
|
||||||
|
std::string out = prefix+"*"+suffix;
|
||||||
|
|
||||||
|
//cout << "\nch pre="<<prefix<<" s="<<suffix<<"\nch a="<<old<<"\nch b="<<add<<"\nch o="<<out<<endl;
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
bool itemMatchesString(VerilatedCovImpItem* itemp, const std::string& match) VL_REQUIRES(m_mutex) {
|
||||||
|
for (int i=0; i<MAX_KEYS; ++i) {
|
||||||
|
if (itemp->m_keys[i] != KEY_UNDEF) {
|
||||||
|
// We don't compare keys, only values
|
||||||
|
std::string val = m_indexValues[itemp->m_vals[i]];
|
||||||
|
if (std::string::npos != val.find(match)) { // Found
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
static void selftest() VL_MT_SAFE {
|
||||||
|
// Little selftest
|
||||||
|
if (combineHier("a.b.c","a.b.c") !="a.b.c") VL_FATAL_MT(__FILE__,__LINE__,"","%Error: selftest\n");
|
||||||
|
if (combineHier("a.b.c","a.b") !="a.b*") VL_FATAL_MT(__FILE__,__LINE__,"","%Error: selftest\n");
|
||||||
|
if (combineHier("a.x.c","a.y.c") !="a.*.c") VL_FATAL_MT(__FILE__,__LINE__,"","%Error: selftest\n");
|
||||||
|
if (combineHier("a.z.z.z.c","a.b.c") !="a.*.c") VL_FATAL_MT(__FILE__,__LINE__,"","%Error: selftest\n");
|
||||||
|
if (combineHier("z","a") !="*") VL_FATAL_MT(__FILE__,__LINE__,"","%Error: selftest\n");
|
||||||
|
if (combineHier("q.a","q.b") !="q.*") VL_FATAL_MT(__FILE__,__LINE__,"","%Error: selftest\n");
|
||||||
|
if (combineHier("q.za","q.zb") !="q.z*") VL_FATAL_MT(__FILE__,__LINE__,"","%Error: selftest\n");
|
||||||
|
if (combineHier("1.2.3.a","9.8.7.a") !="*.a") VL_FATAL_MT(__FILE__,__LINE__,"","%Error: selftest\n");
|
||||||
|
}
|
||||||
|
void clearGuts() VL_REQUIRES(m_mutex) {
|
||||||
|
for (ItemList::const_iterator it=m_items.begin(); it!=m_items.end(); ++it) {
|
||||||
|
VerilatedCovImpItem* itemp = *(it);
|
||||||
|
delete itemp;
|
||||||
|
}
|
||||||
|
m_items.clear();
|
||||||
|
m_indexValues.clear();
|
||||||
|
m_valueIndexes.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
// PUBLIC METHODS
|
||||||
|
void clear() VL_EXCLUDES(m_mutex) {
|
||||||
|
Verilated::quiesce();
|
||||||
|
VerilatedLockGuard lock(m_mutex);
|
||||||
|
clearGuts();
|
||||||
|
}
|
||||||
|
void clearNonMatch(const char* matchp) VL_EXCLUDES(m_mutex) {
|
||||||
|
Verilated::quiesce();
|
||||||
|
VerilatedLockGuard lock(m_mutex);
|
||||||
|
if (matchp && matchp[0]) {
|
||||||
|
ItemList newlist;
|
||||||
|
for (ItemList::iterator it=m_items.begin(); it!=m_items.end(); ++it) {
|
||||||
|
VerilatedCovImpItem* itemp = *(it);
|
||||||
|
if (!itemMatchesString(itemp, matchp)) {
|
||||||
|
delete itemp;
|
||||||
|
} else {
|
||||||
|
newlist.push_back(itemp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_items = newlist;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void zero() VL_EXCLUDES(m_mutex) {
|
||||||
|
Verilated::quiesce();
|
||||||
|
VerilatedLockGuard lock(m_mutex);
|
||||||
|
for (ItemList::const_iterator it=m_items.begin(); it!=m_items.end(); ++it) {
|
||||||
|
(*it)->zero();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// We assume there's always call to i/f/p in that order
|
||||||
|
void inserti(VerilatedCovImpItem* itemp) VL_EXCLUDES(m_mutex) {
|
||||||
|
VerilatedLockGuard lock(m_mutex);
|
||||||
|
assert(!m_insertp);
|
||||||
|
m_insertp = itemp;
|
||||||
|
}
|
||||||
|
void insertf(const char* filenamep, int lineno) VL_EXCLUDES(m_mutex) {
|
||||||
|
VerilatedLockGuard lock(m_mutex);
|
||||||
|
m_insertFilenamep = filenamep;
|
||||||
|
m_insertLineno = lineno;
|
||||||
|
}
|
||||||
|
void insertp(const char* ckeyps[MAX_KEYS],
|
||||||
|
const char* valps[MAX_KEYS]) VL_EXCLUDES(m_mutex) {
|
||||||
|
VerilatedLockGuard lock(m_mutex);
|
||||||
|
assert(m_insertp);
|
||||||
|
// First two key/vals are filename
|
||||||
|
ckeyps[0]="filename"; valps[0]=m_insertFilenamep;
|
||||||
|
std::string linestr = vlCovCvtToStr(m_insertLineno);
|
||||||
|
ckeyps[1]="lineno"; valps[1]=linestr.c_str();
|
||||||
|
// Default page if not specified
|
||||||
|
const char* fnstartp = m_insertFilenamep;
|
||||||
|
while (const char* foundp = strchr(fnstartp,'/')) fnstartp = foundp+1;
|
||||||
|
const char* fnendp = fnstartp;
|
||||||
|
while (*fnendp && *fnendp!='.') fnendp++;
|
||||||
|
std::string page_default = "sp_user/"+std::string(fnstartp, fnendp-fnstartp);
|
||||||
|
ckeyps[2]="page"; valps[2]=page_default.c_str();
|
||||||
|
|
||||||
|
// Keys -> strings
|
||||||
|
std::string keys[MAX_KEYS];
|
||||||
|
for (int i=0; i<MAX_KEYS; ++i) {
|
||||||
|
if (ckeyps[i] && ckeyps[i][0]) {
|
||||||
|
keys[i] = ckeyps[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Ignore empty keys
|
||||||
|
for (int i=0; i<MAX_KEYS; ++i) {
|
||||||
|
if (!keys[i].empty()) {
|
||||||
|
for (int j=i+1; j<MAX_KEYS; ++j) {
|
||||||
|
if (keys[i] == keys[j]) { // Duplicate key. Keep the last one
|
||||||
|
keys[i] = "";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Insert the values
|
||||||
|
int addKeynum = 0;
|
||||||
|
for (int i=0; i<MAX_KEYS; ++i) {
|
||||||
|
const std::string key = keys[i];
|
||||||
|
if (!keys[i].empty()) {
|
||||||
|
const std::string val = valps[i];
|
||||||
|
//cout<<" "<<__FUNCTION__<<" "<<key<<" = "<<val<<endl;
|
||||||
|
m_insertp->m_keys[addKeynum] = valueIndex(key);
|
||||||
|
m_insertp->m_vals[addKeynum] = valueIndex(val);
|
||||||
|
addKeynum++;
|
||||||
|
if (!legalKey(key)) {
|
||||||
|
std::string msg
|
||||||
|
= ("%Error: Coverage keys of one character, or letter+digit are illegal: "
|
||||||
|
+key);
|
||||||
|
VL_FATAL_MT("", 0, "", msg.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_items.push_back(m_insertp);
|
||||||
|
// Prepare for next
|
||||||
|
m_insertp = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void write(const char* filename) VL_EXCLUDES(m_mutex) {
|
||||||
|
Verilated::quiesce();
|
||||||
|
VerilatedLockGuard lock(m_mutex);
|
||||||
|
#ifndef VM_COVERAGE
|
||||||
|
VL_FATAL_MT("", 0, "", "%Error: Called VerilatedCov::write when VM_COVERAGE disabled\n");
|
||||||
|
#endif
|
||||||
|
selftest();
|
||||||
|
|
||||||
|
std::ofstream os(filename);
|
||||||
|
if (os.fail()) {
|
||||||
|
std::string msg = std::string("%Error: Can't write '")+filename+"'";
|
||||||
|
VL_FATAL_MT("", 0, "", msg.c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
os << "# SystemC::Coverage-3\n";
|
||||||
|
|
||||||
|
// Build list of events; totalize if collapsing hierarchy
|
||||||
|
typedef std::map<std::string,std::pair<std::string,vluint64_t> > EventMap;
|
||||||
|
EventMap eventCounts;
|
||||||
|
for (ItemList::iterator it=m_items.begin(); it!=m_items.end(); ++it) {
|
||||||
|
VerilatedCovImpItem* itemp = *(it);
|
||||||
|
std::string name;
|
||||||
|
std::string hier;
|
||||||
|
bool per_instance = false;
|
||||||
|
|
||||||
|
for (int i=0; i<MAX_KEYS; ++i) {
|
||||||
|
if (itemp->m_keys[i] != KEY_UNDEF) {
|
||||||
|
std::string key = VerilatedCovKey::shortKey(m_indexValues[itemp->m_keys[i]]);
|
||||||
|
std::string val = m_indexValues[itemp->m_vals[i]];
|
||||||
|
if (key == VL_CIK_PER_INSTANCE) {
|
||||||
|
if (val != "0") per_instance = true;
|
||||||
|
}
|
||||||
|
if (key == VL_CIK_HIER) {
|
||||||
|
hier = val;
|
||||||
|
} else {
|
||||||
|
// Print it
|
||||||
|
name += keyValueFormatter(key, val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (per_instance) { // Not collapsing hierarchies
|
||||||
|
name += keyValueFormatter(VL_CIK_HIER, hier);
|
||||||
|
hier = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Group versus point labels don't matter here, downstream
|
||||||
|
// deals with it. Seems bad for sizing though and doesn't
|
||||||
|
// allow easy addition of new group codes (would be
|
||||||
|
// inefficient)
|
||||||
|
|
||||||
|
// Find or insert the named event
|
||||||
|
EventMap::iterator cit = eventCounts.find(name);
|
||||||
|
if (cit != eventCounts.end()) {
|
||||||
|
const std::string& oldhier = cit->second.first;
|
||||||
|
cit->second.second += itemp->count();
|
||||||
|
cit->second.first = combineHier(oldhier, hier);
|
||||||
|
} else {
|
||||||
|
eventCounts.insert(std::make_pair(name, make_pair(hier, itemp->count())));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output body
|
||||||
|
for (EventMap::const_iterator it=eventCounts.begin(); it!=eventCounts.end(); ++it) {
|
||||||
|
os<<"C '"<<std::dec;
|
||||||
|
os<<it->first;
|
||||||
|
if (!it->second.first.empty()) os<<keyValueFormatter(VL_CIK_HIER, it->second.first);
|
||||||
|
os<<"' "<<it->second.second;
|
||||||
|
os<<std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
// VerilatedCov
|
||||||
|
|
||||||
|
void VerilatedCov::clear() VL_MT_SAFE {
|
||||||
|
VerilatedCovImp::imp().clear();
|
||||||
|
}
|
||||||
|
void VerilatedCov::clearNonMatch(const char* matchp) VL_MT_SAFE {
|
||||||
|
VerilatedCovImp::imp().clearNonMatch(matchp);
|
||||||
|
}
|
||||||
|
void VerilatedCov::zero() VL_MT_SAFE {
|
||||||
|
VerilatedCovImp::imp().zero();
|
||||||
|
}
|
||||||
|
void VerilatedCov::write(const char* filenamep) VL_MT_SAFE {
|
||||||
|
VerilatedCovImp::imp().write(filenamep);
|
||||||
|
}
|
||||||
|
void VerilatedCov::_inserti(vluint32_t* itemp) VL_MT_SAFE {
|
||||||
|
VerilatedCovImp::imp().inserti(new VerilatedCoverItemSpec<vluint32_t>(itemp));
|
||||||
|
}
|
||||||
|
void VerilatedCov::_inserti(vluint64_t* itemp) VL_MT_SAFE {
|
||||||
|
VerilatedCovImp::imp().inserti(new VerilatedCoverItemSpec<vluint64_t>(itemp));
|
||||||
|
}
|
||||||
|
void VerilatedCov::_insertf(const char* filename, int lineno) VL_MT_SAFE {
|
||||||
|
VerilatedCovImp::imp().insertf(filename, lineno);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define K(n) const char* key ## n
|
||||||
|
#define A(n) const char* key ## n, const char* valp ## n // Argument list
|
||||||
|
#define C(n) key ## n, valp ## n // Calling argument list
|
||||||
|
#define N(n) "","" // Null argument list
|
||||||
|
void VerilatedCov::_insertp(A(0),A(1),A(2),A(3),A(4),A(5),A(6),A(7),A(8),A(9),
|
||||||
|
A(10),A(11),A(12),A(13),A(14),A(15),A(16),A(17),A(18),A(19),
|
||||||
|
A(20),A(21),A(22),A(23),A(24),A(25),A(26),A(27),A(28),A(29)) VL_MT_SAFE {
|
||||||
|
const char* keyps[VerilatedCovImpBase::MAX_KEYS]
|
||||||
|
= {NULL,NULL,NULL, // filename,lineno,page
|
||||||
|
key0,key1,key2,key3,key4,key5,key6,key7,key8,key9,
|
||||||
|
key10,key11,key12,key13,key14,key15,key16,key17,key18,key19,
|
||||||
|
key20,key21,key22,key23,key24,key25,key26,key27,key28,key29};
|
||||||
|
const char* valps[VerilatedCovImpBase::MAX_KEYS]
|
||||||
|
= {NULL,NULL,NULL, // filename,lineno,page
|
||||||
|
valp0,valp1,valp2,valp3,valp4,valp5,valp6,valp7,valp8,valp9,
|
||||||
|
valp10,valp11,valp12,valp13,valp14,valp15,valp16,valp17,valp18,valp19,
|
||||||
|
valp20,valp21,valp22,valp23,valp24,valp25,valp26,valp27,valp28,valp29};
|
||||||
|
VerilatedCovImp::imp().insertp(keyps, valps);
|
||||||
|
}
|
||||||
|
|
||||||
|
// And versions with fewer arguments (oh for a language with named parameters!)
|
||||||
|
void VerilatedCov::_insertp(A(0),A(1),A(2),A(3),A(4),A(5),A(6),A(7),A(8),A(9)) VL_MT_SAFE {
|
||||||
|
_insertp(C(0),C(1),C(2),C(3),C(4),C(5),C(6),C(7),C(8),C(9),
|
||||||
|
N(10),N(11),N(12),N(13),N(14),N(15),N(16),N(17),N(18),N(19),
|
||||||
|
N(20),N(21),N(22),N(23),N(24),N(25),N(26),N(27),N(28),N(29));
|
||||||
|
}
|
||||||
|
void VerilatedCov::_insertp(A(0),A(1),A(2),A(3),A(4),A(5),A(6),A(7),A(8),A(9),
|
||||||
|
A(10),A(11),A(12),A(13),A(14),A(15),A(16),A(17),A(18),A(19)) VL_MT_SAFE {
|
||||||
|
_insertp(C(0),C(1),C(2),C(3),C(4),C(5),C(6),C(7),C(8),C(9),
|
||||||
|
C(10),C(11),C(12),C(13),C(14),C(15),C(16),C(17),C(18),C(19),
|
||||||
|
N(20),N(21),N(22),N(23),N(24),N(25),N(26),N(27),N(28),N(29));
|
||||||
|
}
|
||||||
|
// Backward compatibility for Verilator
|
||||||
|
void VerilatedCov::_insertp(A(0), A(1), K(2),int val2, K(3),int val3,
|
||||||
|
K(4),const std::string& val4, A(5),A(6)) VL_MT_SAFE {
|
||||||
|
std::string val2str = vlCovCvtToStr(val2);
|
||||||
|
std::string val3str = vlCovCvtToStr(val3);
|
||||||
|
_insertp(C(0),C(1),
|
||||||
|
key2,val2str.c_str(), key3,val3str.c_str(), key4, val4.c_str(),
|
||||||
|
C(5),C(6),N(7),N(8),N(9),
|
||||||
|
N(10),N(11),N(12),N(13),N(14),N(15),N(16),N(17),N(18),N(19),
|
||||||
|
N(20),N(21),N(22),N(23),N(24),N(25),N(26),N(27),N(28),N(29));
|
||||||
|
}
|
||||||
|
#undef A
|
||||||
|
#undef C
|
||||||
|
#undef N
|
||||||
|
#undef K
|
||||||
@@ -0,0 +1,132 @@
|
|||||||
|
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
||||||
|
//=============================================================================
|
||||||
|
//
|
||||||
|
// THIS MODULE IS PUBLICLY LICENSED
|
||||||
|
//
|
||||||
|
// Copyright 2001-2019 by Wilson Snyder. This program is free software;
|
||||||
|
// you can redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
// Lesser General Public License Version 3 or the Perl Artistic License Version 2.0.
|
||||||
|
//
|
||||||
|
// This is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
// for more details.
|
||||||
|
//
|
||||||
|
//=============================================================================
|
||||||
|
///
|
||||||
|
/// \file
|
||||||
|
/// \brief Coverage analysis support
|
||||||
|
///
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
#ifndef _VERILATED_COV_H_
|
||||||
|
#define _VERILATED_COV_H_ 1
|
||||||
|
|
||||||
|
#include "verilatedos.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/// Conditionally compile coverage code
|
||||||
|
|
||||||
|
#ifdef VM_COVERAGE
|
||||||
|
# define VL_IF_COVER(stmts) do { stmts ; } while(0)
|
||||||
|
#else
|
||||||
|
# define VL_IF_COVER(stmts) do { if(0) { stmts ; } } while(0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/// Insert a item for coverage analysis.
|
||||||
|
/// The first argument is a pointer to the count to be dumped.
|
||||||
|
/// The remaining arguments occur in pairs: A string key, and a value.
|
||||||
|
/// The value may be a string, or another type which will be auto-converted to a string.
|
||||||
|
///
|
||||||
|
/// Some typical keys:
|
||||||
|
/// filename File the recording occurs in. Defaults to __FILE__
|
||||||
|
/// lineno Line number the recording occurs in. Defaults to __LINE__
|
||||||
|
/// column Column number (or occurrence# for dup file/lines). Defaults to undef.
|
||||||
|
/// hier Hierarchical name. Defaults to name()
|
||||||
|
/// type Type of coverage. Defaults to "user"
|
||||||
|
/// Other types are 'block', 'fsm', 'toggle'.
|
||||||
|
/// comment Description of the coverage event. Should be set by the user.
|
||||||
|
/// Comments for type==block: 'if', 'else', 'elsif', 'case'
|
||||||
|
/// thresh Threshold to consider fully covered.
|
||||||
|
/// If unspecified, downstream tools will determine it.
|
||||||
|
///
|
||||||
|
/// Examples:
|
||||||
|
///
|
||||||
|
/// vluint32_t m_cases[10];
|
||||||
|
/// constructor {
|
||||||
|
/// for (int i=0; i<10; ++i) { m_cases[i]=0; }
|
||||||
|
/// }
|
||||||
|
/// for (int i=0; i<10; ++i) {
|
||||||
|
/// VL_COVER_INSERT(&m_cases[i], "comment", "Coverage Case", "i", cvtToNumStr(i));
|
||||||
|
/// }
|
||||||
|
|
||||||
|
#define VL_COVER_INSERT(countp,args...) \
|
||||||
|
VL_IF_COVER(VerilatedCov::_inserti(countp); \
|
||||||
|
VerilatedCov::_insertf(__FILE__, __LINE__); \
|
||||||
|
VerilatedCov::_insertp("hier", name(), args))
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
/// Convert VL_COVER_INSERT value arguments to strings
|
||||||
|
|
||||||
|
template< class T> std::string vlCovCvtToStr(const T& t) VL_PURE {
|
||||||
|
std::ostringstream os; os<<t; return os.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
// VerilatedCov
|
||||||
|
/// Verilator coverage global class
|
||||||
|
////
|
||||||
|
/// Global class with methods affecting all coverage data.
|
||||||
|
/// All public methods in this class are thread safe.
|
||||||
|
|
||||||
|
class VerilatedCov {
|
||||||
|
VL_UNCOPYABLE(VerilatedCov);
|
||||||
|
public:
|
||||||
|
// GLOBAL METHODS
|
||||||
|
/// Return default filename
|
||||||
|
static const char* defaultFilename() VL_PURE { return "coverage.dat"; }
|
||||||
|
/// Write all coverage data to a file
|
||||||
|
static void write(const char* filenamep = defaultFilename()) VL_MT_SAFE;
|
||||||
|
/// Insert a coverage item
|
||||||
|
/// We accept from 1-30 key/value pairs, all as strings.
|
||||||
|
/// Call _insert1, followed by _insert2 and _insert3
|
||||||
|
/// Do not call directly; use VL_COVER_INSERT or higher level macros instead
|
||||||
|
// _insert1: Remember item pointer with count. (Not const, as may add zeroing function)
|
||||||
|
static void _inserti(vluint32_t* itemp) VL_MT_SAFE;
|
||||||
|
static void _inserti(vluint64_t* itemp) VL_MT_SAFE;
|
||||||
|
// _insert2: Set default filename and line number
|
||||||
|
static void _insertf(const char* filename, int lineno) VL_MT_SAFE;
|
||||||
|
// _insert3: Set parameters
|
||||||
|
// We could have just the maximum argument version, but this compiles
|
||||||
|
// much slower (nearly 2x) than having smaller versions also. However
|
||||||
|
// there's not much more gain in having a version for each number of args.
|
||||||
|
#define K(n) const char* key ## n
|
||||||
|
#define A(n) const char* key ## n, const char* valp ## n // Argument list
|
||||||
|
#define D(n) const char* key ## n = NULL, const char* valp ## n = NULL // Argument list
|
||||||
|
static void _insertp(D(0),D(1),D(2),D(3),D(4),D(5),D(6),D(7),D(8),D(9));
|
||||||
|
static void _insertp(A(0),A(1),A(2),A(3),A(4),A(5),A(6),A(7),A(8),A(9)
|
||||||
|
,A(10),D(11),D(12),D(13),D(14),D(15),D(16),D(17),D(18),D(19));
|
||||||
|
static void _insertp(A(0),A(1),A(2),A(3),A(4),A(5),A(6),A(7),A(8),A(9)
|
||||||
|
,A(10),A(11),A(12),A(13),A(14),A(15),A(16),A(17),A(18),A(19)
|
||||||
|
,A(20),D(21),D(22),D(23),D(24),D(25),D(26),D(27),D(28),D(29));
|
||||||
|
// Backward compatibility for Verilator
|
||||||
|
static void _insertp(A(0), A(1), K(2),int val2, K(3),int val3,
|
||||||
|
K(4),const std::string& val4, A(5),A(6));
|
||||||
|
|
||||||
|
#undef K
|
||||||
|
#undef A
|
||||||
|
#undef D
|
||||||
|
/// Clear coverage points (and call delete on all items)
|
||||||
|
static void clear() VL_MT_SAFE;
|
||||||
|
/// Clear items not matching the provided string
|
||||||
|
static void clearNonMatch(const char* matchp) VL_MT_SAFE;
|
||||||
|
/// Zero coverage points
|
||||||
|
static void zero() VL_MT_SAFE;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // Guard
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user