mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	Add "write_edif -attrprop"
Signed-off-by: Clifford Wolf <clifford@clifford.at>
This commit is contained in:
		
							parent
							
								
									257a846113
								
							
						
					
					
						commit
						115ca57647
					
				
					 1 changed files with 28 additions and 11 deletions
				
			
		| 
						 | 
				
			
			@ -106,6 +106,9 @@ struct EdifBackend : public Backend {
 | 
			
		|||
		log("        if the design contains constant nets. use \"hilomap\" to map to custom\n");
 | 
			
		||||
		log("        constant drivers first)\n");
 | 
			
		||||
		log("\n");
 | 
			
		||||
		log("    -attrprop\n");
 | 
			
		||||
		log("        create EDIF properties for cell attributes\n");
 | 
			
		||||
		log("\n");
 | 
			
		||||
		log("    -pvector {par|bra|ang}\n");
 | 
			
		||||
		log("        sets the delimiting character for module port rename clauses to\n");
 | 
			
		||||
		log("        parentheses, square brackets, or angle brackets.\n");
 | 
			
		||||
| 
						 | 
				
			
			@ -121,6 +124,7 @@ struct EdifBackend : public Backend {
 | 
			
		|||
		log_header(design, "Executing EDIF backend.\n");
 | 
			
		||||
		std::string top_module_name;
 | 
			
		||||
		bool port_rename = false;
 | 
			
		||||
		bool attr_properties = false;
 | 
			
		||||
		std::map<RTLIL::IdString, std::map<RTLIL::IdString, int>> lib_cell_ports;
 | 
			
		||||
		bool nogndvcc = false;
 | 
			
		||||
		CellTypes ct(design);
 | 
			
		||||
| 
						 | 
				
			
			@ -137,6 +141,10 @@ struct EdifBackend : public Backend {
 | 
			
		|||
				nogndvcc = true;
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
			if (args[argidx] == "-attrprop") {
 | 
			
		||||
				attr_properties = true;
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
			if (args[argidx] == "-pvector" && argidx+1 < args.size()) {
 | 
			
		||||
				std::string parray;
 | 
			
		||||
				port_rename = true;
 | 
			
		||||
| 
						 | 
				
			
			@ -332,24 +340,33 @@ struct EdifBackend : public Backend {
 | 
			
		|||
				*f << stringf("          (instance %s\n", EDIF_DEF(cell->name));
 | 
			
		||||
				*f << stringf("            (viewRef VIEW_NETLIST (cellRef %s%s))", EDIF_REF(cell->type),
 | 
			
		||||
						lib_cell_ports.count(cell->type) > 0 ? " (libraryRef LIB)" : "");
 | 
			
		||||
				for (auto &p : cell->parameters)
 | 
			
		||||
					if ((p.second.flags & RTLIL::CONST_FLAG_STRING) != 0)
 | 
			
		||||
						*f << stringf("\n            (property %s (string \"%s\"))", EDIF_DEF(p.first), p.second.decode_string().c_str());
 | 
			
		||||
					else if (p.second.bits.size() <= 32 && RTLIL::SigSpec(p.second).is_fully_def())
 | 
			
		||||
						*f << stringf("\n            (property %s (integer %u))", EDIF_DEF(p.first), p.second.as_int());
 | 
			
		||||
 | 
			
		||||
				auto add_prop = [&](IdString name, Const val) {
 | 
			
		||||
					if ((val.flags & RTLIL::CONST_FLAG_STRING) != 0)
 | 
			
		||||
						*f << stringf("\n            (property %s (string \"%s\"))", EDIF_DEF(name), val.decode_string().c_str());
 | 
			
		||||
					else if (val.bits.size() <= 32 && RTLIL::SigSpec(val).is_fully_def())
 | 
			
		||||
						*f << stringf("\n            (property %s (integer %u))", EDIF_DEF(name), val.as_int());
 | 
			
		||||
					else {
 | 
			
		||||
						std::string hex_string = "";
 | 
			
		||||
						for (size_t i = 0; i < p.second.bits.size(); i += 4) {
 | 
			
		||||
						for (size_t i = 0; i < val.bits.size(); i += 4) {
 | 
			
		||||
							int digit_value = 0;
 | 
			
		||||
							if (i+0 < p.second.bits.size() && p.second.bits.at(i+0) == RTLIL::State::S1) digit_value |= 1;
 | 
			
		||||
							if (i+1 < p.second.bits.size() && p.second.bits.at(i+1) == RTLIL::State::S1) digit_value |= 2;
 | 
			
		||||
							if (i+2 < p.second.bits.size() && p.second.bits.at(i+2) == RTLIL::State::S1) digit_value |= 4;
 | 
			
		||||
							if (i+3 < p.second.bits.size() && p.second.bits.at(i+3) == RTLIL::State::S1) digit_value |= 8;
 | 
			
		||||
							if (i+0 < val.bits.size() && val.bits.at(i+0) == RTLIL::State::S1) digit_value |= 1;
 | 
			
		||||
							if (i+1 < val.bits.size() && val.bits.at(i+1) == RTLIL::State::S1) digit_value |= 2;
 | 
			
		||||
							if (i+2 < val.bits.size() && val.bits.at(i+2) == RTLIL::State::S1) digit_value |= 4;
 | 
			
		||||
							if (i+3 < val.bits.size() && val.bits.at(i+3) == RTLIL::State::S1) digit_value |= 8;
 | 
			
		||||
							char digit_str[2] = { "0123456789abcdef"[digit_value], 0 };
 | 
			
		||||
							hex_string = std::string(digit_str) + hex_string;
 | 
			
		||||
						}
 | 
			
		||||
						*f << stringf("\n            (property %s (string \"%d'h%s\"))", EDIF_DEF(p.first), GetSize(p.second.bits), hex_string.c_str());
 | 
			
		||||
						*f << stringf("\n            (property %s (string \"%d'h%s\"))", EDIF_DEF(name), GetSize(val.bits), hex_string.c_str());
 | 
			
		||||
					}
 | 
			
		||||
				};
 | 
			
		||||
 | 
			
		||||
				for (auto &p : cell->parameters)
 | 
			
		||||
					add_prop(p.first, p.second);
 | 
			
		||||
				if (attr_properties)
 | 
			
		||||
					for (auto &p : cell->attributes)
 | 
			
		||||
						add_prop(p.first, p.second);
 | 
			
		||||
 | 
			
		||||
				*f << stringf(")\n");
 | 
			
		||||
				for (auto &p : cell->connections()) {
 | 
			
		||||
					RTLIL::SigSpec sig = sigmap(p.second);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue