mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	firrtl: Accept techmapped cell types in FIRRTL backend.
This commit is contained in:
		
							parent
							
								
									07eecff9cc
								
							
						
					
					
						commit
						049e4caceb
					
				
					 1 changed files with 12 additions and 10 deletions
				
			
		| 
						 | 
				
			
			@ -446,7 +446,7 @@ struct FirrtlWorker
 | 
			
		|||
			string y_id = make_id(cell->name);
 | 
			
		||||
			std::string cellFileinfo = getFileinfo(cell);
 | 
			
		||||
 | 
			
		||||
			if (cell->type.in(ID($not), ID($logic_not), ID($neg), ID($reduce_and), ID($reduce_or), ID($reduce_xor), ID($reduce_bool), ID($reduce_xnor)))
 | 
			
		||||
			if (cell->type.in(ID($not), ID($logic_not), ID($_NOT_), ID($neg), ID($reduce_and), ID($reduce_or), ID($reduce_xor), ID($reduce_bool), ID($reduce_xnor)))
 | 
			
		||||
			{
 | 
			
		||||
				string a_expr = make_expr(cell->getPort(ID::A));
 | 
			
		||||
				wire_decls.push_back(stringf("    wire %s: UInt<%d> %s\n", y_id.c_str(), y_width, cellFileinfo.c_str()));
 | 
			
		||||
| 
						 | 
				
			
			@ -462,7 +462,7 @@ struct FirrtlWorker
 | 
			
		|||
 | 
			
		||||
				// Assume the FIRRTL width is a single bit.
 | 
			
		||||
				firrtl_width = 1;
 | 
			
		||||
				if (cell->type == ID($not)) primop = "not";
 | 
			
		||||
				if (cell->type.in(ID($not), ID($_NOT_))) primop = "not";
 | 
			
		||||
				else if (cell->type == ID($neg)) {
 | 
			
		||||
					primop = "neg";
 | 
			
		||||
					firrtl_is_signed = true;	// Result of "neg" is signed (an SInt).
 | 
			
		||||
| 
						 | 
				
			
			@ -494,7 +494,7 @@ struct FirrtlWorker
 | 
			
		|||
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
			if (cell->type.in(ID($add), ID($sub), ID($mul), ID($div), ID($mod), ID($xor), ID($xnor), ID($and), ID($or), ID($eq), ID($eqx),
 | 
			
		||||
			if (cell->type.in(ID($add), ID($sub), ID($mul), ID($div), ID($mod), ID($xor), ID($_XOR_), ID($xnor), ID($and), ID($_AND_), ID($or), ID($_OR_), ID($eq), ID($eqx),
 | 
			
		||||
                                        ID($gt), ID($ge), ID($lt), ID($le), ID($ne), ID($nex), ID($shr), ID($sshr), ID($sshl), ID($shl),
 | 
			
		||||
                                        ID($logic_and), ID($logic_or), ID($pow)))
 | 
			
		||||
			{
 | 
			
		||||
| 
						 | 
				
			
			@ -524,7 +524,7 @@ struct FirrtlWorker
 | 
			
		|||
 | 
			
		||||
				// For the arithmetic ops, expand operand widths to result widths befor performing the operation.
 | 
			
		||||
				// This corresponds (according to iverilog) to what verilog compilers implement.
 | 
			
		||||
				if (cell->type.in(ID($add), ID($sub), ID($mul), ID($div), ID($mod), ID($xor), ID($xnor), ID($and), ID($or)))
 | 
			
		||||
				if (cell->type.in(ID($add), ID($sub), ID($mul), ID($div), ID($mod), ID($xor), ID($_XOR_), ID($xnor), ID($and), ID($_AND_), ID($or), ID($_OR_)))
 | 
			
		||||
				{
 | 
			
		||||
					if (a_width < y_width) {
 | 
			
		||||
						a_expr = stringf("pad(%s, %d)", a_expr.c_str(), y_width);
 | 
			
		||||
| 
						 | 
				
			
			@ -560,17 +560,17 @@ struct FirrtlWorker
 | 
			
		|||
				} else if (cell->type == ID($mod)) {
 | 
			
		||||
					primop = "rem";
 | 
			
		||||
					firrtl_width = min(a_width, b_width);
 | 
			
		||||
				} else if (cell->type == ID($and)) {
 | 
			
		||||
				} else if (cell->type.in(ID($and), ID($_AND_))) {
 | 
			
		||||
					primop = "and";
 | 
			
		||||
					always_uint = true;
 | 
			
		||||
					firrtl_width = max(a_width, b_width);
 | 
			
		||||
				}
 | 
			
		||||
				else if (cell->type == ID($or) ) {
 | 
			
		||||
				else if (cell->type.in(ID($or), ID($_OR_))) {
 | 
			
		||||
					primop =  "or";
 | 
			
		||||
					always_uint = true;
 | 
			
		||||
					firrtl_width = max(a_width, b_width);
 | 
			
		||||
				}
 | 
			
		||||
				else if (cell->type == ID($xor)) {
 | 
			
		||||
				else if (cell->type.in(ID($xor), ID($_XOR_))) {
 | 
			
		||||
					primop = "xor";
 | 
			
		||||
					always_uint = true;
 | 
			
		||||
					firrtl_width = max(a_width, b_width);
 | 
			
		||||
| 
						 | 
				
			
			@ -694,7 +694,8 @@ struct FirrtlWorker
 | 
			
		|||
					}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if (!cell->parameters.at(ID::B_SIGNED).as_bool()) {
 | 
			
		||||
				auto it = cell->parameters.find(ID::B_SIGNED);
 | 
			
		||||
				if (it == cell->parameters.end() || !it->second.as_bool()) {
 | 
			
		||||
					b_expr = "asUInt(" + b_expr + ")";
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -723,9 +724,10 @@ struct FirrtlWorker
 | 
			
		|||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (cell->type.in(ID($mux)))
 | 
			
		||||
			if (cell->type.in(ID($mux), ID($_MUX_)))
 | 
			
		||||
			{
 | 
			
		||||
				int width = cell->parameters.at(ID::WIDTH).as_int();
 | 
			
		||||
				auto it = cell->parameters.find(ID::WIDTH);
 | 
			
		||||
				int width = it == cell->parameters.end()? 1 : it->second.as_int();
 | 
			
		||||
				string a_expr = make_expr(cell->getPort(ID::A));
 | 
			
		||||
				string b_expr = make_expr(cell->getPort(ID::B));
 | 
			
		||||
				string s_expr = make_expr(cell->getPort(ID::S));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue