diff options
| author | Eddie Hung <eddie@fpgeh.com> | 2019-07-10 16:05:41 -0700 | 
|---|---|---|
| committer | Eddie Hung <eddie@fpgeh.com> | 2019-07-10 16:05:41 -0700 | 
| commit | 052060f10906ca859d2313b86800e110bd34b79f (patch) | |
| tree | 356107e4270feb84046b984a98e0874f1436b2d9 /backends/aiger | |
| parent | 35fd9b04731d3bc944e1471b96668ef0cf7b51f1 (diff) | |
| parent | bb2144ae733f1a2c5e629a8251bfbdcc15559aa4 (diff) | |
| download | yosys-052060f10906ca859d2313b86800e110bd34b79f.tar.gz yosys-052060f10906ca859d2313b86800e110bd34b79f.tar.bz2 yosys-052060f10906ca859d2313b86800e110bd34b79f.zip | |
Merge remote-tracking branch 'origin/master' into xaig_dff
Diffstat (limited to 'backends/aiger')
| -rw-r--r-- | backends/aiger/xaiger.cc | 30 | 
1 files changed, 20 insertions, 10 deletions
| diff --git a/backends/aiger/xaiger.cc b/backends/aiger/xaiger.cc index 632a5c8d5..a1085addf 100644 --- a/backends/aiger/xaiger.cc +++ b/backends/aiger/xaiger.cc @@ -21,13 +21,15 @@  // https://stackoverflow.com/a/46137633  #ifdef _MSC_VER  #include <stdlib.h> -#define __builtin_bswap32 _byteswap_ulong +#define bswap32 _byteswap_ulong  #elif defined(__APPLE__)  #include <libkern/OSByteOrder.h> -#define __builtin_bswap32 OSSwapInt32 -#elif !defined(__GNUC__) +#define bswap32 OSSwapInt32 +#elif defined(__GNUC__) +#define bswap32 __builtin_bswap32 +#else  #include <cstdint> -inline uint32_t __builtin_bswap32(uint32_t x) +inline static uint32_t bswap32(uint32_t x)  {  	// https://stackoverflow.com/a/27796212  	register uint32_t value = number_to_be_reversed; @@ -145,6 +147,7 @@ struct XAigerWriter  	{  		pool<SigBit> undriven_bits;  		pool<SigBit> unused_bits; +		pool<SigBit> keep_bits;  		// promote public wires  		for (auto wire : module->wires()) @@ -183,6 +186,9 @@ struct XAigerWriter  					unused_bits.insert(bit);  				} +				if (keep) +					keep_bits.insert(bit); +  				if (wire->port_input || keep) {  					if (bit != wirebit)  						alias_map[bit] = wirebit; @@ -260,7 +266,7 @@ struct XAigerWriter  				continue;  			} -			RTLIL::Module* inst_module = !holes_mode ? module->design->module(cell->type) : nullptr; +			RTLIL::Module* inst_module = module->design->module(cell->type);  			if (inst_module && inst_module->attributes.count("\\abc_box_id")) {  				abc_box_seen = true; @@ -319,10 +325,11 @@ struct XAigerWriter  				}  			}  			else { +				bool cell_known = cell->known();  				for (const auto &c : cell->connections()) {  					if (c.second.is_fully_const()) continue; -					auto is_input = cell->input(c.first); -					auto is_output = cell->output(c.first); +					auto is_input = !cell_known || cell->input(c.first); +					auto is_output = !cell_known || cell->output(c.first);  					if (!is_input && !is_output)  						log_error("Connection '%s' on cell '%s' (type '%s') not recognised!\n", log_id(c.first), log_id(cell), log_id(cell->type)); @@ -330,12 +337,15 @@ struct XAigerWriter  						for (auto b : c.second.bits()) {  							Wire *w = b.wire;  							if (!w) continue; -							if (!w->port_output) { +							if (!w->port_output || !cell_known) {  								SigBit I = sigmap(b);  								if (I != b)  									alias_map[b] = I;  								output_bits.insert(b);  								unused_bits.erase(b); + +								if (!cell_known) +									keep_bits.insert(b);  							}  						}  					} @@ -488,7 +498,7 @@ struct XAigerWriter  							auto jt = input_bits.find(b);  							if (jt != input_bits.end()) { -								log_assert(b.wire->attributes.count("\\keep")); +								log_assert(keep_bits.count(O));  								input_bits.erase(b);  							}  						} @@ -508,7 +518,7 @@ struct XAigerWriter  			// with $inout.out suffix, make it a PO driven by the existing inout, and  			// inherit existing inout's drivers  			if ((wire->port_input && wire->port_output && !undriven_bits.count(bit)) -					|| wire->attributes.count("\\keep")) { +					|| keep_bits.count(bit)) {  				RTLIL::IdString wire_name = wire->name.str() + "$inout.out";  				RTLIL::Wire *new_wire = module->wire(wire_name);  				if (!new_wire) | 
