From b2ad781b0764971d4b27e231a6d773cb77dd9504 Mon Sep 17 00:00:00 2001
From: "N. Engelhardt" <nak@symbioticeda.com>
Date: Fri, 3 Jan 2020 14:11:41 +0100
Subject: share codepath for scratchpad argument handling with command
 arguments

---
 passes/techmap/abc9.cc | 124 +++++++++++++++++++++++++++++++++----------------
 1 file changed, 84 insertions(+), 40 deletions(-)

(limited to 'passes')

diff --git a/passes/techmap/abc9.cc b/passes/techmap/abc9.cc
index dd73d53a9..913b299d2 100644
--- a/passes/techmap/abc9.cc
+++ b/passes/techmap/abc9.cc
@@ -332,10 +332,6 @@ void abc9_module(RTLIL::Design *design, RTLIL::Module *current_module, std::stri
 					abc9_script += script_file[i];
 		} else
 			abc9_script += stringf("source %s", script_file.c_str());
-	} else if (design->scratchpad.count("abc9.script")) {
-		abc9_script += design->scratchpad_get_string("abc9.script");
-	} else if (design->scratchpad.count("abc9.scriptfile")) {
-		abc9_script += stringf("source %s", design->scratchpad_get_string("abc9.scriptfile").c_str());
 	} else if (!lut_costs.empty() || !lut_file.empty()) {
 		//bool all_luts_cost_same = true;
 		//for (int this_cost : lut_costs)
@@ -956,6 +952,42 @@ struct Abc9Pass : public Pass {
 #endif
 #endif
 
+		// get arguments from scratchpad first, then override by command arguments
+		std::string lut_arg, luts_arg;
+		if (design->scratchpad.count("abc9.script")) {
+			script_file = design->scratchpad_get_string("abc9.script");
+		}
+		if (design->scratchpad.count("abc9.D")) {
+			delay_target = "-D " + design->scratchpad_get_string("abc9.D");
+		}
+		if (design->scratchpad.count("abc9.lut")) {
+			lut_arg = design->scratchpad_get_string("abc9.lut");
+		}
+		if (design->scratchpad.count("abc9.luts")) {
+			luts_arg = design->scratchpad_get_string("abc9.luts");
+		}
+		if (design->scratchpad.count("abc9.fast")) {
+			fast_mode = design->scratchpad_get_bool("abc9.fast", false /* default value if not bool-like */);
+		}
+		if (design->scratchpad.count("abc9.nocleanup")) {
+			cleanup = !design->scratchpad_get_bool("abc9.nocleanup", false /* default value if not bool-like */);
+		}
+		if (design->scratchpad.count("abc9.showtmp")) {
+			show_tempdir = design->scratchpad_get_bool("abc9.showtmp", false /* default value if not bool-like */);
+		}
+		if (design->scratchpad.count("abc9.markgroups")) {
+			markgroups = design->scratchpad_get_bool("abc9.markgroups", false /* default value if not bool-like */);
+		}
+		if (design->scratchpad.count("abc9.box")) {
+			box_file = design->scratchpad_get_string("abc9.box");
+		}
+		if (design->scratchpad.count("abc9.W")) {
+			wire_delay = "-W " + design->scratchpad_get_string("abc9.W");
+		}
+		if (design->scratchpad.count("abc9.nomfs")) {
+			nomfs = design->scratchpad_get_bool("abc9.nomfs", false /* default value if not bool-like */);
+		}
+
 		size_t argidx;
 		char pwd [PATH_MAX];
 		if (!getcwd(pwd, sizeof(pwd))) {
@@ -984,45 +1016,11 @@ struct Abc9Pass : public Pass {
 			//	continue;
 			//}
 			if (arg == "-lut" && argidx+1 < args.size()) {
-				string arg = args[++argidx];
-				if (arg.find_first_not_of("0123456789:") == std::string::npos) {
-					size_t pos = arg.find_first_of(':');
-					int lut_mode = 0, lut_mode2 = 0;
-					if (pos != string::npos) {
-						lut_mode = atoi(arg.substr(0, pos).c_str());
-						lut_mode2 = atoi(arg.substr(pos+1).c_str());
-					} else {
-						lut_mode = atoi(arg.c_str());
-						lut_mode2 = lut_mode;
-					}
-					lut_costs.clear();
-					for (int i = 0; i < lut_mode; i++)
-						lut_costs.push_back(1);
-					for (int i = lut_mode; i < lut_mode2; i++)
-						lut_costs.push_back(2 << (i - lut_mode));
-				}
-				else {
-					lut_file = arg;
-					rewrite_filename(lut_file);
-					if (!lut_file.empty() && !is_absolute_path(lut_file) && lut_file[0] != '+')
-						lut_file = std::string(pwd) + "/" + lut_file;
-				}
+				lut_arg = args[++argidx];
 				continue;
 			}
 			if (arg == "-luts" && argidx+1 < args.size()) {
-				lut_costs.clear();
-				for (auto &tok : split_tokens(args[++argidx], ",")) {
-					auto parts = split_tokens(tok, ":");
-					if (GetSize(parts) == 0 && !lut_costs.empty())
-						lut_costs.push_back(lut_costs.back());
-					else if (GetSize(parts) == 1)
-						lut_costs.push_back(atoi(parts.at(0).c_str()));
-					else if (GetSize(parts) == 2)
-						while (GetSize(lut_costs) < atoi(parts.at(0).c_str()))
-							lut_costs.push_back(atoi(parts.at(1).c_str()));
-					else
-						log_cmd_error("Invalid -luts syntax.\n");
-				}
+				luts_arg = args[++argidx];
 				continue;
 			}
 			if (arg == "-fast") {
@@ -1070,6 +1068,52 @@ struct Abc9Pass : public Pass {
 		}
 		extra_args(args, argidx, design);
 
+		rewrite_filename(script_file);
+		if (!script_file.empty() && !is_absolute_path(script_file) && script_file[0] != '+')
+			script_file = std::string(pwd) + "/" + script_file;
+
+		// handle -lut / -luts args
+		if (!lut_arg.empty()) {
+			string arg = lut_arg;
+			if (arg.find_first_not_of("0123456789:") == std::string::npos) {
+				size_t pos = arg.find_first_of(':');
+				int lut_mode = 0, lut_mode2 = 0;
+				if (pos != string::npos) {
+					lut_mode = atoi(arg.substr(0, pos).c_str());
+					lut_mode2 = atoi(arg.substr(pos+1).c_str());
+				} else {
+					lut_mode = atoi(arg.c_str());
+					lut_mode2 = lut_mode;
+				}
+				lut_costs.clear();
+				for (int i = 0; i < lut_mode; i++)
+					lut_costs.push_back(1);
+				for (int i = lut_mode; i < lut_mode2; i++)
+					lut_costs.push_back(2 << (i - lut_mode));
+			}
+			else {
+				lut_file = arg;
+				rewrite_filename(lut_file);
+				if (!lut_file.empty() && !is_absolute_path(lut_file) && lut_file[0] != '+')
+					lut_file = std::string(pwd) + "/" + lut_file;
+			}
+		}
+		if (!luts_arg.empty()) {
+			lut_costs.clear();
+			for (auto &tok : split_tokens(luts_arg, ",")) {
+				auto parts = split_tokens(tok, ":");
+				if (GetSize(parts) == 0 && !lut_costs.empty())
+					lut_costs.push_back(lut_costs.back());
+				else if (GetSize(parts) == 1)
+					lut_costs.push_back(atoi(parts.at(0).c_str()));
+				else if (GetSize(parts) == 2)
+					while (GetSize(lut_costs) < atoi(parts.at(0).c_str()))
+						lut_costs.push_back(atoi(parts.at(1).c_str()));
+				else
+					log_cmd_error("Invalid -luts syntax.\n");
+			}
+		}
+
 		// ABC expects a box file for XAIG
 		if (box_file.empty())
 		    box_file = "+/dummy.box";
-- 
cgit v1.2.3