mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	Revert "Wrap SB_LUT+SB_CARRY into $__ICE40_CARRY_WRAPPER"
This commit is contained in:
		
							parent
							
								
									f54bf1631f
								
							
						
					
					
						commit
						f9020ce2b3
					
				
					 20 changed files with 181 additions and 181 deletions
				
			
		|  | @ -19,8 +19,6 @@ Yosys 0.9 .. Yosys 0.9-dev | |||
|     - Added automatic gzip compression (based on filename extension) for backends | ||||
|     - Improve attribute and parameter encoding in JSON to avoid ambiguities between | ||||
|       bit vectors and strings containing [01xz]* | ||||
|     - Added "ice40_wrapcarry" to encapsulate SB_LUT+SB_CARRY pairs for techmapping | ||||
|     - Removed "ice40_unlut" | ||||
| 
 | ||||
| Yosys 0.8 .. Yosys 0.8-dev | ||||
| -------------------------- | ||||
|  |  | |||
|  | @ -1172,7 +1172,7 @@ void AST::process(RTLIL::Design *design, AstNode *ast, bool dump_ast1, bool dump | |||
| 
 | ||||
| 			if (design->has((*it)->str)) { | ||||
| 				RTLIL::Module *existing_mod = design->module((*it)->str); | ||||
| 				if (!nooverwrite && !overwrite && !existing_mod->get_blackbox_attribute()) { | ||||
| 				if (!nooverwrite && !overwrite && !existing_mod->get_bool_attribute("\\blackbox")) { | ||||
| 					log_file_error((*it)->filename, (*it)->linenum, "Re-definition of module `%s'!\n", (*it)->str.c_str()); | ||||
| 				} else if (nooverwrite) { | ||||
| 					log("Ignoring re-definition of module `%s' at %s:%d.\n", | ||||
|  |  | |||
|  | @ -1,5 +1,4 @@ | |||
| OBJS += passes/pmgen/ice40_dsp.o | ||||
| OBJS += passes/pmgen/ice40_wrapcarry.o | ||||
| OBJS += passes/pmgen/peepopt.o | ||||
| 
 | ||||
| # --------------------------------------
 | ||||
|  | @ -13,15 +12,6 @@ passes/pmgen/ice40_dsp_pm.h: passes/pmgen/pmgen.py passes/pmgen/ice40_dsp.pmg | |||
| 
 | ||||
| # --------------------------------------
 | ||||
| 
 | ||||
| passes/pmgen/ice40_wrapcarry.o: passes/pmgen/ice40_wrapcarry_pm.h | ||||
| EXTRA_OBJS += passes/pmgen/ice40_wrapcarry_pm.h | ||||
| .SECONDARY: passes/pmgen/ice40_wrapcarry_pm.h | ||||
| 
 | ||||
| passes/pmgen/ice40_wrapcarry_pm.h: passes/pmgen/pmgen.py passes/pmgen/ice40_wrapcarry.pmg | ||||
| 	$(P) mkdir -p passes/pmgen && python3 $< -o $@ -p ice40_wrapcarry $(filter-out $<,$^) | ||||
| 
 | ||||
| # --------------------------------------
 | ||||
| 
 | ||||
| passes/pmgen/peepopt.o: passes/pmgen/peepopt_pm.h | ||||
| EXTRA_OBJS += passes/pmgen/peepopt_pm.h | ||||
| .SECONDARY: passes/pmgen/peepopt_pm.h | ||||
|  |  | |||
|  | @ -1,90 +0,0 @@ | |||
| /*
 | ||||
|  *  yosys -- Yosys Open SYnthesis Suite | ||||
|  * | ||||
|  *  Copyright (C) 2012  Clifford Wolf <clifford@clifford.at> | ||||
|  * | ||||
|  *  Permission to use, copy, modify, and/or distribute this software for any | ||||
|  *  purpose with or without fee is hereby granted, provided that the above | ||||
|  *  copyright notice and this permission notice appear in all copies. | ||||
|  * | ||||
|  *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||||
|  *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| #include "kernel/yosys.h" | ||||
| #include "kernel/sigtools.h" | ||||
| 
 | ||||
| USING_YOSYS_NAMESPACE | ||||
| PRIVATE_NAMESPACE_BEGIN | ||||
| 
 | ||||
| #include "passes/pmgen/ice40_wrapcarry_pm.h" | ||||
| 
 | ||||
| void create_ice40_wrapcarry(ice40_wrapcarry_pm &pm) | ||||
| { | ||||
| 	auto &st = pm.st_ice40_wrapcarry; | ||||
| 
 | ||||
| #if 0 | ||||
| 	log("\n"); | ||||
| 	log("carry: %s\n", log_id(st.carry, "--")); | ||||
| 	log("lut:   %s\n", log_id(st.lut, "--")); | ||||
| #endif | ||||
| 
 | ||||
| 	log("  replacing SB_LUT + SB_CARRY with $__ICE40_CARRY_WRAPPER cell.\n"); | ||||
| 
 | ||||
| 	Cell *cell = pm.module->addCell(NEW_ID, "$__ICE40_CARRY_WRAPPER"); | ||||
| 	pm.module->swap_names(cell, st.carry); | ||||
| 
 | ||||
| 	cell->setPort("\\A", st.carry->getPort("\\I0")); | ||||
| 	cell->setPort("\\B", st.carry->getPort("\\I1")); | ||||
| 	cell->setPort("\\CI", st.carry->getPort("\\CI")); | ||||
| 	cell->setPort("\\CO", st.carry->getPort("\\CO")); | ||||
| 
 | ||||
| 	cell->setPort("\\I0", st.lut->getPort("\\I0")); | ||||
| 	cell->setPort("\\I3", st.lut->getPort("\\I3")); | ||||
| 	cell->setPort("\\O", st.lut->getPort("\\O")); | ||||
| 	cell->setParam("\\LUT", st.lut->getParam("\\LUT_INIT")); | ||||
| 
 | ||||
| 	pm.autoremove(st.carry); | ||||
| 	pm.autoremove(st.lut); | ||||
| } | ||||
| 
 | ||||
| struct Ice40WrapCarryPass : public Pass { | ||||
| 	Ice40WrapCarryPass() : Pass("ice40_wrapcarry", "iCE40: wrap carries") { } | ||||
| 	void help() YS_OVERRIDE | ||||
| 	{ | ||||
| 		//   |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
 | ||||
| 		log("\n"); | ||||
| 		log("    ice40_wrapcarry [selection]\n"); | ||||
| 		log("\n"); | ||||
| 		log("Wrap manually instantiated SB_CARRY cells, along with their associated SB_LUTs,\n"); | ||||
| 		log("into an internal $__ICE40_CARRY_WRAPPER cell for preservation across technology\n"); | ||||
| 		log("mapping."); | ||||
| 		log("\n"); | ||||
| 	} | ||||
| 	void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE | ||||
| 	{ | ||||
| 		log_header(design, "Executing ICE40_WRAPCARRY pass (wrap carries).\n"); | ||||
| 
 | ||||
| 		size_t argidx; | ||||
| 		for (argidx = 1; argidx < args.size(); argidx++) | ||||
| 		{ | ||||
| 			// if (args[argidx] == "-singleton") {
 | ||||
| 			// 	singleton_mode = true;
 | ||||
| 			// 	continue;
 | ||||
| 			// }
 | ||||
| 			break; | ||||
| 		} | ||||
| 		extra_args(args, argidx, design); | ||||
| 
 | ||||
| 		for (auto module : design->selected_modules()) | ||||
| 			ice40_wrapcarry_pm(module, module->selected_cells()).run_ice40_wrapcarry(create_ice40_wrapcarry); | ||||
| 	} | ||||
| } Ice40WrapCarryPass; | ||||
| 
 | ||||
| PRIVATE_NAMESPACE_END | ||||
|  | @ -1,11 +0,0 @@ | |||
| pattern ice40_wrapcarry | ||||
| 
 | ||||
| match carry | ||||
| 	select carry->type.in(\SB_CARRY) | ||||
| endmatch | ||||
| 
 | ||||
| match lut | ||||
| 	select lut->type.in(\SB_LUT4) | ||||
| 	index <SigSpec> port(lut, \I1) === port(carry, \I0) | ||||
| 	index <SigSpec> port(lut, \I2) === port(carry, \I1) | ||||
| endmatch | ||||
|  | @ -4,6 +4,7 @@ OBJS += techlibs/ice40/ice40_braminit.o | |||
| OBJS += techlibs/ice40/ice40_ffssr.o | ||||
| OBJS += techlibs/ice40/ice40_ffinit.o | ||||
| OBJS += techlibs/ice40/ice40_opt.o | ||||
| OBJS += techlibs/ice40/ice40_unlut.o | ||||
| 
 | ||||
| GENFILES += techlibs/ice40/brams_init1.vh | ||||
| GENFILES += techlibs/ice40/brams_init2.vh | ||||
|  |  | |||
|  | @ -44,21 +44,35 @@ module _80_ice40_alu (A, B, CI, BI, X, Y, CO); | |||
| 
 | ||||
| 	genvar i; | ||||
| 	generate for (i = 0; i < Y_WIDTH; i = i + 1) begin:slice | ||||
| 		\$__ICE40_CARRY_WRAPPER #( | ||||
| 			//    A[0]: 1010 1010 1010 1010 | ||||
| 			//    A[1]: 1100 1100 1100 1100 | ||||
| 			//    A[2]: 1111 0000 1111 0000 | ||||
| 			//    A[3]: 1111 1111 0000 0000 | ||||
| 			.LUT(16'b 0110_1001_1001_0110) | ||||
| 		) fadd ( | ||||
| `ifdef _ABC | ||||
| 		\$__ICE40_FULL_ADDER carry ( | ||||
| 			.A(AA[i]), | ||||
| 			.B(BB[i]), | ||||
| 			.CI(C[i]), | ||||
| 			.I0(1'b0), | ||||
| 			.I3(C[i]), | ||||
| 			.CO(CO[i]), | ||||
| 			.O(Y[i]) | ||||
| 		); | ||||
| `else | ||||
| 		SB_CARRY carry ( | ||||
| 			.I0(AA[i]), | ||||
| 			.I1(BB[i]), | ||||
| 			.CI(C[i]), | ||||
| 			.CO(CO[i]) | ||||
| 		); | ||||
| 		SB_LUT4 #( | ||||
| 			//         I0: 1010 1010 1010 1010 | ||||
| 			//         I1: 1100 1100 1100 1100 | ||||
| 			//         I2: 1111 0000 1111 0000 | ||||
| 			//         I3: 1111 1111 0000 0000 | ||||
| 			.LUT_INIT(16'b 0110_1001_1001_0110) | ||||
| 		) adder ( | ||||
| 			.I0(1'b0), | ||||
| 			.I1(AA[i]), | ||||
| 			.I2(BB[i]), | ||||
| 			.I3(C[i]), | ||||
| 			.O(Y[i]) | ||||
| 		); | ||||
| `endif | ||||
| 	end endgenerate | ||||
| 
 | ||||
| 	assign X = AA ^ BB; | ||||
|  |  | |||
|  | @ -62,21 +62,26 @@ module \$lut (A, Y); | |||
| endmodule | ||||
| `endif | ||||
| 
 | ||||
| `ifndef NO_ADDER | ||||
| module \$__ICE40_CARRY_WRAPPER (output CO, O, input A, B, CI, I0, I3); | ||||
|   parameter LUT = 0; | ||||
| `ifdef _ABC | ||||
| module \$__ICE40_FULL_ADDER (output CO, O, input A, B, CI); | ||||
|   SB_CARRY carry ( | ||||
|     .I0(A), | ||||
|     .I1(B), | ||||
|     .CI(CI), | ||||
|     .CO(CO) | ||||
|   ); | ||||
|   \$lut #( | ||||
|     .WIDTH(4), | ||||
|     .LUT(LUT) | ||||
|   ) lut ( | ||||
|     .A({I3,B,A,I0}), | ||||
|     .Y(O) | ||||
|   SB_LUT4 #( | ||||
|     //         I0: 1010 1010 1010 1010 | ||||
|     //         I1: 1100 1100 1100 1100 | ||||
|     //         I2: 1111 0000 1111 0000 | ||||
|     //         I3: 1111 1111 0000 0000 | ||||
|     .LUT_INIT(16'b 0110_1001_1001_0110) | ||||
|   ) adder ( | ||||
|     .I0(1'b0), | ||||
|     .I1(A), | ||||
|     .I2(B), | ||||
|     .I3(CI), | ||||
|     .O(O) | ||||
|   ); | ||||
| endmodule | ||||
| `endif | ||||
|  |  | |||
							
								
								
									
										106
									
								
								techlibs/ice40/ice40_unlut.cc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								techlibs/ice40/ice40_unlut.cc
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,106 @@ | |||
| /*
 | ||||
|  *  yosys -- Yosys Open SYnthesis Suite | ||||
|  * | ||||
|  *  Copyright (C) 2012  Clifford Wolf <clifford@clifford.at> | ||||
|  * | ||||
|  *  Permission to use, copy, modify, and/or distribute this software for any | ||||
|  *  purpose with or without fee is hereby granted, provided that the above | ||||
|  *  copyright notice and this permission notice appear in all copies. | ||||
|  * | ||||
|  *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||||
|  *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| #include "kernel/yosys.h" | ||||
| #include "kernel/sigtools.h" | ||||
| #include <stdlib.h> | ||||
| #include <stdio.h> | ||||
| 
 | ||||
| USING_YOSYS_NAMESPACE | ||||
| PRIVATE_NAMESPACE_BEGIN | ||||
| 
 | ||||
| static SigBit get_bit_or_zero(const SigSpec &sig) | ||||
| { | ||||
| 	if (GetSize(sig) == 0) | ||||
| 		return State::S0; | ||||
| 	return sig[0]; | ||||
| } | ||||
| 
 | ||||
| static void run_ice40_unlut(Module *module) | ||||
| { | ||||
| 	SigMap sigmap(module); | ||||
| 
 | ||||
| 	for (auto cell : module->selected_cells()) | ||||
| 	{ | ||||
| 		if (cell->type == "\\SB_LUT4") | ||||
| 		{ | ||||
| 			SigSpec inbits; | ||||
| 
 | ||||
| 			inbits.append(get_bit_or_zero(cell->getPort("\\I0"))); | ||||
| 			inbits.append(get_bit_or_zero(cell->getPort("\\I1"))); | ||||
| 			inbits.append(get_bit_or_zero(cell->getPort("\\I2"))); | ||||
| 			inbits.append(get_bit_or_zero(cell->getPort("\\I3"))); | ||||
| 			sigmap.apply(inbits); | ||||
| 
 | ||||
| 			log("Mapping SB_LUT4 cell %s.%s to $lut.\n", log_id(module), log_id(cell)); | ||||
| 
 | ||||
| 			cell->type ="$lut"; | ||||
| 			cell->setParam("\\WIDTH", 4); | ||||
| 			cell->setParam("\\LUT", cell->getParam("\\LUT_INIT")); | ||||
| 			cell->unsetParam("\\LUT_INIT"); | ||||
| 
 | ||||
| 			cell->setPort("\\A", SigSpec({ | ||||
| 				get_bit_or_zero(cell->getPort("\\I0")), | ||||
| 				get_bit_or_zero(cell->getPort("\\I1")), | ||||
| 				get_bit_or_zero(cell->getPort("\\I2")), | ||||
| 				get_bit_or_zero(cell->getPort("\\I3")) | ||||
| 			})); | ||||
| 			cell->setPort("\\Y", cell->getPort("\\O")[0]); | ||||
| 			cell->unsetPort("\\I0"); | ||||
| 			cell->unsetPort("\\I1"); | ||||
| 			cell->unsetPort("\\I2"); | ||||
| 			cell->unsetPort("\\I3"); | ||||
| 			cell->unsetPort("\\O"); | ||||
| 
 | ||||
| 			cell->check(); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| struct Ice40UnlutPass : public Pass { | ||||
| 	Ice40UnlutPass() : Pass("ice40_unlut", "iCE40: transform SB_LUT4 cells to $lut cells") { } | ||||
| 	void help() YS_OVERRIDE | ||||
| 	{ | ||||
| 		//   |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
 | ||||
| 		log("\n"); | ||||
| 		log("    ice40_unlut [options] [selection]\n"); | ||||
| 		log("\n"); | ||||
| 		log("This command transforms all SB_LUT4 cells to generic $lut cells.\n"); | ||||
| 		log("\n"); | ||||
| 	} | ||||
| 	void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE | ||||
| 	{ | ||||
| 		log_header(design, "Executing ICE40_UNLUT pass (convert SB_LUT4 to $lut).\n"); | ||||
| 		log_push(); | ||||
| 
 | ||||
| 		size_t argidx; | ||||
| 		for (argidx = 1; argidx < args.size(); argidx++) { | ||||
| 			// if (args[argidx] == "-???") {
 | ||||
| 			//  continue;
 | ||||
| 			// }
 | ||||
| 			break; | ||||
| 		} | ||||
| 		extra_args(args, argidx, design); | ||||
| 
 | ||||
| 		for (auto module : design->selected_modules()) | ||||
| 			run_ice40_unlut(module); | ||||
| 	} | ||||
| } Ice40UnlutPass; | ||||
| 
 | ||||
| PRIVATE_NAMESPACE_END | ||||
|  | @ -238,7 +238,7 @@ struct SynthIce40Pass : public ScriptPass | |||
| 	{ | ||||
| 		if (check_label("begin")) | ||||
| 		{ | ||||
| 			run("read_verilog -icells -lib +/ice40/cells_sim.v"); | ||||
| 			run("read_verilog -icells -lib -D_ABC +/ice40/cells_sim.v"); | ||||
| 			run(stringf("hierarchy -check %s", help_mode ? "-top <top>" : top_opt.c_str())); | ||||
| 			run("proc"); | ||||
| 		} | ||||
|  | @ -293,10 +293,8 @@ struct SynthIce40Pass : public ScriptPass | |||
| 		{ | ||||
| 			if (nocarry) | ||||
| 				run("techmap"); | ||||
| 			else { | ||||
| 				run("ice40_wrapcarry"); | ||||
| 				run("techmap -map +/techmap.v -map +/ice40/arith_map.v"); | ||||
| 			} | ||||
| 			else | ||||
| 				run("techmap -map +/techmap.v -map +/ice40/arith_map.v" + std::string(abc == "abc9" ? " -D _ABC" : "")); | ||||
| 			if (retime || help_mode) | ||||
| 				run(abc + " -dff", "(only if -retime)"); | ||||
| 			run("ice40_opt"); | ||||
|  | @ -311,7 +309,7 @@ struct SynthIce40Pass : public ScriptPass | |||
| 				run("opt_merge"); | ||||
| 				run(stringf("dff2dffe -unmap-mince %d", min_ce_use)); | ||||
| 			} | ||||
| 			run("techmap -D NO_LUT -D NO_ADDER -map +/ice40/cells_map.v"); | ||||
| 			run("techmap -D NO_LUT -map +/ice40/cells_map.v"); | ||||
| 			run("opt_expr -mux_undef"); | ||||
| 			run("simplemap"); | ||||
| 			run("ice40_ffinit"); | ||||
|  | @ -340,12 +338,13 @@ struct SynthIce40Pass : public ScriptPass | |||
| 					else | ||||
| 						wire_delay = 250; | ||||
| 					run(abc + stringf(" -W %d -lut +/ice40/abc_%s.lut -box +/ice40/abc_%s.box", wire_delay, device_opt.c_str(), device_opt.c_str()), "(skip if -noabc)"); | ||||
| 					run("techmap -D NO_LUT -D _ABC -map +/ice40/cells_map.v"); | ||||
| 				} | ||||
| 				else | ||||
| 					run(abc + " -dress -lut 4", "(skip if -noabc)"); | ||||
| 			} | ||||
| 			run("techmap -D NO_LUT -map +/ice40/cells_map.v"); | ||||
| 			run("clean"); | ||||
| 			run("ice40_unlut"); | ||||
| 			run("opt_lut -dlogic SB_CARRY:I0=2:I1=1:CI=0"); | ||||
| 		} | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,5 +1,6 @@ | |||
| read_verilog test_arith.v | ||||
| synth_ice40 | ||||
| techmap -map ../cells_sim.v | ||||
| rename test gate | ||||
| 
 | ||||
| read_verilog test_arith.v | ||||
|  | @ -7,11 +8,3 @@ rename test gold | |||
| 
 | ||||
| miter -equiv -flatten -make_outputs gold gate miter | ||||
| sat -verify -prove trigger 0 -show-ports miter | ||||
| 
 | ||||
| synth_ice40 -top gate | ||||
| 
 | ||||
| read_verilog test_arith.v | ||||
| rename test gold | ||||
| 
 | ||||
| miter -equiv -flatten -make_outputs gold gate miter | ||||
| sat -verify -prove trigger 0 -show-ports miter | ||||
|  |  | |||
							
								
								
									
										21
									
								
								tests/opt/opt_ff.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								tests/opt/opt_ff.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | |||
| module top( | ||||
|     input clk, | ||||
|     input rst, | ||||
|     input [2:0] a, | ||||
|     output [1:0] b | ||||
| ); | ||||
|     reg [2:0] b_reg; | ||||
|     initial begin | ||||
|         b_reg <= 3'b0; | ||||
|     end | ||||
| 
 | ||||
|     assign b = b_reg[1:0]; | ||||
|     always @(posedge clk or posedge rst) begin | ||||
|         if(rst) begin | ||||
|             b_reg <= 3'b0; | ||||
|         end else begin | ||||
|             b_reg <= a; | ||||
|         end | ||||
|     end | ||||
| endmodule | ||||
| 
 | ||||
							
								
								
									
										3
									
								
								tests/opt/opt_ff.ys
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								tests/opt/opt_ff.ys
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,3 @@ | |||
| read_verilog opt_ff.v | ||||
| synth_ice40 | ||||
| ice40_unlut | ||||
|  | @ -1,4 +1,4 @@ | |||
| read_verilog opt_rmdff_sat.v | ||||
| read_verilog opt_ff_sat.v | ||||
| prep -flatten | ||||
| opt_rmdff -sat | ||||
| synth | ||||
|  | @ -1,2 +1,4 @@ | |||
| read_verilog opt_lut.v | ||||
| equiv_opt -map +/ice40/cells_sim.v -assert synth_ice40 | ||||
| synth_ice40 | ||||
| ice40_unlut | ||||
| equiv_opt -map +/ice40/cells_sim.v -assert opt_lut -dlogic SB_CARRY:I0=1:I1=2:CI=3 | ||||
|  |  | |||
|  | @ -36,6 +36,7 @@ design -save gold | |||
| opt_expr | ||||
| wreduce | ||||
| 
 | ||||
| dump | ||||
| select -assert-count 1 t:$sub r:A_WIDTH=4 r:B_WIDTH=4 r:Y_WIDTH=5 %i %i %i | ||||
| 
 | ||||
| design -stash gate | ||||
|  | @ -45,35 +46,3 @@ design -import gate -as gate | |||
| 
 | ||||
| miter -equiv -flatten -make_assert -make_outputs gold gate miter | ||||
| sat -verify -prove-asserts -show-ports miter | ||||
| 
 | ||||
| ########## | ||||
| 
 | ||||
| # Testcase from: https://github.com/YosysHQ/yosys/commit/25680f6a078bb32f157bd580705656496717bafb | ||||
| design -reset | ||||
| read_verilog <<EOT | ||||
| module top( | ||||
|     input clk, | ||||
|     input rst, | ||||
|     input [2:0] a, | ||||
|     output [1:0] b | ||||
| ); | ||||
|     reg [2:0] b_reg; | ||||
|     initial begin | ||||
|         b_reg <= 3'b0; | ||||
|     end | ||||
| 
 | ||||
|     assign b = b_reg[1:0]; | ||||
|     always @(posedge clk or posedge rst) begin | ||||
|         if(rst) begin | ||||
|             b_reg <= 3'b0; | ||||
|         end else begin | ||||
|             b_reg <= a; | ||||
|         end | ||||
|     end | ||||
| endmodule | ||||
| EOT | ||||
| 
 | ||||
| proc | ||||
| wreduce | ||||
| 
 | ||||
| select -assert-count 1 t:$adff r:ARST_VALUE=2'b00 %i | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue