mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	Merge pull request #1241 from YosysHQ/clifford/jsonfix
Improved JSON attr/param encoding
This commit is contained in:
		
						commit
						dee8f61781
					
				
					 2 changed files with 71 additions and 36 deletions
				
			
		| 
						 | 
				
			
			@ -83,20 +83,43 @@ struct JsonWriter
 | 
			
		|||
		return str + " ]";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void write_parameter_value(const Const &value)
 | 
			
		||||
	{
 | 
			
		||||
		if ((value.flags & RTLIL::ConstFlags::CONST_FLAG_STRING) != 0) {
 | 
			
		||||
			string str = value.decode_string();
 | 
			
		||||
			int state = 0;
 | 
			
		||||
			for (char c : str) {
 | 
			
		||||
				if (state == 0) {
 | 
			
		||||
					if (c == '0' || c == '1' || c == 'x' || c == 'z')
 | 
			
		||||
						state = 0;
 | 
			
		||||
					else if (c == ' ')
 | 
			
		||||
						state = 1;
 | 
			
		||||
					else
 | 
			
		||||
						state = 2;
 | 
			
		||||
				} else if (state == 1 && c != ' ')
 | 
			
		||||
					state = 2;
 | 
			
		||||
			}
 | 
			
		||||
			if (state < 2)
 | 
			
		||||
				str += " ";
 | 
			
		||||
			f << get_string(str);
 | 
			
		||||
		} else
 | 
			
		||||
		if (GetSize(value) == 32 && value.is_fully_def()) {
 | 
			
		||||
			if ((value.flags & RTLIL::ConstFlags::CONST_FLAG_SIGNED) != 0)
 | 
			
		||||
				f << stringf("%d", value.as_int());
 | 
			
		||||
			else
 | 
			
		||||
				f << stringf("%u", value.as_int());
 | 
			
		||||
		} else {
 | 
			
		||||
			f << get_string(value.as_string());
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void write_parameters(const dict<IdString, Const> ¶meters, bool for_module=false)
 | 
			
		||||
	{
 | 
			
		||||
		bool first = true;
 | 
			
		||||
		for (auto ¶m : parameters) {
 | 
			
		||||
			f << stringf("%s\n", first ? "" : ",");
 | 
			
		||||
			f << stringf("        %s%s: ", for_module ? "" : "    ", get_name(param.first).c_str());
 | 
			
		||||
			if ((param.second.flags & RTLIL::ConstFlags::CONST_FLAG_STRING) != 0)
 | 
			
		||||
				f << get_string(param.second.decode_string());
 | 
			
		||||
			else if (GetSize(param.second.bits) > 32)
 | 
			
		||||
				f << get_string(param.second.as_string());
 | 
			
		||||
			else if ((param.second.flags & RTLIL::ConstFlags::CONST_FLAG_SIGNED) != 0)
 | 
			
		||||
				f << stringf("%d", param.second.as_int());
 | 
			
		||||
			else
 | 
			
		||||
				f << stringf("%u", param.second.as_int());
 | 
			
		||||
			write_parameter_value(param.second);
 | 
			
		||||
			first = false;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -342,12 +365,13 @@ struct JsonBackend : public Backend {
 | 
			
		|||
		log("Module and cell ports and nets can be single bit wide or vectors of multiple\n");
 | 
			
		||||
		log("bits. Each individual signal bit is assigned a unique integer. The <bit_vector>\n");
 | 
			
		||||
		log("values referenced above are vectors of this integers. Signal bits that are\n");
 | 
			
		||||
		log("connected to a constant driver are denoted as string \"0\" or \"1\" instead of\n");
 | 
			
		||||
		log("a number.\n");
 | 
			
		||||
		log("connected to a constant driver are denoted as string \"0\", \"1\", \"x\", or\n");
 | 
			
		||||
		log("\"z\" instead of a number.\n");
 | 
			
		||||
		log("\n");
 | 
			
		||||
		log("Numeric parameter and attribute values up to 32 bits are written as decimal\n");
 | 
			
		||||
		log("values. Numbers larger than that are written as string holding the binary\n");
 | 
			
		||||
		log("representation of the value.\n");
 | 
			
		||||
		log("Numeric 32-bit parameter and attribute values are written as decimal values.\n");
 | 
			
		||||
		log("Bit verctors of different sizes, or ones containing 'x' or 'z' bits, are written\n");
 | 
			
		||||
		log("as string holding the binary representation of the value. Strings are written\n");
 | 
			
		||||
		log("as strings, with an appended blank in cases of strings of the form /[01xz]* */.\n");
 | 
			
		||||
		log("\n");
 | 
			
		||||
		log("For example the following Verilog code:\n");
 | 
			
		||||
		log("\n");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue