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.
Files changed (35) hide show
  1. yowasp_yosys/share/gowin/cells_sim.v +0 -8
  2. yowasp_yosys/share/gowin/cells_xtra_gw1n.v +7 -0
  3. yowasp_yosys/share/gowin/cells_xtra_gw2a.v +12 -0
  4. yowasp_yosys/share/gowin/cells_xtra_gw5a.v +84 -0
  5. yowasp_yosys/share/include/backends/rtlil/rtlil_backend.h +1 -0
  6. yowasp_yosys/share/include/frontends/ast/ast.h +6 -1
  7. yowasp_yosys/share/include/kernel/bitpattern.h +50 -1
  8. yowasp_yosys/share/include/kernel/celltypes.h +19 -9
  9. yowasp_yosys/share/include/kernel/consteval.h +2 -2
  10. yowasp_yosys/share/include/kernel/constids.inc +859 -137
  11. yowasp_yosys/share/include/kernel/drivertools.h +6 -5
  12. yowasp_yosys/share/include/kernel/ffinit.h +5 -5
  13. yowasp_yosys/share/include/kernel/hashlib.h +88 -38
  14. yowasp_yosys/share/include/kernel/io.h +17 -2
  15. yowasp_yosys/share/include/kernel/log.h +102 -31
  16. yowasp_yosys/share/include/kernel/macc.h +1 -1
  17. yowasp_yosys/share/include/kernel/mem.h +4 -2
  18. yowasp_yosys/share/include/kernel/rtlil.h +268 -61
  19. yowasp_yosys/share/include/kernel/satgen.h +1 -1
  20. yowasp_yosys/share/include/kernel/threading.h +186 -0
  21. yowasp_yosys/share/include/kernel/utils.h +11 -0
  22. yowasp_yosys/share/include/kernel/yosys_common.h +9 -13
  23. yowasp_yosys/share/include/passes/fsm/fsmdata.h +18 -33
  24. yowasp_yosys/share/include/passes/techmap/libparse.h +1 -1
  25. yowasp_yosys/share/lattice/cells_bb_ecp5.v +4 -0
  26. yowasp_yosys/share/python3/sby_engine_abc.py +5 -2
  27. yowasp_yosys/share/simlib.v +34 -0
  28. yowasp_yosys/share/techmap.v +34 -2
  29. yowasp_yosys/smtbmc.py +5 -0
  30. yowasp_yosys/yosys.wasm +0 -0
  31. {yowasp_yosys-0.56.0.141.post974.dev0.dist-info → yowasp_yosys-0.58.0.0.post1010.dist-info}/METADATA +1 -1
  32. {yowasp_yosys-0.56.0.141.post974.dev0.dist-info → yowasp_yosys-0.58.0.0.post1010.dist-info}/RECORD +35 -34
  33. {yowasp_yosys-0.56.0.141.post974.dev0.dist-info → yowasp_yosys-0.58.0.0.post1010.dist-info}/WHEEL +0 -0
  34. {yowasp_yosys-0.56.0.141.post974.dev0.dist-info → yowasp_yosys-0.58.0.0.post1010.dist-info}/entry_points.txt +0 -0
  35. {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) abort()
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
- struct Selection;
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
- namespace ID {}
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
- cell->parameters[ID::STATE_TABLE] = RTLIL::Const();
49
-
50
- for (int i = 0; i < int(state_table.size()); i++) {
51
- std::vector<RTLIL::State> &bits_table = cell->parameters[ID::STATE_TABLE].bits();
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
- cell->parameters[ID::TRANS_TABLE] = RTLIL::Const();
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
- bits_table.insert(bits_table.end(), bits_ctrl_out.begin(), bits_ctrl_out.end());
73
- bits_table.insert(bits_table.end(), bits_state_out.begin(), bits_state_out.end());
74
- bits_table.insert(bits_table.end(), bits_ctrl_in.begin(), bits_ctrl_in.end());
75
- bits_table.insert(bits_table.end(), bits_state_in.begin(), bits_state_in.end());
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
- RTLIL::Const state_code;
99
- int off_begin = i*state_bits, off_end = off_begin + state_bits;
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
- auto off_ctrl_out = trans_table.begin() + i*(num_inputs+num_outputs+2*state_num_log2);
107
- auto off_state_out = off_ctrl_out + num_outputs;
108
- auto off_ctrl_in = off_state_out + state_num_log2;
109
- auto off_state_in = off_ctrl_in + num_inputs;
110
- auto off_end = off_state_in + state_num_log2;
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.c_str(), cell->parameters[ID::NAME].decode_string().c_str());
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);
@@ -204,7 +204,7 @@ namespace Yosys
204
204
  }
205
205
  ast = shared_ast.get();
206
206
  if (!ast) {
207
- log_error("No entries found in liberty file `%s'.\n", fname.c_str());
207
+ log_error("No entries found in liberty file `%s'.\n", fname);
208
208
  }
209
209
  }
210
210
  #endif
@@ -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):
@@ -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
@@ -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
- \$lcu #(.WIDTH(Y_WIDTH)) lcu (.P(X), .G(AA & BB), .CI(CI), .CO(CO));
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 = AA ^ BB;
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: yowasp-yosys
3
- Version: 0.56.0.141.post974.dev0
3
+ Version: 0.58.0.0.post1010
4
4
  Summary: Yosys Open SYnthesis Suite
5
5
  Author-email: Catherine <whitequark@whitequark.org>
6
6
  License-Expression: ISC