mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 13:29:12 +00:00 
			
		
		
		
	abc9_ops: -prep_lut and -write_lut to auto-generate LUT library
This commit is contained in:
		
							parent
							
								
									ab8826ae36
								
							
						
					
					
						commit
						5643c1b8c5
					
				
					 4 changed files with 200 additions and 10 deletions
				
			
		| 
						 | 
				
			
			@ -145,6 +145,11 @@ struct Abc9Pass : public ScriptPass
 | 
			
		|||
		log("        generate netlist using luts. Use the specified costs for luts with 1,\n");
 | 
			
		||||
		log("        2, 3, .. inputs.\n");
 | 
			
		||||
		log("\n");
 | 
			
		||||
		log("    -maxlut <width>\n");
 | 
			
		||||
		log("        when auto-generating the lut library, discard all luts equal to or\n");
 | 
			
		||||
		log("        greater than this size (applicable when neither -lut nor -luts is\n");
 | 
			
		||||
		log("        specified).\n");
 | 
			
		||||
		log("\n");
 | 
			
		||||
		log("    -dff\n");
 | 
			
		||||
		log("        also pass $_ABC9_FF_ cells through to ABC. modules with many clock\n");
 | 
			
		||||
		log("        domains are marked as such and automatically partitioned by ABC.\n");
 | 
			
		||||
| 
						 | 
				
			
			@ -175,6 +180,8 @@ struct Abc9Pass : public ScriptPass
 | 
			
		|||
 | 
			
		||||
	std::stringstream exe_cmd;
 | 
			
		||||
	bool dff_mode, cleanup;
 | 
			
		||||
	bool lut_mode;
 | 
			
		||||
	int maxlut;
 | 
			
		||||
	std::string box_file;
 | 
			
		||||
 | 
			
		||||
	void clear_flags() YS_OVERRIDE
 | 
			
		||||
| 
						 | 
				
			
			@ -183,6 +190,8 @@ struct Abc9Pass : public ScriptPass
 | 
			
		|||
		exe_cmd << "abc9_exe";
 | 
			
		||||
		dff_mode = false;
 | 
			
		||||
		cleanup = true;
 | 
			
		||||
		lut_mode = false;
 | 
			
		||||
		maxlut = 0;
 | 
			
		||||
		box_file.clear();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -204,9 +213,11 @@ struct Abc9Pass : public ScriptPass
 | 
			
		|||
		for (argidx = 1; argidx < args.size(); argidx++) {
 | 
			
		||||
			std::string arg = args[argidx];
 | 
			
		||||
			if ((arg == "-exe" || arg == "-script" || arg == "-D" ||
 | 
			
		||||
						/* arg == "-S" || */ arg == "-lut" || arg == "-luts" ||
 | 
			
		||||
						/*arg == "-S" ||*/ arg == "-lut" || arg == "-luts" ||
 | 
			
		||||
						/*arg == "-box" ||*/ arg == "-W") &&
 | 
			
		||||
					argidx+1 < args.size()) {
 | 
			
		||||
				if (arg == "-lut" || arg == "-luts")
 | 
			
		||||
					lut_mode = true;
 | 
			
		||||
				exe_cmd << " " << arg << " " << args[++argidx];
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -228,6 +239,10 @@ struct Abc9Pass : public ScriptPass
 | 
			
		|||
				box_file = args[++argidx];
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
			if (arg == "-maxlut" && argidx+1 < args.size()) {
 | 
			
		||||
				maxlut = atoi(args[++argidx].c_str());
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
			if (arg == "-run" && argidx+1 < args.size()) {
 | 
			
		||||
				size_t pos = args[argidx+1].find(':');
 | 
			
		||||
				if (pos == std::string::npos)
 | 
			
		||||
| 
						 | 
				
			
			@ -240,6 +255,9 @@ struct Abc9Pass : public ScriptPass
 | 
			
		|||
		}
 | 
			
		||||
		extra_args(args, argidx, design);
 | 
			
		||||
 | 
			
		||||
		if (maxlut && lut_mode)
 | 
			
		||||
			log_cmd_error("abc9 '-maxlut' option only applicable without '-lut' nor '-luts'.\n");
 | 
			
		||||
 | 
			
		||||
		log_assert(design);
 | 
			
		||||
		if (design->selected_modules().empty()) {
 | 
			
		||||
			log_warning("No modules selected for ABC9 techmapping.\n");
 | 
			
		||||
| 
						 | 
				
			
			@ -263,6 +281,10 @@ struct Abc9Pass : public ScriptPass
 | 
			
		|||
				run("abc9_ops -mark_scc -prep_delays -prep_xaiger [-dff]", "(option for -dff)");
 | 
			
		||||
			else
 | 
			
		||||
				run("abc9_ops -mark_scc -prep_delays -prep_xaiger" + std::string(dff_mode ? " -dff" : ""), "(option for -dff)");
 | 
			
		||||
			if (help_mode)
 | 
			
		||||
				run("abc9_ops -prep_lut <maxlut>", "(skip if -lut or -luts)");
 | 
			
		||||
			else if (!lut_mode)
 | 
			
		||||
				run(stringf("abc9_ops -prep_lut %d", maxlut));
 | 
			
		||||
			run("select -set abc9_holes A:abc9_holes");
 | 
			
		||||
			run("flatten -wb @abc9_holes");
 | 
			
		||||
			run("techmap @abc9_holes");
 | 
			
		||||
| 
						 | 
				
			
			@ -276,9 +298,10 @@ struct Abc9Pass : public ScriptPass
 | 
			
		|||
		if (check_label("map")) {
 | 
			
		||||
			if (help_mode) {
 | 
			
		||||
				run("foreach module in selection");
 | 
			
		||||
				run("    abc9_ops -write_lut <abc-temp-dir>/input.lut", "(skip if '-lut' or '-luts')");
 | 
			
		||||
				run("    abc9_ops -write_box [<value from -box>|(null)] <abc-temp-dir>/input.box");
 | 
			
		||||
				run("    write_xaiger -map <abc-temp-dir>/input.sym <abc-temp-dir>/input.xaig");
 | 
			
		||||
				run("    abc9_exe [options] -cwd <abc-temp-dir> -box <abc-temp-dir>/input.box");
 | 
			
		||||
				run("    abc9_exe [options] -cwd <abc-temp-dir> [-lut <abc-temp-dir>/input.lut] -box <abc-temp-dir>/input.box");
 | 
			
		||||
				run("    read_aiger -xaiger -wideports -module_name <module-name>$abc9 -map <abc-temp-dir>/input.sym <abc-temp-dir>/output.aig");
 | 
			
		||||
				run("    abc9_ops -reintegrate");
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -304,6 +327,8 @@ struct Abc9Pass : public ScriptPass
 | 
			
		|||
						tempdir_name[0] = tempdir_name[4] = '_';
 | 
			
		||||
					tempdir_name = make_temp_dir(tempdir_name);
 | 
			
		||||
 | 
			
		||||
					if (!lut_mode)
 | 
			
		||||
						run(stringf("abc9_ops -write_lut %s/input.lut", tempdir_name.c_str()));
 | 
			
		||||
					if (box_file.empty())
 | 
			
		||||
						run(stringf("abc9_ops -write_box (null) %s/input.box", tempdir_name.c_str()));
 | 
			
		||||
					else
 | 
			
		||||
| 
						 | 
				
			
			@ -319,7 +344,12 @@ struct Abc9Pass : public ScriptPass
 | 
			
		|||
							active_design->scratchpad_get_int("write_xaiger.num_inputs"),
 | 
			
		||||
							num_outputs);
 | 
			
		||||
					if (num_outputs) {
 | 
			
		||||
						run(stringf("%s -cwd %s -box %s/input.box", exe_cmd.str().c_str(), tempdir_name.c_str(), tempdir_name.c_str()));
 | 
			
		||||
						std::string abc9_exe_cmd;
 | 
			
		||||
						abc9_exe_cmd += stringf("%s -cwd %s", exe_cmd.str().c_str(), tempdir_name.c_str());
 | 
			
		||||
						if (!lut_mode)
 | 
			
		||||
							abc9_exe_cmd += stringf(" -lut %s/input.lut", tempdir_name.c_str());
 | 
			
		||||
						abc9_exe_cmd += stringf(" -box %s/input.box", tempdir_name.c_str());
 | 
			
		||||
						run(abc9_exe_cmd);
 | 
			
		||||
						run(stringf("read_aiger -xaiger -wideports -module_name %s$abc9 -map %s/input.sym %s/output.aig", log_id(mod), tempdir_name.c_str(), tempdir_name.c_str()));
 | 
			
		||||
						run("abc9_ops -reintegrate");
 | 
			
		||||
					}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -562,6 +562,56 @@ void prep_delays(RTLIL::Design *design)
 | 
			
		|||
	design->scratchpad_set_string("abc9_ops.box.flops", ss.str());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void prep_lut(RTLIL::Design *design, int maxlut)
 | 
			
		||||
{
 | 
			
		||||
	std::stringstream ss;
 | 
			
		||||
	std::vector<std::pair<int, std::string>> table;
 | 
			
		||||
	for (auto module : design->modules()) {
 | 
			
		||||
		auto it = module->attributes.find(ID(abc9_lut));
 | 
			
		||||
		if (it == module->attributes.end())
 | 
			
		||||
			continue;
 | 
			
		||||
		SigBit o;
 | 
			
		||||
		std::vector<int> specify;
 | 
			
		||||
		for (auto cell : module->cells()) {
 | 
			
		||||
			if (cell->type != ID($specify2))
 | 
			
		||||
				continue;
 | 
			
		||||
			log_assert(cell->getParam(ID(SRC_WIDTH)) == 1);
 | 
			
		||||
			log_assert(cell->getParam(ID(DST_WIDTH)) == 1);
 | 
			
		||||
			SigBit d = cell->getPort(ID(DST));
 | 
			
		||||
			if (o == SigBit())
 | 
			
		||||
				o = d;
 | 
			
		||||
			else
 | 
			
		||||
				log_assert(o == d);
 | 
			
		||||
			int rise_max = cell->getParam(ID(T_RISE_MAX)).as_int();
 | 
			
		||||
			int fall_max = cell->getParam(ID(T_FALL_MAX)).as_int();
 | 
			
		||||
			specify.push_back(std::max(rise_max,fall_max));
 | 
			
		||||
		}
 | 
			
		||||
		if (maxlut && GetSize(specify) > maxlut)
 | 
			
		||||
			continue;
 | 
			
		||||
		std::sort(specify.begin(), specify.end());
 | 
			
		||||
		ss.str("");
 | 
			
		||||
		ss << "# " << module->name.str() << std::endl;
 | 
			
		||||
		ss << GetSize(specify) << " " << it->second.as_int();
 | 
			
		||||
		for (auto i : specify)
 | 
			
		||||
			ss << " " << i;
 | 
			
		||||
		ss << std::endl;
 | 
			
		||||
		table.emplace_back(GetSize(specify), ss.str());
 | 
			
		||||
	}
 | 
			
		||||
	// ABC expects ascending size
 | 
			
		||||
	std::sort(table.begin(), table.end());
 | 
			
		||||
	ss.str("");
 | 
			
		||||
	for (auto &i : table)
 | 
			
		||||
		ss << i.second;
 | 
			
		||||
	design->scratchpad_set_string("abc9_ops.lut_library", ss.str());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void write_lut(RTLIL::Module *module, const std::string &dst) {
 | 
			
		||||
	std::ofstream ofs(dst);
 | 
			
		||||
	log_assert(ofs.is_open());
 | 
			
		||||
	ofs << module->design->scratchpad_get_string("abc9_ops.lut_library");
 | 
			
		||||
	ofs.close();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void write_box(RTLIL::Module *module, const std::string &src, const std::string &dst) {
 | 
			
		||||
	std::ofstream ofs(dst);
 | 
			
		||||
	log_assert(ofs.is_open());
 | 
			
		||||
| 
						 | 
				
			
			@ -1002,6 +1052,12 @@ struct Abc9OpsPass : public Pass {
 | 
			
		|||
		log("        compute the clock domain and initial value of each flop in the design.\n");
 | 
			
		||||
		log("        process the '$holes' module to support clock-enable functionality.\n");
 | 
			
		||||
		log("\n");
 | 
			
		||||
		log("    -prep_lut <maxlut>\n");
 | 
			
		||||
		log("        pre-compute the lut library.\n");
 | 
			
		||||
		log("\n");
 | 
			
		||||
		log("    -write_lut <dst>\n");
 | 
			
		||||
		log("        TODO.\n");
 | 
			
		||||
		log("\n");
 | 
			
		||||
		log("    -write_box (<src>|(null)) <dst>\n");
 | 
			
		||||
		log("        copy the existing box file from <src> (skip if '(null)') and append any\n");
 | 
			
		||||
		log("        new box definitions.\n");
 | 
			
		||||
| 
						 | 
				
			
			@ -1021,8 +1077,11 @@ struct Abc9OpsPass : public Pass {
 | 
			
		|||
		bool mark_scc_mode = false;
 | 
			
		||||
		bool prep_dff_mode = false;
 | 
			
		||||
		bool prep_xaiger_mode = false;
 | 
			
		||||
		bool prep_lut_mode = false;
 | 
			
		||||
		bool reintegrate_mode = false;
 | 
			
		||||
		bool dff_mode = false;
 | 
			
		||||
		std::string write_lut_dst;
 | 
			
		||||
		int maxlut = 0;
 | 
			
		||||
		std::string write_box_src, write_box_dst;
 | 
			
		||||
 | 
			
		||||
		size_t argidx;
 | 
			
		||||
| 
						 | 
				
			
			@ -1048,6 +1107,19 @@ struct Abc9OpsPass : public Pass {
 | 
			
		|||
				prep_delays_mode = true;
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
			if (arg == "-prep_lut" && argidx+1 < args.size()) {
 | 
			
		||||
				prep_lut_mode = true;
 | 
			
		||||
				maxlut = atoi(args[++argidx].c_str());
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
			if (arg == "-write_lut" && argidx+1 < args.size()) {
 | 
			
		||||
				write_lut_dst = args[++argidx];
 | 
			
		||||
				rewrite_filename(write_lut_dst);
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
			if (arg == "-maxlut" && argidx+1 < args.size()) {
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
			if (arg == "-write_box" && argidx+2 < args.size()) {
 | 
			
		||||
				write_box_src = args[++argidx];
 | 
			
		||||
				write_box_dst = args[++argidx];
 | 
			
		||||
| 
						 | 
				
			
			@ -1067,16 +1139,21 @@ struct Abc9OpsPass : public Pass {
 | 
			
		|||
		}
 | 
			
		||||
		extra_args(args, argidx, design);
 | 
			
		||||
 | 
			
		||||
		if (!(check_mode || mark_scc_mode || prep_delays_mode || prep_xaiger_mode || prep_dff_mode || !write_box_src.empty() || reintegrate_mode))
 | 
			
		||||
			log_cmd_error("At least one of -check, -mark_scc, -prep_{delays,xaiger,dff}, -write_box, -reintegrate must be specified.\n");
 | 
			
		||||
		if (!(check_mode || mark_scc_mode || prep_delays_mode || prep_xaiger_mode || prep_dff_mode || prep_lut_mode || !write_lut_dst.empty() || !write_box_dst.empty() || reintegrate_mode))
 | 
			
		||||
			log_cmd_error("At least one of -check, -mark_scc, -prep_{delays,xaiger,dff,lut}, -write_{lut,box}, -reintegrate must be specified.\n");
 | 
			
		||||
 | 
			
		||||
		if (dff_mode && !prep_xaiger_mode)
 | 
			
		||||
			log_cmd_error("'-dff' option is only relevant for -prep_xaiger.\n");
 | 
			
		||||
 | 
			
		||||
		if (maxlut && !write_lut_dst.empty())
 | 
			
		||||
			log_cmd_error("'-maxlut' option is only relevant for -prep_lut.\n");
 | 
			
		||||
 | 
			
		||||
		if (check_mode)
 | 
			
		||||
			check(design);
 | 
			
		||||
		if (prep_delays_mode)
 | 
			
		||||
			prep_delays(design);
 | 
			
		||||
		if (prep_lut_mode)
 | 
			
		||||
			prep_lut(design, maxlut);
 | 
			
		||||
 | 
			
		||||
		for (auto mod : design->selected_modules()) {
 | 
			
		||||
			if (mod->get_bool_attribute("\\abc9_holes"))
 | 
			
		||||
| 
						 | 
				
			
			@ -1090,7 +1167,9 @@ struct Abc9OpsPass : public Pass {
 | 
			
		|||
			if (!design->selected_whole_module(mod))
 | 
			
		||||
				log_error("Can't handle partially selected module %s!\n", log_id(mod));
 | 
			
		||||
 | 
			
		||||
			if (!write_box_src.empty())
 | 
			
		||||
			if (!write_lut_dst.empty())
 | 
			
		||||
				write_lut(mod, write_lut_dst);
 | 
			
		||||
			if (!write_box_dst.empty())
 | 
			
		||||
				write_box(mod, write_box_src, write_box_dst);
 | 
			
		||||
			if (mark_scc_mode)
 | 
			
		||||
				mark_scc(mod);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -162,32 +162,55 @@ module INV(
 | 
			
		|||
  assign O = !I;
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
(* abc9_lut=1 *)
 | 
			
		||||
module LUT1(output O, input I0);
 | 
			
		||||
  parameter [1:0] INIT = 0;
 | 
			
		||||
  assign O = I0 ? INIT[1] : INIT[0];
 | 
			
		||||
  specify
 | 
			
		||||
    (I0 => O) = 127;
 | 
			
		||||
  endspecify
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
(* abc9_lut=2 *)
 | 
			
		||||
module LUT2(output O, input I0, I1);
 | 
			
		||||
  parameter [3:0] INIT = 0;
 | 
			
		||||
  wire [ 1: 0] s1 = I1 ? INIT[ 3: 2] : INIT[ 1: 0];
 | 
			
		||||
  assign O = I0 ? s1[1] : s1[0];
 | 
			
		||||
  specify
 | 
			
		||||
    (I0 => O) = 238;
 | 
			
		||||
    (I1 => O) = 127;
 | 
			
		||||
  endspecify
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
(* abc9_lut=3 *)
 | 
			
		||||
module LUT3(output O, input I0, I1, I2);
 | 
			
		||||
  parameter [7:0] INIT = 0;
 | 
			
		||||
  wire [ 3: 0] s2 = I2 ? INIT[ 7: 4] : INIT[ 3: 0];
 | 
			
		||||
  wire [ 1: 0] s1 = I1 ?   s2[ 3: 2] :   s2[ 1: 0];
 | 
			
		||||
  assign O = I0 ? s1[1] : s1[0];
 | 
			
		||||
  specify
 | 
			
		||||
    (I0 => O) = 407;
 | 
			
		||||
    (I1 => O) = 238;
 | 
			
		||||
    (I2 => O) = 127;
 | 
			
		||||
  endspecify
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
(* abc9_lut=3 *)
 | 
			
		||||
module LUT4(output O, input I0, I1, I2, I3);
 | 
			
		||||
  parameter [15:0] INIT = 0;
 | 
			
		||||
  wire [ 7: 0] s3 = I3 ? INIT[15: 8] : INIT[ 7: 0];
 | 
			
		||||
  wire [ 3: 0] s2 = I2 ?   s3[ 7: 4] :   s3[ 3: 0];
 | 
			
		||||
  wire [ 1: 0] s1 = I1 ?   s2[ 3: 2] :   s2[ 1: 0];
 | 
			
		||||
  assign O = I0 ? s1[1] : s1[0];
 | 
			
		||||
  specify
 | 
			
		||||
    (I0 => O) = 472;
 | 
			
		||||
    (I1 => O) = 407;
 | 
			
		||||
    (I2 => O) = 238;
 | 
			
		||||
    (I3 => O) = 127;
 | 
			
		||||
  endspecify
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
(* abc9_lut=3 *)
 | 
			
		||||
module LUT5(output O, input I0, I1, I2, I3, I4);
 | 
			
		||||
  parameter [31:0] INIT = 0;
 | 
			
		||||
  wire [15: 0] s4 = I4 ? INIT[31:16] : INIT[15: 0];
 | 
			
		||||
| 
						 | 
				
			
			@ -195,8 +218,16 @@ module LUT5(output O, input I0, I1, I2, I3, I4);
 | 
			
		|||
  wire [ 3: 0] s2 = I2 ?   s3[ 7: 4] :   s3[ 3: 0];
 | 
			
		||||
  wire [ 1: 0] s1 = I1 ?   s2[ 3: 2] :   s2[ 1: 0];
 | 
			
		||||
  assign O = I0 ? s1[1] : s1[0];
 | 
			
		||||
  specify
 | 
			
		||||
    (I0 => O) = 631;
 | 
			
		||||
    (I1 => O) = 472;
 | 
			
		||||
    (I2 => O) = 407;
 | 
			
		||||
    (I3 => O) = 238;
 | 
			
		||||
    (I4 => O) = 127;
 | 
			
		||||
  endspecify
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
(* abc9_lut=5 *)
 | 
			
		||||
module LUT6(output O, input I0, I1, I2, I3, I4, I5);
 | 
			
		||||
  parameter [63:0] INIT = 0;
 | 
			
		||||
  wire [31: 0] s5 = I5 ? INIT[63:32] : INIT[31: 0];
 | 
			
		||||
| 
						 | 
				
			
			@ -205,6 +236,14 @@ module LUT6(output O, input I0, I1, I2, I3, I4, I5);
 | 
			
		|||
  wire [ 3: 0] s2 = I2 ?   s3[ 7: 4] :   s3[ 3: 0];
 | 
			
		||||
  wire [ 1: 0] s1 = I1 ?   s2[ 3: 2] :   s2[ 1: 0];
 | 
			
		||||
  assign O = I0 ? s1[1] : s1[0];
 | 
			
		||||
  specify
 | 
			
		||||
    (I0 => O) = 642;
 | 
			
		||||
    (I1 => O) = 631;
 | 
			
		||||
    (I2 => O) = 472;
 | 
			
		||||
    (I3 => O) = 407;
 | 
			
		||||
    (I4 => O) = 238;
 | 
			
		||||
    (I5 => O) = 127;
 | 
			
		||||
  endspecify
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
module LUT6_2(output O6, output O5, input I0, I1, I2, I3, I4, I5);
 | 
			
		||||
| 
						 | 
				
			
			@ -223,6 +262,50 @@ module LUT6_2(output O6, output O5, input I0, I1, I2, I3, I4, I5);
 | 
			
		|||
  assign O5 = I0 ? s5_1[1] : s5_1[0];
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
(* abc9_lut=10 *)
 | 
			
		||||
module $__ABC9_LUT7(output O, input I0, I1, I2, I3, I4, I5, I6);
 | 
			
		||||
  parameter [127:0] INIT = 0;
 | 
			
		||||
  wire [63: 0] s6 = I6 ? INIT[127:64] : INIT[63: 0];
 | 
			
		||||
  wire [31: 0] s5 = I5 ?    s6[63:32] :   s6[31: 0];
 | 
			
		||||
  wire [15: 0] s4 = I4 ?    s5[31:16] :   s5[15: 0];
 | 
			
		||||
  wire [ 7: 0] s3 = I3 ?    s4[15: 8] :   s4[ 7: 0];
 | 
			
		||||
  wire [ 3: 0] s2 = I2 ?    s3[ 7: 4] :   s3[ 3: 0];
 | 
			
		||||
  wire [ 1: 0] s1 = I1 ?    s2[ 3: 2] :   s2[ 1: 0];
 | 
			
		||||
  assign O = I0 ? s1[1] : s1[0];
 | 
			
		||||
  specify
 | 
			
		||||
    (I0 => O) = 1028;
 | 
			
		||||
    (I1 => O) = 1017;
 | 
			
		||||
    (I2 => O) =  858;
 | 
			
		||||
    (I3 => O) =  793;
 | 
			
		||||
    (I4 => O) =  624;
 | 
			
		||||
    (I5 => O) =  513;
 | 
			
		||||
    (I6 => O) =  464;
 | 
			
		||||
  endspecify
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
(* abc9_lut=20 *)
 | 
			
		||||
module $__ABC9_LUT8(output O, input I0, I1, I2, I3, I4, I5, I6, I7);
 | 
			
		||||
  parameter [255:0] INIT = 0;
 | 
			
		||||
  wire [127: 0] s7 = I7 ? INIT[255:128] : INIT[127: 0];
 | 
			
		||||
  wire [ 63: 0] s6 = I6 ?   s7[127:63]  :   s7[ 64: 0];
 | 
			
		||||
  wire [ 31: 0] s5 = I5 ?   s6[ 63:32]  :   s6[ 31: 0];
 | 
			
		||||
  wire [ 15: 0] s4 = I4 ?   s5[ 31:16]  :   s5[ 15: 0];
 | 
			
		||||
  wire [  7: 0] s3 = I3 ?   s4[ 15: 8]  :   s4[  7: 0];
 | 
			
		||||
  wire [  3: 0] s2 = I2 ?   s3[  7: 4]  :   s3[  3: 0];
 | 
			
		||||
  wire [  1: 0] s1 = I1 ?   s2[  3: 2]  :   s2[  1: 0];
 | 
			
		||||
  assign O = I0 ? s1[1] : s1[0];
 | 
			
		||||
  specify
 | 
			
		||||
    (I0 => O) = 1149;
 | 
			
		||||
    (I1 => O) = 1138;
 | 
			
		||||
    (I2 => O) =  979;
 | 
			
		||||
    (I3 => O) =  914;
 | 
			
		||||
    (I4 => O) =  745;
 | 
			
		||||
    (I5 => O) =  634;
 | 
			
		||||
    (I6 => O) =  585;
 | 
			
		||||
    (I7 => O) =  468;
 | 
			
		||||
  endspecify
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
module MUXCY(output O, input CI, DI, S);
 | 
			
		||||
  assign O = S ? CI : DI;
 | 
			
		||||
endmodule
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -354,7 +354,7 @@ struct SynthXilinxPass : public ScriptPass
 | 
			
		|||
			std::string read_args;
 | 
			
		||||
			if (vpr)
 | 
			
		||||
				read_args += " -D_EXPLICIT_CARRY";
 | 
			
		||||
			read_args += " -lib +/xilinx/cells_sim.v";
 | 
			
		||||
			read_args += " -lib -specify +/xilinx/cells_sim.v";
 | 
			
		||||
			run("read_verilog" + read_args);
 | 
			
		||||
 | 
			
		||||
			run("read_verilog -lib +/xilinx/cells_xtra.v");
 | 
			
		||||
| 
						 | 
				
			
			@ -627,9 +627,7 @@ struct SynthXilinxPass : public ScriptPass
 | 
			
		|||
				else
 | 
			
		||||
					abc9_opts += stringf(" -W %s", RTLIL::constpad.at(k, RTLIL::constpad.at("synth_xilinx.abc9.xc7.W")).c_str());
 | 
			
		||||
				if (nowidelut)
 | 
			
		||||
					abc9_opts += " -lut +/xilinx/abc9_xc7_nowide.lut";
 | 
			
		||||
				else
 | 
			
		||||
					abc9_opts += " -lut +/xilinx/abc9_xc7.lut";
 | 
			
		||||
					abc9_opts += stringf(" -maxlut %d", lut_size_s);
 | 
			
		||||
				if (dff_mode)
 | 
			
		||||
					abc9_opts += " -dff";
 | 
			
		||||
				run("abc9" + abc9_opts);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue