mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	kernel: SigSpec copies to not trigger pack()
This commit is contained in:
		
							parent
							
								
									4555b5b819
								
							
						
					
					
						commit
						940640ac44
					
				
					 2 changed files with 5 additions and 34 deletions
				
			
		| 
						 | 
					@ -2709,10 +2709,7 @@ RTLIL::SigChunk::SigChunk(const RTLIL::SigBit &bit)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RTLIL::SigChunk::SigChunk(const RTLIL::SigChunk &sigchunk)
 | 
					RTLIL::SigChunk::SigChunk(const RTLIL::SigChunk &sigchunk)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	wire = sigchunk.wire;
 | 
						*this = sigchunk;
 | 
				
			||||||
	data = sigchunk.data;
 | 
					 | 
				
			||||||
	width = sigchunk.width;
 | 
					 | 
				
			||||||
	offset = sigchunk.offset;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RTLIL::SigChunk RTLIL::SigChunk::extract(int offset, int length) const
 | 
					RTLIL::SigChunk RTLIL::SigChunk::extract(int offset, int length) const
 | 
				
			||||||
| 
						 | 
					@ -2785,40 +2782,14 @@ RTLIL::SigSpec::SigSpec(std::initializer_list<RTLIL::SigSpec> parts)
 | 
				
			||||||
		append(*it--);
 | 
							append(*it--);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const RTLIL::SigSpec &RTLIL::SigSpec::operator=(const RTLIL::SigSpec &other)
 | 
					RTLIL::SigSpec &RTLIL::SigSpec::operator=(const RTLIL::SigSpec &other)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	cover("kernel.rtlil.sigspec.assign");
 | 
						cover("kernel.rtlil.sigspec.assign");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	width_ = other.width_;
 | 
						width_ = other.width_;
 | 
				
			||||||
	hash_ = other.hash_;
 | 
						hash_ = other.hash_;
 | 
				
			||||||
	chunks_ = other.chunks_;
 | 
						chunks_ = other.chunks_;
 | 
				
			||||||
	bits_.clear();
 | 
						bits_ = other.bits_;
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (!other.bits_.empty())
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		RTLIL::SigChunk *last = NULL;
 | 
					 | 
				
			||||||
		int last_end_offset = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		for (auto &bit : other.bits_) {
 | 
					 | 
				
			||||||
			if (last && bit.wire == last->wire) {
 | 
					 | 
				
			||||||
				if (bit.wire == NULL) {
 | 
					 | 
				
			||||||
					last->data.push_back(bit.data);
 | 
					 | 
				
			||||||
					last->width++;
 | 
					 | 
				
			||||||
					continue;
 | 
					 | 
				
			||||||
				} else if (last_end_offset == bit.offset) {
 | 
					 | 
				
			||||||
					last_end_offset++;
 | 
					 | 
				
			||||||
					last->width++;
 | 
					 | 
				
			||||||
					continue;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			chunks_.push_back(bit);
 | 
					 | 
				
			||||||
			last = &chunks_.back();
 | 
					 | 
				
			||||||
			last_end_offset = bit.offset + 1;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		check();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return *this;
 | 
						return *this;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3009,7 +2980,7 @@ void RTLIL::SigSpec::unpack() const
 | 
				
			||||||
	that->bits_.reserve(that->width_);
 | 
						that->bits_.reserve(that->width_);
 | 
				
			||||||
	for (auto &c : that->chunks_)
 | 
						for (auto &c : that->chunks_)
 | 
				
			||||||
		for (int i = 0; i < c.width; i++)
 | 
							for (int i = 0; i < c.width; i++)
 | 
				
			||||||
			that->bits_.push_back(RTLIL::SigBit(c, i));
 | 
								that->bits_.emplace_back(c, i);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	that->chunks_.clear();
 | 
						that->chunks_.clear();
 | 
				
			||||||
	that->hash_ = 0;
 | 
						that->hash_ = 0;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -766,7 +766,7 @@ public:
 | 
				
			||||||
	SigSpec();
 | 
						SigSpec();
 | 
				
			||||||
	SigSpec(const RTLIL::SigSpec &other);
 | 
						SigSpec(const RTLIL::SigSpec &other);
 | 
				
			||||||
	SigSpec(std::initializer_list<RTLIL::SigSpec> parts);
 | 
						SigSpec(std::initializer_list<RTLIL::SigSpec> parts);
 | 
				
			||||||
	const RTLIL::SigSpec &operator=(const RTLIL::SigSpec &other);
 | 
						RTLIL::SigSpec &operator=(const RTLIL::SigSpec &other);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	SigSpec(const RTLIL::Const &value);
 | 
						SigSpec(const RTLIL::Const &value);
 | 
				
			||||||
	SigSpec(const RTLIL::SigChunk &chunk);
 | 
						SigSpec(const RTLIL::SigChunk &chunk);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue