2 * yosys -- Yosys Open SYnthesis Suite
4 * Copyright (C) 2012 Clifford Wolf <clifford@clifford.at>
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23 #include "kernel/log.h"
24 #include "kernel/rtlil.h"
29 typedef std::vector
<RTLIL::State
> bits_t
;
30 std::set
<bits_t
> pool
;
32 BitPatternPool(RTLIL::SigSpec sig
)
36 std::vector
<RTLIL::State
> pattern(width
);
37 for (int i
= 0; i
< width
; i
++) {
38 RTLIL::SigSpec s
= sig
.extract(i
, 1);
39 assert(s
.chunks().size() == 1);
40 if (s
.chunks()[0].wire
== NULL
&& s
.chunks()[0].data
.bits
[0] <= RTLIL::State::S1
)
41 pattern
[i
] = s
.chunks()[0].data
.bits
[0];
43 pattern
[i
] = RTLIL::State::Sa
;
49 BitPatternPool(int width
)
53 std::vector
<RTLIL::State
> pattern(width
);
54 for (int i
= 0; i
< width
; i
++)
55 pattern
[i
] = RTLIL::State::Sa
;
60 bits_t
sig2bits(RTLIL::SigSpec sig
)
62 assert(sig
.is_fully_const());
63 assert(sig
.chunks().size() == 1);
64 bits_t bits
= sig
.chunks()[0].data
.bits
;
66 if (b
> RTLIL::State::S1
)
71 bool match(bits_t a
, bits_t b
)
73 assert(int(a
.size()) == width
);
74 assert(int(b
.size()) == width
);
75 for (int i
= 0; i
< width
; i
++)
76 if (a
[i
] <= RTLIL::State::S1
&& b
[i
] <= RTLIL::State::S1
&& a
[i
] != b
[i
])
81 bool has_any(RTLIL::SigSpec sig
)
83 bits_t bits
= sig2bits(sig
);
90 bool has_all(RTLIL::SigSpec sig
)
92 bits_t bits
= sig2bits(sig
);
94 if (match(it
, bits
)) {
95 for (int i
= 0; i
< width
; i
++)
96 if (bits
[i
] > RTLIL::State::S1
&& it
[i
] <= RTLIL::State::S1
)
104 bool take(RTLIL::SigSpec sig
)
107 bits_t bits
= sig2bits(sig
);
108 std::vector
<bits_t
> pattern_list
;
109 for (auto &it
: pool
)
111 pattern_list
.push_back(it
);
112 for (auto pattern
: pattern_list
) {
114 for (int i
= 0; i
< width
; i
++) {
115 if (pattern
[i
] != RTLIL::State::Sa
|| bits
[i
] == RTLIL::State::Sa
)
117 bits_t new_pattern
= pattern
;
118 new_pattern
[i
] = bits
[i
] == RTLIL::State::S1
? RTLIL::State::S0
: RTLIL::State::S1
;
119 pool
.insert(new_pattern
);