yowasp-yosys 0.56.0.141.post974.dev0__py3-none-any.whl → 0.58.0.0.post1010__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- yowasp_yosys/share/gowin/cells_sim.v +0 -8
- yowasp_yosys/share/gowin/cells_xtra_gw1n.v +7 -0
- yowasp_yosys/share/gowin/cells_xtra_gw2a.v +12 -0
- yowasp_yosys/share/gowin/cells_xtra_gw5a.v +84 -0
- yowasp_yosys/share/include/backends/rtlil/rtlil_backend.h +1 -0
- yowasp_yosys/share/include/frontends/ast/ast.h +6 -1
- yowasp_yosys/share/include/kernel/bitpattern.h +50 -1
- yowasp_yosys/share/include/kernel/celltypes.h +19 -9
- yowasp_yosys/share/include/kernel/consteval.h +2 -2
- yowasp_yosys/share/include/kernel/constids.inc +859 -137
- yowasp_yosys/share/include/kernel/drivertools.h +6 -5
- yowasp_yosys/share/include/kernel/ffinit.h +5 -5
- yowasp_yosys/share/include/kernel/hashlib.h +88 -38
- yowasp_yosys/share/include/kernel/io.h +17 -2
- yowasp_yosys/share/include/kernel/log.h +102 -31
- yowasp_yosys/share/include/kernel/macc.h +1 -1
- yowasp_yosys/share/include/kernel/mem.h +4 -2
- yowasp_yosys/share/include/kernel/rtlil.h +268 -61
- yowasp_yosys/share/include/kernel/satgen.h +1 -1
- yowasp_yosys/share/include/kernel/threading.h +186 -0
- yowasp_yosys/share/include/kernel/utils.h +11 -0
- yowasp_yosys/share/include/kernel/yosys_common.h +9 -13
- yowasp_yosys/share/include/passes/fsm/fsmdata.h +18 -33
- yowasp_yosys/share/include/passes/techmap/libparse.h +1 -1
- yowasp_yosys/share/lattice/cells_bb_ecp5.v +4 -0
- yowasp_yosys/share/python3/sby_engine_abc.py +5 -2
- yowasp_yosys/share/simlib.v +34 -0
- yowasp_yosys/share/techmap.v +34 -2
- yowasp_yosys/smtbmc.py +5 -0
- yowasp_yosys/yosys.wasm +0 -0
- {yowasp_yosys-0.56.0.141.post974.dev0.dist-info → yowasp_yosys-0.58.0.0.post1010.dist-info}/METADATA +1 -1
- {yowasp_yosys-0.56.0.141.post974.dev0.dist-info → yowasp_yosys-0.58.0.0.post1010.dist-info}/RECORD +35 -34
- {yowasp_yosys-0.56.0.141.post974.dev0.dist-info → yowasp_yosys-0.58.0.0.post1010.dist-info}/WHEEL +0 -0
- {yowasp_yosys-0.56.0.141.post974.dev0.dist-info → yowasp_yosys-0.58.0.0.post1010.dist-info}/entry_points.txt +0 -0
- {yowasp_yosys-0.56.0.141.post974.dev0.dist-info → yowasp_yosys-0.58.0.0.post1010.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
#include <deque>
|
|
2
|
+
|
|
3
|
+
#ifdef YOSYS_ENABLE_THREADS
|
|
4
|
+
#include <condition_variable>
|
|
5
|
+
#include <mutex>
|
|
6
|
+
#include <thread>
|
|
7
|
+
#endif
|
|
8
|
+
|
|
9
|
+
#include "kernel/yosys_common.h"
|
|
10
|
+
#include "kernel/log.h"
|
|
11
|
+
|
|
12
|
+
#ifndef YOSYS_THREADING_H
|
|
13
|
+
#define YOSYS_THREADING_H
|
|
14
|
+
|
|
15
|
+
YOSYS_NAMESPACE_BEGIN
|
|
16
|
+
|
|
17
|
+
// Concurrent queue implementation. Not fast, but simple.
|
|
18
|
+
// Multi-producer, multi-consumer, optionally bounded.
|
|
19
|
+
// When YOSYS_ENABLE_THREADS is not defined, this is just a non-thread-safe non-blocking deque.
|
|
20
|
+
template <typename T>
|
|
21
|
+
class ConcurrentQueue
|
|
22
|
+
{
|
|
23
|
+
public:
|
|
24
|
+
ConcurrentQueue(int capacity = INT_MAX)
|
|
25
|
+
: capacity(capacity) {}
|
|
26
|
+
// Push an element into the queue. If it's at capacity, block until there is room.
|
|
27
|
+
void push_back(T t)
|
|
28
|
+
{
|
|
29
|
+
#ifdef YOSYS_ENABLE_THREADS
|
|
30
|
+
std::unique_lock<std::mutex> lock(mutex);
|
|
31
|
+
not_full_condition.wait(lock, [this] { return static_cast<int>(contents.size()) < capacity; });
|
|
32
|
+
if (contents.empty())
|
|
33
|
+
not_empty_condition.notify_one();
|
|
34
|
+
#endif
|
|
35
|
+
log_assert(!closed);
|
|
36
|
+
contents.push_back(std::move(t));
|
|
37
|
+
#ifdef YOSYS_ENABLE_THREADS
|
|
38
|
+
if (static_cast<int>(contents.size()) < capacity)
|
|
39
|
+
not_full_condition.notify_one();
|
|
40
|
+
#endif
|
|
41
|
+
}
|
|
42
|
+
// Signal that no more elements will be produced. `pop_front()` will return nullopt.
|
|
43
|
+
void close()
|
|
44
|
+
{
|
|
45
|
+
#ifdef YOSYS_ENABLE_THREADS
|
|
46
|
+
std::unique_lock<std::mutex> lock(mutex);
|
|
47
|
+
not_empty_condition.notify_all();
|
|
48
|
+
#endif
|
|
49
|
+
closed = true;
|
|
50
|
+
}
|
|
51
|
+
// Pop an element from the queue. Blocks until an element is available
|
|
52
|
+
// or the queue is closed and empty.
|
|
53
|
+
std::optional<T> pop_front()
|
|
54
|
+
{
|
|
55
|
+
return pop_front_internal(true);
|
|
56
|
+
}
|
|
57
|
+
// Pop an element from the queue. Does not block, just returns nullopt if the
|
|
58
|
+
// queue is empty.
|
|
59
|
+
std::optional<T> try_pop_front()
|
|
60
|
+
{
|
|
61
|
+
return pop_front_internal(false);
|
|
62
|
+
}
|
|
63
|
+
private:
|
|
64
|
+
#ifdef YOSYS_ENABLE_THREADS
|
|
65
|
+
std::optional<T> pop_front_internal(bool wait)
|
|
66
|
+
{
|
|
67
|
+
std::unique_lock<std::mutex> lock(mutex);
|
|
68
|
+
if (wait) {
|
|
69
|
+
not_empty_condition.wait(lock, [this] { return !contents.empty() || closed; });
|
|
70
|
+
}
|
|
71
|
+
#else
|
|
72
|
+
std::optional<T> pop_front_internal(bool)
|
|
73
|
+
{
|
|
74
|
+
#endif
|
|
75
|
+
if (contents.empty())
|
|
76
|
+
return std::nullopt;
|
|
77
|
+
#ifdef YOSYS_ENABLE_THREADS
|
|
78
|
+
if (static_cast<int>(contents.size()) == capacity)
|
|
79
|
+
not_full_condition.notify_one();
|
|
80
|
+
#endif
|
|
81
|
+
T result = std::move(contents.front());
|
|
82
|
+
contents.pop_front();
|
|
83
|
+
#ifdef YOSYS_ENABLE_THREADS
|
|
84
|
+
if (!contents.empty())
|
|
85
|
+
not_empty_condition.notify_one();
|
|
86
|
+
#endif
|
|
87
|
+
return std::move(result);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
#ifdef YOSYS_ENABLE_THREADS
|
|
91
|
+
std::mutex mutex;
|
|
92
|
+
// Signals one waiter thread when the queue changes and is not full.
|
|
93
|
+
std::condition_variable not_full_condition;
|
|
94
|
+
// Signals one waiter thread when the queue changes and is not empty.
|
|
95
|
+
std::condition_variable not_empty_condition;
|
|
96
|
+
#endif
|
|
97
|
+
std::deque<T> contents;
|
|
98
|
+
int capacity;
|
|
99
|
+
bool closed = false;
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
class DeferredLogs
|
|
103
|
+
{
|
|
104
|
+
public:
|
|
105
|
+
template <typename... Args>
|
|
106
|
+
void log(FmtString<TypeIdentity<Args>...> fmt, Args... args)
|
|
107
|
+
{
|
|
108
|
+
logs.push_back({fmt.format(args...), false});
|
|
109
|
+
}
|
|
110
|
+
template <typename... Args>
|
|
111
|
+
void log_error(FmtString<TypeIdentity<Args>...> fmt, Args... args)
|
|
112
|
+
{
|
|
113
|
+
logs.push_back({fmt.format(args...), true});
|
|
114
|
+
}
|
|
115
|
+
void flush();
|
|
116
|
+
private:
|
|
117
|
+
struct Message
|
|
118
|
+
{
|
|
119
|
+
std::string text;
|
|
120
|
+
bool error;
|
|
121
|
+
};
|
|
122
|
+
std::vector<Message> logs;
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
class ThreadPool
|
|
126
|
+
{
|
|
127
|
+
public:
|
|
128
|
+
// Computes the number of worker threads to use.
|
|
129
|
+
// `reserved_cores` cores are set aside for other threads (e.g. work on the main thread).
|
|
130
|
+
// `max_threads` --- don't return more workers than this.
|
|
131
|
+
// The result may be 0.
|
|
132
|
+
static int pool_size(int reserved_cores, int max_threads);
|
|
133
|
+
|
|
134
|
+
// Create a pool of threads running the given closure (parameterized by thread number).
|
|
135
|
+
// `pool_size` must be the result of a `pool_size()` call.
|
|
136
|
+
ThreadPool(int pool_size, std::function<void(int)> b);
|
|
137
|
+
ThreadPool(ThreadPool &&other) = delete;
|
|
138
|
+
// Waits for all threads to terminate. Make sure those closures return!
|
|
139
|
+
~ThreadPool();
|
|
140
|
+
|
|
141
|
+
// Return the number of threads in the pool.
|
|
142
|
+
int num_threads() const
|
|
143
|
+
{
|
|
144
|
+
#ifdef YOSYS_ENABLE_THREADS
|
|
145
|
+
return threads.size();
|
|
146
|
+
#else
|
|
147
|
+
return 0;
|
|
148
|
+
#endif
|
|
149
|
+
}
|
|
150
|
+
private:
|
|
151
|
+
std::function<void(int)> body;
|
|
152
|
+
#ifdef YOSYS_ENABLE_THREADS
|
|
153
|
+
std::vector<std::thread> threads;
|
|
154
|
+
#endif
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
template <class T>
|
|
158
|
+
class ConcurrentStack
|
|
159
|
+
{
|
|
160
|
+
public:
|
|
161
|
+
void push_back(T &&t) {
|
|
162
|
+
#ifdef YOSYS_ENABLE_THREADS
|
|
163
|
+
std::lock_guard<std::mutex> lock(mutex);
|
|
164
|
+
#endif
|
|
165
|
+
contents.push_back(std::move(t));
|
|
166
|
+
}
|
|
167
|
+
std::optional<T> try_pop_back() {
|
|
168
|
+
#ifdef YOSYS_ENABLE_THREADS
|
|
169
|
+
std::lock_guard<std::mutex> lock(mutex);
|
|
170
|
+
#endif
|
|
171
|
+
if (contents.empty())
|
|
172
|
+
return std::nullopt;
|
|
173
|
+
T result = std::move(contents.back());
|
|
174
|
+
contents.pop_back();
|
|
175
|
+
return result;
|
|
176
|
+
}
|
|
177
|
+
private:
|
|
178
|
+
#ifdef YOSYS_ENABLE_THREADS
|
|
179
|
+
std::mutex mutex;
|
|
180
|
+
#endif
|
|
181
|
+
std::vector<T> contents;
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
YOSYS_NAMESPACE_END
|
|
185
|
+
|
|
186
|
+
#endif // YOSYS_THREADING_H
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
// do not depend on any other components of yosys (except stuff like log_*).
|
|
22
22
|
|
|
23
23
|
#include "kernel/yosys.h"
|
|
24
|
+
#include <iterator>
|
|
24
25
|
|
|
25
26
|
#ifndef UTILS_H
|
|
26
27
|
#define UTILS_H
|
|
@@ -276,6 +277,16 @@ inline int ceil_log2(int x)
|
|
|
276
277
|
#endif
|
|
277
278
|
}
|
|
278
279
|
|
|
280
|
+
template <typename T>
|
|
281
|
+
auto reversed(const T& container) {
|
|
282
|
+
struct reverse_view {
|
|
283
|
+
const T& cont;
|
|
284
|
+
auto begin() const { return cont.rbegin(); }
|
|
285
|
+
auto end() const { return cont.rend(); }
|
|
286
|
+
};
|
|
287
|
+
return reverse_view{container};
|
|
288
|
+
}
|
|
289
|
+
|
|
279
290
|
YOSYS_NAMESPACE_END
|
|
280
291
|
|
|
281
292
|
#endif
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
#ifndef YOSYS_COMMON_H
|
|
21
21
|
#define YOSYS_COMMON_H
|
|
22
22
|
|
|
23
|
+
#include <array>
|
|
23
24
|
#include <map>
|
|
24
25
|
#include <set>
|
|
25
26
|
#include <tuple>
|
|
@@ -141,7 +142,12 @@
|
|
|
141
142
|
#define YOSYS_CONSTEVAL constexpr
|
|
142
143
|
#endif
|
|
143
144
|
|
|
144
|
-
#define YOSYS_ABORT(s)
|
|
145
|
+
#define YOSYS_ABORT(s) YOSYS_NAMESPACE_PREFIX log_yosys_abort_message(__FILE__, __LINE__, __FUNCTION__, s)
|
|
146
|
+
|
|
147
|
+
// This has to precede including "kernel/io.h"
|
|
148
|
+
YOSYS_NAMESPACE_BEGIN
|
|
149
|
+
[[noreturn]] void log_yosys_abort_message(std::string_view file, int line, std::string_view func, std::string_view message);
|
|
150
|
+
YOSYS_NAMESPACE_END
|
|
145
151
|
|
|
146
152
|
#include "kernel/io.h"
|
|
147
153
|
|
|
@@ -205,13 +211,13 @@ namespace RTLIL {
|
|
|
205
211
|
struct Module;
|
|
206
212
|
struct Design;
|
|
207
213
|
struct Monitor;
|
|
208
|
-
|
|
214
|
+
struct Selection;
|
|
209
215
|
struct SigChunk;
|
|
210
216
|
enum State : unsigned char;
|
|
211
217
|
|
|
212
218
|
typedef std::pair<SigSpec, SigSpec> SigSig;
|
|
213
219
|
|
|
214
|
-
|
|
220
|
+
namespace ID {}
|
|
215
221
|
}
|
|
216
222
|
|
|
217
223
|
namespace AST {
|
|
@@ -276,16 +282,6 @@ RTLIL::IdString new_id_suffix(std::string file, int line, std::string func, std:
|
|
|
276
282
|
#define NEW_ID_SUFFIX(suffix) \
|
|
277
283
|
YOSYS_NAMESPACE_PREFIX new_id_suffix(__FILE__, __LINE__, __FUNCTION__, suffix)
|
|
278
284
|
|
|
279
|
-
// Create a statically allocated IdString object, using for example ID::A or ID($add).
|
|
280
|
-
//
|
|
281
|
-
// Recipe for Converting old code that is using conversion of strings like ID::A and
|
|
282
|
-
// "$add" for creating IdStrings: Run below SED command on the .cc file and then use for
|
|
283
|
-
// example "meld foo.cc foo.cc.orig" to manually compile errors, if necessary.
|
|
284
|
-
//
|
|
285
|
-
// sed -i.orig -r 's/"\\\\([a-zA-Z0-9_]+)"/ID(\1)/g; s/"(\$[a-zA-Z0-9_]+)"/ID(\1)/g;' <filename>
|
|
286
|
-
//
|
|
287
|
-
#define ID(_id) ([]() { const char *p = "\\" #_id, *q = p[1] == '$' ? p+1 : p; \
|
|
288
|
-
static const YOSYS_NAMESPACE_PREFIX RTLIL::IdString id(q); return id; })()
|
|
289
285
|
namespace ID = RTLIL::ID;
|
|
290
286
|
|
|
291
287
|
|
|
@@ -45,35 +45,27 @@ struct FsmData
|
|
|
45
45
|
cell->parameters[ID::STATE_NUM] = RTLIL::Const(state_table.size());
|
|
46
46
|
cell->parameters[ID::STATE_NUM_LOG2] = RTLIL::Const(state_num_log2);
|
|
47
47
|
cell->parameters[ID::STATE_RST] = RTLIL::Const(reset_state);
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
std::vector<RTLIL::State> &bits_state = state_table[i].bits();
|
|
53
|
-
bits_table.insert(bits_table.end(), bits_state.begin(), bits_state.end());
|
|
54
|
-
}
|
|
48
|
+
RTLIL::Const cell_state_table;
|
|
49
|
+
for (const RTLIL::Const &c : state_table)
|
|
50
|
+
cell_state_table.append(c);
|
|
51
|
+
cell->parameters[ID::STATE_TABLE] = std::move(cell_state_table);
|
|
55
52
|
|
|
56
53
|
cell->parameters[ID::TRANS_NUM] = RTLIL::Const(transition_table.size());
|
|
57
|
-
|
|
54
|
+
RTLIL::Const cell_trans_table;
|
|
58
55
|
for (int i = 0; i < int(transition_table.size()); i++)
|
|
59
56
|
{
|
|
60
|
-
std::vector<RTLIL::State> &bits_table = cell->parameters[ID::TRANS_TABLE].bits();
|
|
61
57
|
transition_t &tr = transition_table[i];
|
|
62
58
|
|
|
63
59
|
RTLIL::Const const_state_in = RTLIL::Const(tr.state_in, state_num_log2);
|
|
64
60
|
RTLIL::Const const_state_out = RTLIL::Const(tr.state_out, state_num_log2);
|
|
65
|
-
std::vector<RTLIL::State> &bits_state_in = const_state_in.bits();
|
|
66
|
-
std::vector<RTLIL::State> &bits_state_out = const_state_out.bits();
|
|
67
|
-
|
|
68
|
-
std::vector<RTLIL::State> &bits_ctrl_in = tr.ctrl_in.bits();
|
|
69
|
-
std::vector<RTLIL::State> &bits_ctrl_out = tr.ctrl_out.bits();
|
|
70
61
|
|
|
71
62
|
// append lsb first
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
63
|
+
cell_trans_table.append(tr.ctrl_out);
|
|
64
|
+
cell_trans_table.append(const_state_out);
|
|
65
|
+
cell_trans_table.append(tr.ctrl_in);
|
|
66
|
+
cell_trans_table.append(const_state_in);
|
|
76
67
|
}
|
|
68
|
+
cell->parameters[ID::TRANS_TABLE] = std::move(cell_trans_table);
|
|
77
69
|
}
|
|
78
70
|
|
|
79
71
|
void copy_from_cell(RTLIL::Cell *cell)
|
|
@@ -95,25 +87,18 @@ struct FsmData
|
|
|
95
87
|
const RTLIL::Const &trans_table = cell->parameters[ID::TRANS_TABLE];
|
|
96
88
|
|
|
97
89
|
for (int i = 0; i < state_num; i++) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
state_code.bits().insert(state_code.bits().begin(), state_table.begin()+off_begin, state_table.begin()+off_end);
|
|
90
|
+
int off_begin = i*state_bits;
|
|
91
|
+
RTLIL::Const state_code = state_table.extract(off_begin, state_bits);
|
|
101
92
|
this->state_table.push_back(state_code);
|
|
102
93
|
}
|
|
103
94
|
|
|
104
95
|
for (int i = 0; i < trans_num; i++)
|
|
105
96
|
{
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
RTLIL::Const state_in, state_out, ctrl_in, ctrl_out;
|
|
113
|
-
ctrl_out.bits().insert(ctrl_out.bits().begin(), off_ctrl_out, off_state_out);
|
|
114
|
-
state_out.bits().insert(state_out.bits().begin(), off_state_out, off_ctrl_in);
|
|
115
|
-
ctrl_in.bits().insert(ctrl_in.bits().begin(), off_ctrl_in, off_state_in);
|
|
116
|
-
state_in.bits().insert(state_in.bits().begin(), off_state_in, off_end);
|
|
97
|
+
int base_offset = i*(num_inputs+num_outputs+2*state_num_log2);
|
|
98
|
+
RTLIL::Const ctrl_out = trans_table.extract(base_offset, num_outputs);
|
|
99
|
+
RTLIL::Const state_out = trans_table.extract(base_offset + num_outputs, state_num_log2);
|
|
100
|
+
RTLIL::Const ctrl_in = trans_table.extract(base_offset + num_outputs + state_num_log2, num_inputs);
|
|
101
|
+
RTLIL::Const state_in = trans_table.extract(base_offset + num_outputs + state_num_log2 + num_inputs, state_num_log2);
|
|
117
102
|
|
|
118
103
|
transition_t tr;
|
|
119
104
|
tr.state_in = state_in.as_int();
|
|
@@ -134,7 +119,7 @@ struct FsmData
|
|
|
134
119
|
{
|
|
135
120
|
log("-------------------------------------\n");
|
|
136
121
|
log("\n");
|
|
137
|
-
log(" Information on FSM %s (%s):\n", cell->name
|
|
122
|
+
log(" Information on FSM %s (%s):\n", cell->name, cell->parameters[ID::NAME].decode_string());
|
|
138
123
|
log("\n");
|
|
139
124
|
log(" Number of input signals: %3d\n", num_inputs);
|
|
140
125
|
log(" Number of output signals: %3d\n", num_outputs);
|
|
@@ -19,6 +19,8 @@ endmodule
|
|
|
19
19
|
|
|
20
20
|
(* blackbox *)
|
|
21
21
|
module DP16KD (...);
|
|
22
|
+
parameter CLKAMUX = "CLKA";
|
|
23
|
+
parameter CLKBMUX = "CLKB";
|
|
22
24
|
parameter DATA_WIDTH_A = 18;
|
|
23
25
|
parameter DATA_WIDTH_B = 18;
|
|
24
26
|
parameter REGMODE_A = "NOREG";
|
|
@@ -215,6 +217,8 @@ endmodule
|
|
|
215
217
|
|
|
216
218
|
(* blackbox *)
|
|
217
219
|
module PDPW16KD (...);
|
|
220
|
+
parameter CLKRMUX = "CLKR";
|
|
221
|
+
parameter CLKWMUX = "CLKW";
|
|
218
222
|
parameter DATA_WIDTH_W = 36;
|
|
219
223
|
parameter DATA_WIDTH_R = 36;
|
|
220
224
|
parameter GSR = "ENABLED";
|
|
@@ -203,7 +203,7 @@ def run(mode, task, engine_idx, engine):
|
|
|
203
203
|
match = re.match(r"^Proved output +([0-9]+) in frame +-?[0-9]+", line)
|
|
204
204
|
if match:
|
|
205
205
|
output = int(match[1])
|
|
206
|
-
prop = aiger_props[output]
|
|
206
|
+
prop = aiger_props[output] if aiger_props else None
|
|
207
207
|
if prop:
|
|
208
208
|
prop.status = "PASS"
|
|
209
209
|
task.summary.add_event(
|
|
@@ -232,7 +232,7 @@ def run(mode, task, engine_idx, engine):
|
|
|
232
232
|
disproved_count = int(match[3])
|
|
233
233
|
undecided_count = int(match[4])
|
|
234
234
|
if (
|
|
235
|
-
all_count != len(aiger_props) or
|
|
235
|
+
(aiger_props and all_count != len(aiger_props)) or
|
|
236
236
|
all_count != proved_count + disproved_count + undecided_count or
|
|
237
237
|
disproved_count != len(disproved) or
|
|
238
238
|
proved_count != len(proved)
|
|
@@ -246,6 +246,9 @@ def run(mode, task, engine_idx, engine):
|
|
|
246
246
|
else:
|
|
247
247
|
proc_status = "FAIL"
|
|
248
248
|
|
|
249
|
+
match = re.match("Error: (Does not work|Only works) for (sequential|combinational) networks.", line)
|
|
250
|
+
if match: proc_status = "ERROR"
|
|
251
|
+
|
|
249
252
|
return line
|
|
250
253
|
|
|
251
254
|
def exit_callback(retcode):
|
yowasp_yosys/share/simlib.v
CHANGED
|
@@ -31,6 +31,14 @@
|
|
|
31
31
|
*
|
|
32
32
|
*/
|
|
33
33
|
|
|
34
|
+
// If using Verilator, define SIMLIB_VERILATOR_COMPAT
|
|
35
|
+
`ifdef SIMLIB_VERILATOR_COMPAT
|
|
36
|
+
/* verilator lint_save */
|
|
37
|
+
/* verilator lint_off DEFOVERRIDE */
|
|
38
|
+
`define SIMLIB_NOCONNECT
|
|
39
|
+
/* verilator lint_restore */
|
|
40
|
+
`endif
|
|
41
|
+
|
|
34
42
|
// --------------------------------------------------------
|
|
35
43
|
//* ver 2
|
|
36
44
|
//* title Bit-wise inverter
|
|
@@ -3216,3 +3224,29 @@ module \$scopeinfo ();
|
|
|
3216
3224
|
parameter TYPE = "";
|
|
3217
3225
|
|
|
3218
3226
|
endmodule
|
|
3227
|
+
|
|
3228
|
+
// --------------------------------------------------------
|
|
3229
|
+
//* group wire
|
|
3230
|
+
`ifndef SIMLIB_NOCONNECT
|
|
3231
|
+
|
|
3232
|
+
module \$connect (A, B);
|
|
3233
|
+
|
|
3234
|
+
parameter WIDTH = 0;
|
|
3235
|
+
|
|
3236
|
+
inout [WIDTH-1:0] A;
|
|
3237
|
+
inout [WIDTH-1:0] B;
|
|
3238
|
+
|
|
3239
|
+
tran connect[WIDTH-1:0] (A, B);
|
|
3240
|
+
|
|
3241
|
+
endmodule
|
|
3242
|
+
|
|
3243
|
+
`endif
|
|
3244
|
+
// --------------------------------------------------------
|
|
3245
|
+
//* group wire
|
|
3246
|
+
module \$input_port (Y);
|
|
3247
|
+
|
|
3248
|
+
parameter WIDTH = 0;
|
|
3249
|
+
|
|
3250
|
+
inout [WIDTH-1:0] Y;
|
|
3251
|
+
|
|
3252
|
+
endmodule
|
yowasp_yosys/share/techmap.v
CHANGED
|
@@ -283,9 +283,16 @@ module _90_alu (A, B, CI, BI, X, Y, CO);
|
|
|
283
283
|
\$pos #(.A_SIGNED(A_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(Y_WIDTH)) A_conv (.A(A), .Y(A_buf));
|
|
284
284
|
\$pos #(.A_SIGNED(B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(Y_WIDTH)) B_conv (.A(B), .Y(B_buf));
|
|
285
285
|
|
|
286
|
-
|
|
286
|
+
(* force_downto *)
|
|
287
|
+
wire [Y_WIDTH-1:0] P;
|
|
288
|
+
wire [Y_WIDTH-1:0] G;
|
|
289
|
+
wire [Y_WIDTH-1:0] Cnull;
|
|
290
|
+
assign Cnull = 1'b0;
|
|
291
|
+
|
|
292
|
+
\$fa #(.WIDTH(Y_WIDTH)) fa (.A(AA), .B(BB), .C(Cnull), .X(G), .Y(P));
|
|
293
|
+
\$lcu #(.WIDTH(Y_WIDTH)) lcu (.P(P), .G(G), .CI(CI), .CO(CO));
|
|
287
294
|
|
|
288
|
-
assign X =
|
|
295
|
+
assign X = P;
|
|
289
296
|
assign Y = X ^ {CO, CI};
|
|
290
297
|
endmodule
|
|
291
298
|
|
|
@@ -647,3 +654,28 @@ module _90_lut;
|
|
|
647
654
|
endmodule
|
|
648
655
|
`endif
|
|
649
656
|
|
|
657
|
+
|
|
658
|
+
// --------------------------------------------------------
|
|
659
|
+
// Bufnorm helpers
|
|
660
|
+
// --------------------------------------------------------
|
|
661
|
+
|
|
662
|
+
(* techmap_celltype = "$connect" *)
|
|
663
|
+
module \$connect (A, B);
|
|
664
|
+
|
|
665
|
+
parameter WIDTH = 0;
|
|
666
|
+
|
|
667
|
+
inout [WIDTH-1:0] A;
|
|
668
|
+
inout [WIDTH-1:0] B;
|
|
669
|
+
|
|
670
|
+
assign A = B; // RTLIL assignments are not inherently directed
|
|
671
|
+
|
|
672
|
+
endmodule
|
|
673
|
+
|
|
674
|
+
(* techmap_celltype = "$input_port" *)
|
|
675
|
+
module \$input_port (Y);
|
|
676
|
+
|
|
677
|
+
parameter WIDTH = 0;
|
|
678
|
+
|
|
679
|
+
inout [WIDTH-1:0] Y; // This cell is just a maker, so we leave Y undriven
|
|
680
|
+
|
|
681
|
+
endmodule
|
yowasp_yosys/smtbmc.py
CHANGED
|
@@ -1875,6 +1875,11 @@ elif covermode:
|
|
|
1875
1875
|
smt_assert_antecedent("(|%s_t| s%d s%d)" % (topmod, step-1, step))
|
|
1876
1876
|
smt_assert_antecedent("(not (|%s_is| s%d))" % (topmod, step))
|
|
1877
1877
|
|
|
1878
|
+
if step < skip_steps:
|
|
1879
|
+
print_msg("Skipping step %d.." % (step))
|
|
1880
|
+
step += 1
|
|
1881
|
+
continue
|
|
1882
|
+
|
|
1878
1883
|
while "1" in cover_mask:
|
|
1879
1884
|
print_msg("Checking cover reachability in step %d.." % (step))
|
|
1880
1885
|
smt_push()
|
yowasp_yosys/yosys.wasm
CHANGED
|
Binary file
|