mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	Merge pull request #2006 from jersey99/signed-in-rtlil-wire
Preserve 'signed'-ness of a verilog wire through RTLIL
This commit is contained in:
		
						commit
						3bffd09d64
					
				
					 7 changed files with 19 additions and 2 deletions
				
			
		|  | @ -131,6 +131,8 @@ void ILANG_BACKEND::dump_wire(std::ostream &f, std::string indent, const RTLIL:: | ||||||
| 		f << stringf("output %d ", wire->port_id); | 		f << stringf("output %d ", wire->port_id); | ||||||
| 	if (wire->port_input && wire->port_output) | 	if (wire->port_input && wire->port_output) | ||||||
| 		f << stringf("inout %d ", wire->port_id); | 		f << stringf("inout %d ", wire->port_id); | ||||||
|  | 	if (wire->is_signed) | ||||||
|  | 		f << stringf("signed "); | ||||||
| 	f << stringf("%s\n", wire->name.c_str()); | 	f << stringf("%s\n", wire->name.c_str()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -160,6 +160,8 @@ struct JsonWriter | ||||||
| 				f << stringf("          \"offset\": %d,\n", w->start_offset); | 				f << stringf("          \"offset\": %d,\n", w->start_offset); | ||||||
| 			if (w->upto) | 			if (w->upto) | ||||||
| 				f << stringf("          \"upto\": 1,\n"); | 				f << stringf("          \"upto\": 1,\n"); | ||||||
|  | 			if (w->is_signed) | ||||||
|  | 				f << stringf("          \"signed\": %d,\n", w->is_signed); | ||||||
| 			f << stringf("          \"bits\": %s\n", get_bits(w).c_str()); | 			f << stringf("          \"bits\": %s\n", get_bits(w).c_str()); | ||||||
| 			f << stringf("        }"); | 			f << stringf("        }"); | ||||||
| 			first = false; | 			first = false; | ||||||
|  | @ -227,6 +229,8 @@ struct JsonWriter | ||||||
| 				f << stringf("          \"offset\": %d,\n", w->start_offset); | 				f << stringf("          \"offset\": %d,\n", w->start_offset); | ||||||
| 			if (w->upto) | 			if (w->upto) | ||||||
| 				f << stringf("          \"upto\": 1,\n"); | 				f << stringf("          \"upto\": 1,\n"); | ||||||
|  | 			if (w->is_signed) | ||||||
|  | 				f << stringf("          \"signed\": %d,\n", w->is_signed); | ||||||
| 			f << stringf("          \"attributes\": {"); | 			f << stringf("          \"attributes\": {"); | ||||||
| 			write_parameters(w->attributes); | 			write_parameters(w->attributes); | ||||||
| 			f << stringf("\n          }\n"); | 			f << stringf("\n          }\n"); | ||||||
|  |  | ||||||
|  | @ -1065,6 +1065,7 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint) | ||||||
| 			wire->port_input = is_input; | 			wire->port_input = is_input; | ||||||
| 			wire->port_output = is_output; | 			wire->port_output = is_output; | ||||||
| 			wire->upto = range_swapped; | 			wire->upto = range_swapped; | ||||||
|  | 			wire->is_signed = is_signed; | ||||||
| 
 | 
 | ||||||
| 			for (auto &attr : attributes) { | 			for (auto &attr : attributes) { | ||||||
| 				if (attr.second->type != AST_CONSTANT) | 				if (attr.second->type != AST_CONSTANT) | ||||||
|  |  | ||||||
|  | @ -192,6 +192,9 @@ wire_options: | ||||||
| 	wire_options TOK_UPTO { | 	wire_options TOK_UPTO { | ||||||
| 		current_wire->upto = true; | 		current_wire->upto = true; | ||||||
| 	} | | 	} | | ||||||
|  | 	wire_options TOK_SIGNED { | ||||||
|  | 		current_wire->is_signed = true; | ||||||
|  | 	} | | ||||||
| 	wire_options TOK_OFFSET TOK_INT { | 	wire_options TOK_OFFSET TOK_INT { | ||||||
| 		current_wire->start_offset = $3; | 		current_wire->start_offset = $3; | ||||||
| 	} | | 	} | | ||||||
|  |  | ||||||
|  | @ -309,6 +309,12 @@ void json_import(Design *design, string &modname, JsonNode *node) | ||||||
| 					port_wire->upto = val->data_number != 0; | 					port_wire->upto = val->data_number != 0; | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
|  | 			if (port_node->data_dict.count("signed") != 0) { | ||||||
|  | 				JsonNode *val = port_node->data_dict.at("signed"); | ||||||
|  | 				if (val->type == 'N') | ||||||
|  | 					port_wire->is_signed = val->data_number != 0; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
| 			if (port_node->data_dict.count("offset") != 0) { | 			if (port_node->data_dict.count("offset") != 0) { | ||||||
| 				JsonNode *val = port_node->data_dict.at("offset"); | 				JsonNode *val = port_node->data_dict.at("offset"); | ||||||
| 				if (val->type == 'N') | 				if (val->type == 'N') | ||||||
|  | @ -573,4 +579,3 @@ struct JsonFrontend : public Frontend { | ||||||
| } JsonFrontend; | } JsonFrontend; | ||||||
| 
 | 
 | ||||||
| YOSYS_NAMESPACE_END | YOSYS_NAMESPACE_END | ||||||
| 
 |  | ||||||
|  |  | ||||||
|  | @ -1862,6 +1862,7 @@ RTLIL::Wire *RTLIL::Module::addWire(RTLIL::IdString name, const RTLIL::Wire *oth | ||||||
| 	wire->port_input = other->port_input; | 	wire->port_input = other->port_input; | ||||||
| 	wire->port_output = other->port_output; | 	wire->port_output = other->port_output; | ||||||
| 	wire->upto = other->upto; | 	wire->upto = other->upto; | ||||||
|  | 	wire->is_signed = other->is_signed; | ||||||
| 	wire->attributes = other->attributes; | 	wire->attributes = other->attributes; | ||||||
| 	return wire; | 	return wire; | ||||||
| } | } | ||||||
|  | @ -2447,6 +2448,7 @@ RTLIL::Wire::Wire() | ||||||
| 	port_input = false; | 	port_input = false; | ||||||
| 	port_output = false; | 	port_output = false; | ||||||
| 	upto = false; | 	upto = false; | ||||||
|  | 	is_signed = false; | ||||||
| 
 | 
 | ||||||
| #ifdef WITH_PYTHON | #ifdef WITH_PYTHON | ||||||
| 	RTLIL::Wire::get_all_wires()->insert(std::pair<unsigned int, RTLIL::Wire*>(hashidx_, this)); | 	RTLIL::Wire::get_all_wires()->insert(std::pair<unsigned int, RTLIL::Wire*>(hashidx_, this)); | ||||||
|  |  | ||||||
|  | @ -1368,7 +1368,7 @@ public: | ||||||
| 	RTLIL::Module *module; | 	RTLIL::Module *module; | ||||||
| 	RTLIL::IdString name; | 	RTLIL::IdString name; | ||||||
| 	int width, start_offset, port_id; | 	int width, start_offset, port_id; | ||||||
| 	bool port_input, port_output, upto; | 	bool port_input, port_output, upto, is_signed; | ||||||
| 
 | 
 | ||||||
| #ifdef WITH_PYTHON | #ifdef WITH_PYTHON | ||||||
| 	static std::map<unsigned int, RTLIL::Wire*> *get_all_wires(void); | 	static std::map<unsigned int, RTLIL::Wire*> *get_all_wires(void); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue