mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	Improved .latch support in BLIF front-end
This commit is contained in:
		
							parent
							
								
									2cc4e75914
								
							
						
					
					
						commit
						3ecb2bf067
					
				
					 1 changed files with 30 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -120,6 +120,9 @@ void parse_blif(RTLIL::Design *design, std::istream &f, std::string dff_name)
 | 
			
		|||
			{
 | 
			
		||||
				char *d = strtok(NULL, " \t\r\n");
 | 
			
		||||
				char *q = strtok(NULL, " \t\r\n");
 | 
			
		||||
				char *edge = strtok(NULL, " \t\r\n");
 | 
			
		||||
				char *clock = strtok(NULL, " \t\r\n");
 | 
			
		||||
				char *init = strtok(NULL, " \t\r\n");
 | 
			
		||||
 | 
			
		||||
				if (module->wires_.count(RTLIL::escape_id(d)) == 0)
 | 
			
		||||
					module->addWire(RTLIL::escape_id(d));
 | 
			
		||||
| 
						 | 
				
			
			@ -127,9 +130,33 @@ void parse_blif(RTLIL::Design *design, std::istream &f, std::string dff_name)
 | 
			
		|||
				if (module->wires_.count(RTLIL::escape_id(q)) == 0)
 | 
			
		||||
					module->addWire(RTLIL::escape_id(q));
 | 
			
		||||
 | 
			
		||||
				if (clock == nullptr && edge != nullptr) {
 | 
			
		||||
					init = edge;
 | 
			
		||||
					edge = nullptr;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if (init != nullptr && (init[0] == '0' || init[0] == '1'))
 | 
			
		||||
					module->wire(RTLIL::escape_id(d))->attributes["\\init"] = Const(init[0] == '1' ? 1 : 0, 1);
 | 
			
		||||
 | 
			
		||||
				if (clock == nullptr)
 | 
			
		||||
					goto no_latch_clock;
 | 
			
		||||
 | 
			
		||||
				if (module->wires_.count(RTLIL::escape_id(clock)) == 0)
 | 
			
		||||
					module->addWire(RTLIL::escape_id(clock));
 | 
			
		||||
 | 
			
		||||
				if (!strcmp(edge, "re"))
 | 
			
		||||
					module->addDff(NEW_ID, module->wire(RTLIL::escape_id(clock)),
 | 
			
		||||
							module->wire(RTLIL::escape_id(d)), module->wire(RTLIL::escape_id(q)));
 | 
			
		||||
				else if (!strcmp(edge, "fe"))
 | 
			
		||||
					module->addDff(NEW_ID, module->wire(RTLIL::escape_id(clock)),
 | 
			
		||||
							module->wire(RTLIL::escape_id(d)), module->wire(RTLIL::escape_id(q)), false);
 | 
			
		||||
				else {
 | 
			
		||||
			no_latch_clock:
 | 
			
		||||
					RTLIL::Cell *cell = module->addCell(NEW_ID, dff_name);
 | 
			
		||||
					cell->setPort("\\D", module->wires_.at(RTLIL::escape_id(d)));
 | 
			
		||||
					cell->setPort("\\Q", module->wires_.at(RTLIL::escape_id(q)));
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue