mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-30 19:22:31 +00:00 
			
		
		
		
	Merge pull request #1 from tony-min-1/change_filenames
changes made to filenames + references
This commit is contained in:
		
						commit
						7ff8912338
					
				
					 59 changed files with 235 additions and 248 deletions
				
			
		|  | @ -37,14 +37,14 @@ $(eval $(call add_extra_objs,passes/pmgen/xilinx_dsp_cascade_pm.h)) | |||
| 
 | ||||
| # --------------------------------------
 | ||||
| 
 | ||||
| OBJS += passes/pmgen/mchp_dsp.o | ||||
| GENFILES += passes/pmgen/mchp_dsp_pm.h | ||||
| GENFILES += passes/pmgen/mchp_dsp_CREG_pm.h | ||||
| GENFILES += passes/pmgen/mchp_dsp_cascade_pm.h | ||||
| passes/pmgen/mchp_dsp.o: passes/pmgen/mchp_dsp_pm.h passes/pmgen/mchp_dsp_CREG_pm.h passes/pmgen/mchp_dsp_cascade_pm.h | ||||
| $(eval $(call add_extra_objs,passes/pmgen/mchp_dsp_pm.h)) | ||||
| $(eval $(call add_extra_objs,passes/pmgen/mchp_dsp_CREG_pm.h)) | ||||
| $(eval $(call add_extra_objs,passes/pmgen/mchp_dsp_cascade_pm.h)) | ||||
| OBJS += passes/pmgen/microchip_dsp.o | ||||
| GENFILES += passes/pmgen/microchip_dsp_pm.h | ||||
| GENFILES += passes/pmgen/microchip_dsp_CREG_pm.h | ||||
| GENFILES += passes/pmgen/microchip_dsp_cascade_pm.h | ||||
| passes/pmgen/microchip_dsp.o: passes/pmgen/microchip_dsp_pm.h passes/pmgen/microchip_dsp_CREG_pm.h passes/pmgen/microchip_dsp_cascade_pm.h | ||||
| $(eval $(call add_extra_objs,passes/pmgen/microchip_dsp_pm.h)) | ||||
| $(eval $(call add_extra_objs,passes/pmgen/microchip_dsp_CREG_pm.h)) | ||||
| $(eval $(call add_extra_objs,passes/pmgen/microchip_dsp_cascade_pm.h)) | ||||
| 
 | ||||
| # --------------------------------------
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -16,25 +16,25 @@ 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 "kernel/yosys.h" | ||||
| #include <deque> | ||||
| 
 | ||||
| USING_YOSYS_NAMESPACE | ||||
| PRIVATE_NAMESPACE_BEGIN | ||||
| 
 | ||||
| #include "passes/pmgen/mchp_dsp_pm.h" | ||||
| #include "passes/pmgen/mchp_dsp_CREG_pm.h" | ||||
| #include "passes/pmgen/mchp_dsp_cascade_pm.h" | ||||
| #include "passes/pmgen/microchip_dsp_CREG_pm.h" | ||||
| #include "passes/pmgen/microchip_dsp_cascade_pm.h" | ||||
| #include "passes/pmgen/microchip_dsp_pm.h" | ||||
| 
 | ||||
| void mchp_dsp_pack(mchp_dsp_pm &pm) | ||||
| void microchip_dsp_pack(microchip_dsp_pm &pm) | ||||
| { | ||||
| 	auto &st = pm.st_mchp_dsp_pack; | ||||
| 	auto &st = pm.st_microchip_dsp_pack; | ||||
| 
 | ||||
| 	log("Analysing %s.%s for MCHP MACC_PA packing.\n", log_id(pm.module), log_id(st.dsp)); | ||||
| 	log("Analysing %s.%s for Microchip MACC_PA packing.\n", log_id(pm.module), log_id(st.dsp)); | ||||
| 
 | ||||
| 	Cell *cell = st.dsp; | ||||
| 	//pack pre-adder
 | ||||
| 	// pack pre-adder
 | ||||
| 	if (st.preAdderStatic) { | ||||
| 		SigSpec &pasub = cell->connections_.at(ID(PASUB)); | ||||
| 		log("  static PASUB preadder %s (%s)\n", log_id(st.preAdderStatic), log_id(st.preAdderStatic->type)); | ||||
|  | @ -42,8 +42,7 @@ void mchp_dsp_pack(mchp_dsp_pm &pm) | |||
| 		bool B_SIGNED = st.preAdderStatic->getParam(ID::A_SIGNED).as_bool(); | ||||
| 		st.sigB.extend_u0(18, B_SIGNED); | ||||
| 		st.sigD.extend_u0(18, D_SIGNED); | ||||
| 		if (st.moveBtoA) | ||||
| 		{ | ||||
| 		if (st.moveBtoA) { | ||||
| 			cell->setPort(ID::A, st.sigA); // if pre-adder feeds into A, original sigB will be moved to port A
 | ||||
| 		} | ||||
| 		cell->setPort(ID::B, st.sigB); | ||||
|  | @ -59,7 +58,7 @@ void mchp_dsp_pack(mchp_dsp_pm &pm) | |||
| 
 | ||||
| 		pm.autoremove(st.preAdderStatic); | ||||
| 	} | ||||
| 	//pack post-adder
 | ||||
| 	// pack post-adder
 | ||||
| 	if (st.postAdderStatic) { | ||||
| 		log("  postadder %s (%s)\n", log_id(st.postAdderStatic), log_id(st.postAdderStatic->type)); | ||||
| 		SigSpec &sub = cell->connections_.at(ID(SUB)); | ||||
|  | @ -73,28 +72,25 @@ void mchp_dsp_pack(mchp_dsp_pm &pm) | |||
| 			log_assert(!"strange post-adder type"); | ||||
| 
 | ||||
| 		if (st.useFeedBack) { | ||||
| 			cell->setPort(ID(CDIN_FDBK_SEL), {State::S0, State::S1});	 | ||||
| 			cell->setPort(ID(CDIN_FDBK_SEL), {State::S0, State::S1}); | ||||
| 		} else { | ||||
| 			st.sigC.extend_u0(48, st.postAdderStatic->getParam(ID::A_SIGNED).as_bool()); | ||||
| 			cell->setPort(ID::C, st.sigC);	 | ||||
| 			cell->setPort(ID::C, st.sigC); | ||||
| 		} | ||||
| 
 | ||||
| 
 | ||||
| 		pm.autoremove(st.postAdderStatic); | ||||
| 	} | ||||
| 	 | ||||
| 
 | ||||
| 	// pack registers
 | ||||
| 	if (st.clock != SigBit()) | ||||
| 	{ | ||||
| 	if (st.clock != SigBit()) { | ||||
| 		cell->setPort(ID::CLK, st.clock); | ||||
| 
 | ||||
| 		// function to absorb a register
 | ||||
| 		auto f = [&pm,cell](SigSpec &A, Cell* ff, IdString ceport, IdString rstport, IdString bypass) { | ||||
| 
 | ||||
| 		auto f = [&pm, cell](SigSpec &A, Cell *ff, IdString ceport, IdString rstport, IdString bypass) { | ||||
| 			// input/output ports
 | ||||
| 			SigSpec D = ff->getPort(ID::D); | ||||
| 			SigSpec Q = pm.sigmap(ff->getPort(ID::Q)); | ||||
| 			 | ||||
| 
 | ||||
| 			if (!A.empty()) | ||||
| 				A.replace(Q, D); | ||||
| 			if (rstport != IdString()) { | ||||
|  | @ -118,21 +114,19 @@ void mchp_dsp_pack(mchp_dsp_pm &pm) | |||
| 				bool cepol = ff->getParam(ID::EN_POLARITY).as_bool(); | ||||
| 				// enables are all active high
 | ||||
| 				cell->setPort(ceport, cepol ? ce : pm.module->Not(NEW_ID, ce)); | ||||
| 			} | ||||
| 			else { | ||||
| 			} else { | ||||
| 				// enables are all active high
 | ||||
| 				cell->setPort(ceport, State::S1);  | ||||
| 				cell->setPort(ceport, State::S1); | ||||
| 			} | ||||
| 
 | ||||
| 			// bypass set to 0
 | ||||
| 			cell->setPort(bypass, State::S0);  | ||||
| 			 | ||||
| 			cell->setPort(bypass, State::S0); | ||||
| 
 | ||||
| 			for (auto c : Q.chunks()) { | ||||
| 				auto it = c.wire->attributes.find(ID::init); | ||||
| 				if (it == c.wire->attributes.end()) | ||||
| 					continue; | ||||
| 				for (int i = c.offset; i < c.offset+c.width; i++) { | ||||
| 				for (int i = c.offset; i < c.offset + c.width; i++) { | ||||
| 					log_assert(it->second[i] == State::S0 || it->second[i] == State::Sx); | ||||
| 					it->second[i] = State::Sx; | ||||
| 				} | ||||
|  | @ -164,7 +158,7 @@ void mchp_dsp_pack(mchp_dsp_pm &pm) | |||
| 			} else { | ||||
| 				f(D, st.ffD, ID(D_EN), ID(D_SRST_N), ID(D_BYPASS)); | ||||
| 			} | ||||
| 			 | ||||
| 
 | ||||
| 			pm.add_siguser(D, cell); | ||||
| 			cell->setPort(ID::D, D); | ||||
| 		} | ||||
|  | @ -189,29 +183,27 @@ void mchp_dsp_pack(mchp_dsp_pm &pm) | |||
| 
 | ||||
| 	SigSpec P = st.sigP; | ||||
| 	if (GetSize(P) < 48) | ||||
| 		P.append(pm.module->addWire(NEW_ID, 48-GetSize(P))); | ||||
| 		P.append(pm.module->addWire(NEW_ID, 48 - GetSize(P))); | ||||
| 	cell->setPort(ID::P, P); | ||||
| 
 | ||||
| 	pm.blacklist(cell); | ||||
| } | ||||
| 
 | ||||
| // For packing cascaded DSPs
 | ||||
| void mchp_dsp_packC(mchp_dsp_CREG_pm &pm) | ||||
| void microchip_dsp_packC(microchip_dsp_CREG_pm &pm) | ||||
| { | ||||
| 	auto &st = pm.st_mchp_dsp_packC; | ||||
| 	auto &st = pm.st_microchip_dsp_packC; | ||||
| 
 | ||||
| 	log_debug("Analysing %s.%s for MCHP DSP packing (REG_C).\n", log_id(pm.module), log_id(st.dsp)); | ||||
| 	log_debug("Analysing %s.%s for Microchip DSP packing (REG_C).\n", log_id(pm.module), log_id(st.dsp)); | ||||
| 	log_debug("ffC:        %s\n", log_id(st.ffC, "--")); | ||||
| 
 | ||||
| 	Cell *cell = st.dsp; | ||||
| 
 | ||||
| 	if (st.clock != SigBit()) | ||||
| 	{ | ||||
| 	if (st.clock != SigBit()) { | ||||
| 		cell->setPort(ID::CLK, st.clock); | ||||
| 
 | ||||
| 		// same function as above, used for the last CREG we need to absorb
 | ||||
| 		auto f = [&pm,cell](SigSpec &A, Cell* ff, IdString ceport, IdString rstport, IdString bypass) { | ||||
| 
 | ||||
| 		auto f = [&pm, cell](SigSpec &A, Cell *ff, IdString ceport, IdString rstport, IdString bypass) { | ||||
| 			// input/output ports
 | ||||
| 			SigSpec D = ff->getPort(ID::D); | ||||
| 			SigSpec Q = pm.sigmap(ff->getPort(ID::Q)); | ||||
|  | @ -240,18 +232,17 @@ void mchp_dsp_packC(mchp_dsp_CREG_pm &pm) | |||
| 				cell->setPort(ceport, cepol ? ce : pm.module->Not(NEW_ID, ce)); | ||||
| 			} else { | ||||
| 				// enables are all active high
 | ||||
| 				cell->setPort(ceport, State::S1);  | ||||
| 				cell->setPort(ceport, State::S1); | ||||
| 			} | ||||
| 
 | ||||
| 			// bypass set to 0
 | ||||
| 			cell->setPort(bypass, State::S0);  | ||||
| 			 | ||||
| 			cell->setPort(bypass, State::S0); | ||||
| 
 | ||||
| 			for (auto c : Q.chunks()) { | ||||
| 				auto it = c.wire->attributes.find(ID::init); | ||||
| 				if (it == c.wire->attributes.end()) | ||||
| 					continue; | ||||
| 				for (int i = c.offset; i < c.offset+c.width; i++) { | ||||
| 				for (int i = c.offset; i < c.offset + c.width; i++) { | ||||
| 					log_assert(it->second[i] == State::S0 || it->second[i] == State::Sx); | ||||
| 					it->second[i] = State::Sx; | ||||
| 				} | ||||
|  | @ -260,7 +251,7 @@ void mchp_dsp_packC(mchp_dsp_CREG_pm &pm) | |||
| 
 | ||||
| 		if (st.ffC) { | ||||
| 			SigSpec C = cell->getPort(ID::C); | ||||
| 			 | ||||
| 
 | ||||
| 			if (st.ffC->type.in(ID($adff), ID($adffe))) { | ||||
| 				f(C, st.ffC, ID(C_EN), ID(C_ARST_N), ID(C_BYPASS)); | ||||
| 			} else { | ||||
|  | @ -280,17 +271,17 @@ void mchp_dsp_packC(mchp_dsp_CREG_pm &pm) | |||
| 	pm.blacklist(cell); | ||||
| } | ||||
| 
 | ||||
| struct MchpDspPass : public Pass { | ||||
| 	MchpDspPass() : Pass("mchp_dsp", "MCHP: pack resources into DSPs") { } | ||||
| struct MicrochipDspPass : public Pass { | ||||
| 	MicrochipDspPass() : Pass("microchip_dsp", "MICROCHIP: pack resources into DSPs") {} | ||||
| 	void help() override | ||||
| 	{ | ||||
| 		//   |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
 | ||||
| 		log("\n"); | ||||
| 		log("    mchp_dsp [options] [selection]\n"); | ||||
| 		log("    microchip_dsp [options] [selection]\n"); | ||||
| 		log("\n"); | ||||
| 		log("Pack input registers 'A', 'B', 'C', and 'D' (with optional enable/reset),\n"); | ||||
| 		log("output register 'P' (with optional enable/reset), pre-adder and/or post-adder into\n"); | ||||
| 		log("MCHP DSP resources.\n"); | ||||
| 		log("Microchip DSP resources.\n"); | ||||
| 		log("\n"); | ||||
| 		log("Multiply-accumulate operations using the post-adder with feedback on the 'C'\n"); | ||||
| 		log("input will be folded into the DSP. In this scenario only, the 'C' input can be\n"); | ||||
|  | @ -303,24 +294,23 @@ struct MchpDspPass : public Pass { | |||
| 		log("implement wide multipliers). Cascade chains are limited to a mazimum length \n"); | ||||
| 		log("of 24 cells, corresponding to PolarFire (pf) devices.\n"); | ||||
| 		log("\n"); | ||||
| 		log("This pass is a no-op if the scratchpad variable 'mchp_dsp.multonly' is set\n"); | ||||
| 		log("This pass is a no-op if the scratchpad variable 'microchip_dsp.multonly' is set\n"); | ||||
| 		log("to 1.\n"); | ||||
| 		log("\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -family {pf}\n"); | ||||
| 		log("    -family {polarfire}\n"); | ||||
| 		log("        select the family to target\n"); | ||||
| 		log("        default: pf\n"); | ||||
| 		log("        default: polarfire\n"); | ||||
| 		log("\n"); | ||||
| 	} | ||||
| 	void execute(std::vector<std::string> args, RTLIL::Design *design) override | ||||
| 	{ | ||||
| 		log_header(design, "Executing MCHP_DSP pass (pack resources into DSPs).\n"); | ||||
| 		log_header(design, "Executing MICROCHIP_DSP pass (pack resources into DSPs).\n"); | ||||
| 
 | ||||
| 		std::string family = "pf"; | ||||
| 		std::string family = "polarfire"; | ||||
| 		size_t argidx; | ||||
| 		for (argidx = 1; argidx < args.size(); argidx++) | ||||
| 		{ | ||||
| 			if ((args[argidx] == "-family") && argidx+1 < args.size()) { | ||||
| 		for (argidx = 1; argidx < args.size(); argidx++) { | ||||
| 			if ((args[argidx] == "-family") && argidx + 1 < args.size()) { | ||||
| 				family = args[++argidx]; | ||||
| 				continue; | ||||
| 			} | ||||
|  | @ -330,7 +320,7 @@ struct MchpDspPass : public Pass { | |||
| 
 | ||||
| 		for (auto module : design->selected_modules()) { | ||||
| 
 | ||||
| 			if (design->scratchpad_get_bool("mchp_dsp.multonly")) | ||||
| 			if (design->scratchpad_get_bool("microchip_dsp.multonly")) | ||||
| 				continue; | ||||
| 
 | ||||
| 			{ | ||||
|  | @ -338,13 +328,13 @@ struct MchpDspPass : public Pass { | |||
| 				//   the "PolarFire FPGA Macro Library Guide"
 | ||||
| 
 | ||||
| 				// Main pattern matching step to capture a DSP cell.
 | ||||
| 				//   Match for pre-adder, post-adder, as well as 
 | ||||
| 				//   Match for pre-adder, post-adder, as well as
 | ||||
| 				//   registers 'A', 'B', 'D', and 'P'. Additionally,
 | ||||
| 				//   check for an accumulator pattern based on whether
 | ||||
| 				//   a post-adder and PREG are both present AND
 | ||||
| 				//   if PREG feeds into this post-adder.  
 | ||||
| 				mchp_dsp_pm pm(module, module->selected_cells()); | ||||
| 				pm.run_mchp_dsp_pack(mchp_dsp_pack); | ||||
| 				//   if PREG feeds into this post-adder.
 | ||||
| 				microchip_dsp_pm pm(module, module->selected_cells()); | ||||
| 				pm.run_microchip_dsp_pack(microchip_dsp_pack); | ||||
| 			} | ||||
| 
 | ||||
| 			// Separating out CREG packing is necessary since there
 | ||||
|  | @ -356,18 +346,17 @@ struct MchpDspPass : public Pass { | |||
| 			//   PREG of an upstream DSP that had not been visited
 | ||||
| 			//   yet
 | ||||
| 			{ | ||||
| 				mchp_dsp_CREG_pm pm(module, module->selected_cells()); | ||||
| 				pm.run_mchp_dsp_packC(mchp_dsp_packC); | ||||
| 				microchip_dsp_CREG_pm pm(module, module->selected_cells()); | ||||
| 				pm.run_microchip_dsp_packC(microchip_dsp_packC); | ||||
| 			} | ||||
| 
 | ||||
| 			// Lastly, identify and utilise PCOUT -> PCIN chains
 | ||||
| 			{ | ||||
| 				mchp_dsp_cascade_pm pm(module, module->selected_cells()); | ||||
| 				pm.run_mchp_dsp_cascade(); | ||||
| 				microchip_dsp_cascade_pm pm(module, module->selected_cells()); | ||||
| 				pm.run_microchip_dsp_cascade(); | ||||
| 			} | ||||
| 			 | ||||
| 		} | ||||
| 	} | ||||
| } MchpDspPass; | ||||
| } MicrochipDspPass; | ||||
| 
 | ||||
| PRIVATE_NAMESPACE_END | ||||
|  | @ -16,7 +16,7 @@ | |||
| 
 | ||||
| 
 | ||||
| // This file describes the main pattern matcher setup (of three total) that | ||||
| //   forms the `mchp_dsp` pass described in mchp_dsp.cc  | ||||
| //   forms the `microchip_dsp` pass described in microchip_dsp.cc  | ||||
| // At a high level, it works as follows: | ||||
| //   ( 1) Starting from a DSP cell. Capture DSP configurations as states | ||||
| //   ( 2) Match for pre-adder | ||||
|  | @ -31,7 +31,7 @@ | |||
| //            |MULT|------ | adder |   +----+ | ||||
| //            +----+       \-------/ | ||||
| 
 | ||||
| pattern mchp_dsp_pack | ||||
| pattern microchip_dsp_pack | ||||
| 
 | ||||
| state <SigBit> clock | ||||
| state <SigSpec> sigA sigB sigC sigD sigP | ||||
|  | @ -16,7 +16,7 @@ | |||
| 
 | ||||
| 
 | ||||
| // This file describes the second of three pattern matcher setups that | ||||
| //   forms the `mchp_dsp` pass described in mchp_dsp.cc | ||||
| //   forms the `microchip_dsp` pass described in microchip_dsp.cc | ||||
| // At a high level, it works as follows: | ||||
| //   (1) Starting from a DSP cell that (a) doesn't have a CREG already, | ||||
| //       and (b) uses the 'C' port | ||||
|  | @ -24,21 +24,21 @@ | |||
| //       (attached to at most two $mux cells that implement clock-enable or | ||||
| //        reset functionality, using a subpattern discussed below) | ||||
| // Notes: | ||||
| //   - Running CREG packing after mchp_dsp_pack is necessary since there is no | ||||
| //   - Running CREG packing after microchip_dsp_pack is necessary since there is no | ||||
| //     guarantee that the cell ordering corresponds to the "expected" case (i.e. | ||||
| //     the order in which they appear in the source) thus the possiblity existed | ||||
| //     where a register got packed as a CREG into a downstream DSP, while it should | ||||
| //     have otherwise been a PREG of an upstream DSP that had not been visited. | ||||
| //     yet. | ||||
| //   - The reason this is separated out from the mchp_dsp.pmg file is | ||||
| //   - The reason this is separated out from the microchip_dsp.pmg file is | ||||
| //     for efficiency --- each *.pmg file creates a class of the same basename, | ||||
| //     which when constructed, creates a custom database tailored to the | ||||
| //     pattern(s) contained within. Since the pattern in this file must be | ||||
| //     executed after the pattern contained in mchp_dsp.pmg, it is necessary | ||||
| //     executed after the pattern contained in microchip_dsp.pmg, it is necessary | ||||
| //     to reconstruct this database. Separating the two patterns into | ||||
| //     independent files causes two smaller, more specific, databases. | ||||
| 
 | ||||
| pattern mchp_dsp_packC | ||||
| pattern microchip_dsp_packC | ||||
| 
 | ||||
| udata <std::function<SigSpec(const SigSpec&)>> unextend | ||||
| state <SigBit> clock | ||||
|  | @ -16,7 +16,7 @@ | |||
| 
 | ||||
| 
 | ||||
| // This file describes the third of three pattern matcher setups that | ||||
| //   forms the `mchp_dsp` pass described in mchp_dsp.cc | ||||
| //   forms the `microchip_dsp` pass described in microchip_dsp.cc | ||||
| // At a high level, it works as follows: | ||||
| //   (1) Starting from a DSP cell that  | ||||
| //         (a) CDIN_FDBK_SEL is set to default "00" | ||||
|  | @ -32,7 +32,7 @@ | |||
| //       height of a DSP column) with each DSP in each chunk being rewritten | ||||
| //       to use [ABP]COUT -> [ABP]CIN cascading as appropriate | ||||
| 
 | ||||
| pattern mchp_dsp_cascade | ||||
| pattern microchip_dsp_cascade | ||||
| 
 | ||||
| udata <std::function<SigSpec(const SigSpec&)>> unextend | ||||
| udata <vector<std::tuple<Cell*,int>>> chain longest_chain | ||||
|  | @ -16,16 +16,16 @@ | |||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| OBJS += techlibs/mchp/synth_mchp.o | ||||
| OBJS += techlibs/mchp/mchp_dffopt.o | ||||
| OBJS += techlibs/microchip/synth_microchip.o | ||||
| OBJS += techlibs/microchip/microchip_dffopt.o | ||||
| 
 | ||||
| $(eval $(call add_share_file,share/mchp,techlibs/mchp/arith_map.v)) | ||||
| $(eval $(call add_share_file,share/mchp,techlibs/mchp/cells_map.v)) | ||||
| $(eval $(call add_share_file,share/mchp,techlibs/mchp/cells_sim.v)) | ||||
| $(eval $(call add_share_file,share/mchp,techlibs/mchp/pf_dsp_map.v)) | ||||
| $(eval $(call add_share_file,share/microchip,techlibs/microchip/arith_map.v)) | ||||
| $(eval $(call add_share_file,share/microchip,techlibs/microchip/cells_map.v)) | ||||
| $(eval $(call add_share_file,share/microchip,techlibs/microchip/cells_sim.v)) | ||||
| $(eval $(call add_share_file,share/microchip,techlibs/microchip/polarfire_dsp_map.v)) | ||||
| 
 | ||||
| $(eval $(call add_share_file,share/mchp,techlibs/mchp/brams_defs.vh)) | ||||
| $(eval $(call add_share_file,share/mchp,techlibs/mchp/LSRAM_map.v)) | ||||
| $(eval $(call add_share_file,share/mchp,techlibs/mchp/LSRAM.txt)) | ||||
| $(eval $(call add_share_file,share/mchp,techlibs/mchp/uSRAM_map.v)) | ||||
| $(eval $(call add_share_file,share/mchp,techlibs/mchp/uSRAM.txt)) | ||||
| $(eval $(call add_share_file,share/microchip,techlibs/microchip/brams_defs.vh)) | ||||
| $(eval $(call add_share_file,share/microchip,techlibs/microchip/LSRAM_map.v)) | ||||
| $(eval $(call add_share_file,share/microchip,techlibs/microchip/LSRAM.txt)) | ||||
| $(eval $(call add_share_file,share/microchip,techlibs/microchip/uSRAM_map.v)) | ||||
| $(eval $(call add_share_file,share/microchip,techlibs/microchip/uSRAM.txt)) | ||||
|  | @ -21,7 +21,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
| 
 | ||||
| 
 | ||||
| (* techmap_celltype = "$_MUX4_" *) | ||||
| module \$__mchp_MUX4_ (A, B, C, D, S, T, Y); | ||||
| module \$__microchip_MUX4_ (A, B, C, D, S, T, Y); | ||||
| 	input A, B, C, D, S, T; | ||||
| 	output Y; | ||||
| 	MX4 _TECHMAP_REPLACE_.MUX4(.D3(D), .D2(C), .D1(B), .D0(A), .S1(T), .S0(S), .Y(Y)); | ||||
|  | @ -30,7 +30,7 @@ endmodule | |||
| 
 | ||||
| 
 | ||||
| (* techmap_celltype = "$reduce_xor" *) | ||||
| module \$__mchp_XOR8_ (A, Y); | ||||
| module \$__microchip_XOR8_ (A, Y); | ||||
| 	parameter A_SIGNED = 0; | ||||
| 	parameter A_WIDTH = 0; | ||||
| 	parameter Y_WIDTH = 0; | ||||
|  | @ -28,11 +28,11 @@ endmodule | |||
| // for sync set/reset registers, we can pass them into ABC9. So we need to follow the simplification idiom
 | ||||
| // and map to intermediate cell types
 | ||||
| module \$_SDFFCE_PN0P_ (input D, C, R, E, output Q); | ||||
| 	MCHP_SYNC_RESET_DFF _TECHMAP_REPLACE_ (.D(D), .CLK(C), .Reset(R), .En(E), .Q(Q)); | ||||
| 	MICROCHIP_SYNC_RESET_DFF _TECHMAP_REPLACE_ (.D(D), .CLK(C), .Reset(R), .En(E), .Q(Q)); | ||||
| endmodule | ||||
| 
 | ||||
| module \$_SDFFCE_PN1P_ (input D, C, R, E, output Q); | ||||
| 	MCHP_SYNC_SET_DFF _TECHMAP_REPLACE_ (.D(D), .CLK(C), .Set(R), .En(E), .Q(Q)); | ||||
| 	MICROCHIP_SYNC_SET_DFF _TECHMAP_REPLACE_ (.D(D), .CLK(C), .Set(R), .En(E), .Q(Q)); | ||||
| endmodule | ||||
| 
 | ||||
| 
 | ||||
|  | @ -52,7 +52,7 @@ endmodule | |||
| 
 | ||||
| // map intermediate flops to SLE
 | ||||
| `ifdef FINAL_MAP | ||||
| module MCHP_SYNC_SET_DFF( | ||||
| module MICROCHIP_SYNC_SET_DFF( | ||||
| 	input D, | ||||
| 	input CLK, | ||||
| 	input Set, | ||||
|  | @ -61,7 +61,7 @@ module MCHP_SYNC_SET_DFF( | |||
| 	SLE _TECHMAP_REPLACE_ (.D(D), .CLK(CLK), .EN(En), .ALn(1'b1), .ADn(1'b0), .SLn(Set), .SD(1'b1), .LAT(1'b0), .Q(Q)); | ||||
| endmodule | ||||
| 
 | ||||
| module MCHP_SYNC_RESET_DFF( | ||||
| module MICROCHIP_SYNC_RESET_DFF( | ||||
| 	input D, | ||||
| 	input CLK, | ||||
| 	input Reset, | ||||
|  | @ -155,11 +155,11 @@ endmodule | |||
| 
 | ||||
| // sequential elements
 | ||||
| 
 | ||||
| // MCHP_SYNC_SET_DFF and MCHP_SYNC_RESET_DFF are intermediate cell types to implement the simplification idiom for abc9 flow 
 | ||||
| // MICROCHIP_SYNC_SET_DFF and MICROCHIP_SYNC_RESET_DFF are intermediate cell types to implement the simplification idiom for abc9 flow 
 | ||||
| //	see: https://yosyshq.readthedocs.io/projects/yosys/en/latest/yosys_internals/extending_yosys/abc_flow.html
 | ||||
| 
 | ||||
| (* abc9_flop, lib_whitebox *) | ||||
| module MCHP_SYNC_SET_DFF( | ||||
| module MICROCHIP_SYNC_SET_DFF( | ||||
| 	input D, | ||||
| 	input CLK, | ||||
| 	input Set, | ||||
|  | @ -190,7 +190,7 @@ module MCHP_SYNC_SET_DFF( | |||
| endmodule | ||||
| 
 | ||||
| (* abc9_flop, lib_whitebox *) | ||||
| module MCHP_SYNC_RESET_DFF( | ||||
| module MICROCHIP_SYNC_RESET_DFF( | ||||
| 	input D, | ||||
| 	input CLK, | ||||
| 	input Reset, | ||||
|  | @ -16,8 +16,8 @@ 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 "kernel/yosys.h" | ||||
| 
 | ||||
| USING_YOSYS_NAMESPACE | ||||
| PRIVATE_NAMESPACE_BEGIN | ||||
|  | @ -25,7 +25,8 @@ PRIVATE_NAMESPACE_BEGIN | |||
| typedef std::pair<Const, std::vector<SigBit>> LutData; | ||||
| 
 | ||||
| // Compute a LUT implementing (select ^ select_inv) ? alt_data : data.  Returns true if successful.
 | ||||
| bool merge_lut(LutData &result, const LutData &data, const LutData select, bool select_inv, SigBit alt_data, int max_lut_size) { | ||||
| bool merge_lut(LutData &result, const LutData &data, const LutData select, bool select_inv, SigBit alt_data, int max_lut_size) | ||||
| { | ||||
| 	// First, gather input signals -- insert new signals at the beginning
 | ||||
| 	// of the vector, so they don't disturb the likely-critical D LUT input
 | ||||
| 	// timings.
 | ||||
|  | @ -97,13 +98,13 @@ bool merge_lut(LutData &result, const LutData &data, const LutData select, bool | |||
| 	return true; | ||||
| } | ||||
| 
 | ||||
| struct MchpDffOptPass : public Pass { | ||||
| 	MchpDffOptPass() : Pass("mchp_dffopt", "MCHP: optimize FF control signal usage") { } | ||||
| struct MicrochipDffOptPass : public Pass { | ||||
| 	MicrochipDffOptPass() : Pass("microchip_dffopt", "MICROCHIP: optimize FF control signal usage") {} | ||||
| 	void help() override | ||||
| 	{ | ||||
| 		//   |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
 | ||||
| 		log("\n"); | ||||
| 		log("    mchp_dffopt [options] [selection]\n"); | ||||
| 		log("    microchip_dffopt [options] [selection]\n"); | ||||
| 		log("\n"); | ||||
| 		log("Converts hardware clock enable and set/reset signals on FFs to emulation\n"); | ||||
| 		log("using LUTs, if doing so would improve area. Operates on post-techmap LUT, DFF\n"); | ||||
|  | @ -112,15 +113,14 @@ struct MchpDffOptPass : public Pass { | |||
| 	} | ||||
| 	void execute(std::vector<std::string> args, RTLIL::Design *design) override | ||||
| 	{ | ||||
| 		log_header(design, "Executing MCHP_DFFOPT pass (optimize FF control signal usage).\n"); | ||||
| 		log_header(design, "Executing MICROCHIP_DFFOPT pass (optimize FF control signal usage).\n"); | ||||
| 
 | ||||
| 		size_t argidx; | ||||
| 		int max_lut_size = 4; | ||||
| 		 | ||||
| 
 | ||||
| 		extra_args(args, argidx, design); | ||||
| 
 | ||||
| 		for (auto module : design->selected_modules()) | ||||
| 		{ | ||||
| 		for (auto module : design->selected_modules()) { | ||||
| 			log("Optimizing FFs in %s.\n", log_id(module)); | ||||
| 
 | ||||
| 			SigMap sigmap(module); | ||||
|  | @ -128,8 +128,7 @@ struct MchpDffOptPass : public Pass { | |||
| 			dict<SigBit, int> bit_uses; | ||||
| 
 | ||||
| 			// Gather LUTs.
 | ||||
| 			for (auto cell : module->selected_cells()) | ||||
| 			{ | ||||
| 			for (auto cell : module->selected_cells()) { | ||||
| 				for (auto port : cell->connections()) | ||||
| 					for (auto bit : port.second) | ||||
| 						bit_uses[sigmap(bit)]++; | ||||
|  | @ -153,8 +152,8 @@ struct MchpDffOptPass : public Pass { | |||
| 					if (cell->type == ID(CFG3)) | ||||
| 						goto lut_sigin_done; | ||||
| 					sigin.push_back(sigmap(cell->getPort(ID(D)))); | ||||
| 					 | ||||
| lut_sigin_done: | ||||
| 
 | ||||
| 				lut_sigin_done: | ||||
| 					bit_to_lut[sigout] = make_pair(LutData(init, sigin), cell); | ||||
| 				} | ||||
| 			} | ||||
|  | @ -164,8 +163,7 @@ lut_sigin_done: | |||
| 						bit_uses[sigmap(SigBit(wire, i))]++; | ||||
| 
 | ||||
| 			// Iterate through FFs.
 | ||||
| 			for (auto cell : module->selected_cells()) | ||||
| 			{ | ||||
| 			for (auto cell : module->selected_cells()) { | ||||
| 
 | ||||
| 				if (!cell->type.in(ID(SLE))) // not a SLE
 | ||||
| 					continue; | ||||
|  | @ -174,13 +172,12 @@ lut_sigin_done: | |||
| 				if (cell->get_bool_attribute(ID::keep)) // keep attribute
 | ||||
| 					continue; | ||||
| 				if (!cell->getPort(ID(ALn)).is_fully_ones()) // async FF
 | ||||
| 					continue;  | ||||
| 					continue; | ||||
| 
 | ||||
| 					 | ||||
| 				const bool hasSyncLoad = cell->getPort(ID(SLn)).is_wire(); | ||||
| 				const bool has_s = hasSyncLoad && cell->getPort(ID(SD)).is_fully_ones(); | ||||
| 				const bool has_r = hasSyncLoad && cell->getPort(ID(SD)).is_fully_zero(); | ||||
| 				 | ||||
| 
 | ||||
| 				// SLE cannot have both synchronous set and reset implemented at the same time
 | ||||
| 				log_assert(!(has_s && has_r)); | ||||
| 
 | ||||
|  | @ -196,7 +193,6 @@ lut_sigin_done: | |||
| 				LutData lut_d = it_D->second.first; | ||||
| 				Cell *cell_d = it_D->second.second; | ||||
| 
 | ||||
| 
 | ||||
| 				LutData lut_d_post_ce; | ||||
| 				LutData lut_d_post_s; | ||||
| 				LutData lut_d_post_r; | ||||
|  | @ -216,7 +212,8 @@ lut_sigin_done: | |||
| 					if (!merge_lut(lut_d_post_ce, lut_d, lut_ce, true, sig_Q, max_lut_size)) | ||||
| 						continue; | ||||
| 
 | ||||
| 					// If this gets rid of a CE LUT, it's worth it.  If not, it still may be worth it, if we can remove set/reset as well.
 | ||||
| 					// If this gets rid of a CE LUT, it's worth it.  If not, it still may be worth it, if we can remove set/reset
 | ||||
| 					// as well.
 | ||||
| 					if (it_CE != bit_to_lut.end()) | ||||
| 						worthy_post_ce = true; | ||||
| 				} else if (sig_CE.data != State::S1) { | ||||
|  | @ -231,7 +228,7 @@ lut_sigin_done: | |||
| 				if (has_s) { | ||||
| 					SigBit sig_S = sigmap(cell->getPort(ID(SLn))); | ||||
| 					LutData lut_s = LutData(Const(2, 2), {sig_S}); // INIT = 10
 | ||||
| 					bool inv_s = true; // active low
 | ||||
| 					bool inv_s = true;			       // active low
 | ||||
| 					auto it_S = bit_to_lut.find(sig_S); | ||||
| 					if (it_S != bit_to_lut.end()) | ||||
| 						lut_s = it_S->second.first; | ||||
|  | @ -253,7 +250,7 @@ lut_sigin_done: | |||
| 				if (has_r) { | ||||
| 					SigBit sig_R = sigmap(cell->getPort(ID(SLn))); | ||||
| 					LutData lut_r = LutData(Const(2, 2), {sig_R}); // INIT = 10
 | ||||
| 					bool inv_r = true; // active low
 | ||||
| 					bool inv_r = true;			       // active low
 | ||||
| 					auto it_R = bit_to_lut.find(sig_R); | ||||
| 					if (it_R != bit_to_lut.end()) | ||||
| 						lut_r = it_R->second.first; | ||||
|  | @ -270,7 +267,7 @@ lut_sigin_done: | |||
| 					} | ||||
| 				} | ||||
| 
 | ||||
| unmap: | ||||
| 			unmap: | ||||
| 
 | ||||
| 				// SLE cannot have both synchronous set and reset implemented at the same time
 | ||||
| 				log_assert(!(worthy_post_r && worthy_post_s)); | ||||
|  | @ -288,10 +285,14 @@ unmap: | |||
| 				} | ||||
| 
 | ||||
| 				std::string ports; | ||||
| 				if (worthy_post_r) ports += " + R"; | ||||
| 				if (worthy_post_s) ports += " + S"; | ||||
| 				if (worthy_post_ce) ports += " + CE"; | ||||
| 				log("  Merging D%s LUTs for %s/%s (%d -> %d)\n", ports.c_str(), log_id(cell), log_id(sig_Q.wire), GetSize(lut_d.second), GetSize(final_lut.second)); | ||||
| 				if (worthy_post_r) | ||||
| 					ports += " + R"; | ||||
| 				if (worthy_post_s) | ||||
| 					ports += " + S"; | ||||
| 				if (worthy_post_ce) | ||||
| 					ports += " + CE"; | ||||
| 				log("  Merging D%s LUTs for %s/%s (%d -> %d)\n", ports.c_str(), log_id(cell), log_id(sig_Q.wire), | ||||
| 				    GetSize(lut_d.second), GetSize(final_lut.second)); | ||||
| 
 | ||||
| 				// Okay, we're doing it.  Unmap ports.
 | ||||
| 				if ((has_s && worthy_post_s) || worthy_post_r) { | ||||
|  | @ -304,20 +305,20 @@ unmap: | |||
| 				// Create the new LUT.
 | ||||
| 				Cell *lut_cell = nullptr; | ||||
| 				switch (GetSize(final_lut.second)) { | ||||
| 					case 1: | ||||
| 						lut_cell = module->addCell(NEW_ID, ID(CFG1)); | ||||
| 						break; | ||||
| 					case 2: | ||||
| 						lut_cell = module->addCell(NEW_ID, ID(CFG2)); | ||||
| 						break; | ||||
| 					case 3: | ||||
| 						lut_cell = module->addCell(NEW_ID, ID(CFG3)); | ||||
| 						break; | ||||
| 					case 4: | ||||
| 						lut_cell = module->addCell(NEW_ID, ID(CFG4)); | ||||
| 						break; | ||||
| 					default: | ||||
| 						log_assert(!"unknown lut size"); | ||||
| 				case 1: | ||||
| 					lut_cell = module->addCell(NEW_ID, ID(CFG1)); | ||||
| 					break; | ||||
| 				case 2: | ||||
| 					lut_cell = module->addCell(NEW_ID, ID(CFG2)); | ||||
| 					break; | ||||
| 				case 3: | ||||
| 					lut_cell = module->addCell(NEW_ID, ID(CFG3)); | ||||
| 					break; | ||||
| 				case 4: | ||||
| 					lut_cell = module->addCell(NEW_ID, ID(CFG4)); | ||||
| 					break; | ||||
| 				default: | ||||
| 					log_assert(!"unknown lut size"); | ||||
| 				} | ||||
| 				lut_cell->attributes = cell_d->attributes; | ||||
| 				Wire *lut_out = module->addWire(NEW_ID); | ||||
|  | @ -334,7 +335,6 @@ unmap: | |||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } MchpDffOptPass; | ||||
| } MicrochipDffOptPass; | ||||
| 
 | ||||
| PRIVATE_NAMESPACE_END | ||||
| 
 | ||||
|  | @ -16,23 +16,22 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |||
| OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
| */ | ||||
| 
 | ||||
| #include "kernel/register.h" | ||||
| #include "kernel/celltypes.h" | ||||
| #include "kernel/rtlil.h" | ||||
| #include "kernel/log.h" | ||||
| #include "kernel/register.h" | ||||
| #include "kernel/rtlil.h" | ||||
| 
 | ||||
| USING_YOSYS_NAMESPACE | ||||
| PRIVATE_NAMESPACE_BEGIN | ||||
| 
 | ||||
| struct SynthMchpPass : public ScriptPass | ||||
| { | ||||
| 	SynthMchpPass() : ScriptPass("synth_mchp", "synthesis for Microchip FPGAs") { } | ||||
| struct SynthMicrochipPass : public ScriptPass { | ||||
| 	SynthMicrochipPass() : ScriptPass("synth_microchip", "synthesis for Microchip FPGAs") {} | ||||
| 
 | ||||
| 	void help() override | ||||
| 	{ | ||||
| 		//   |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
 | ||||
| 		log("\n"); | ||||
| 		log("    synth_mchp [options]\n"); | ||||
| 		log("    synth_microchip [options]\n"); | ||||
| 		log("\n"); | ||||
| 		log("This command runs synthesis for Microchip FPGAs. Operating on\n"); | ||||
| 		log("partly selected designs is not supported (you must submit a fully-selected \n"); | ||||
|  | @ -46,7 +45,7 @@ struct SynthMchpPass : public ScriptPass | |||
| 		log("        Run synthesis for the specified Microchip architecture. \n"); | ||||
| 		log("        Generate the synthesis netlist for the specified family.\n"); | ||||
| 		log("        supported values:\n"); | ||||
| 		log("        - pf: PolarFire\n"); | ||||
| 		log("        - polarfire: PolarFire\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -edif <file>\n"); | ||||
| 		log("        Write the design to the specified edif file. Writing of an output file\n"); | ||||
|  | @ -54,7 +53,7 @@ struct SynthMchpPass : public ScriptPass | |||
| 		log("\n"); | ||||
| 		log("    -blif <file>\n"); | ||||
| 		log("        Write the design to the specified BLIF file. Writing of an output file\n"); | ||||
| 		log("        is omitted if this parameter is not specified.\n");		 | ||||
| 		log("        is omitted if this parameter is not specified.\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -nobram\n"); | ||||
| 		log("        Do not use block RAM cells in output netlist\n"); | ||||
|  | @ -113,7 +112,7 @@ struct SynthMchpPass : public ScriptPass | |||
| 		top_opt = "-auto-top"; | ||||
| 		edif_file.clear(); | ||||
| 		blif_file.clear(); | ||||
| 		family = "pf"; | ||||
| 		family = "polarfire"; | ||||
| 		flatten = false; | ||||
| 		retime = false; | ||||
| 		noiopad = false; | ||||
|  | @ -137,30 +136,29 @@ struct SynthMchpPass : public ScriptPass | |||
| 		clear_flags(); | ||||
| 
 | ||||
| 		size_t argidx; | ||||
| 		for (argidx = 1; argidx < args.size(); argidx++) | ||||
| 		{ | ||||
| 			if (args[argidx] == "-top" && argidx+1 < args.size()) { | ||||
| 		for (argidx = 1; argidx < args.size(); argidx++) { | ||||
| 			if (args[argidx] == "-top" && argidx + 1 < args.size()) { | ||||
| 				top_opt = "-top " + args[++argidx]; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if ((args[argidx] == "-family" || args[argidx] == "-arch") && argidx+1 < args.size()) { | ||||
| 			if ((args[argidx] == "-family" || args[argidx] == "-arch") && argidx + 1 < args.size()) { | ||||
| 				family = args[++argidx]; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (args[argidx] == "-edif" && argidx+1 < args.size()) { | ||||
| 			if (args[argidx] == "-edif" && argidx + 1 < args.size()) { | ||||
| 				edif_file = args[++argidx]; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (args[argidx] == "-blif" && argidx+1 < args.size()) { | ||||
| 			if (args[argidx] == "-blif" && argidx + 1 < args.size()) { | ||||
| 				blif_file = args[++argidx]; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (args[argidx] == "-run" && argidx+1 < args.size()) { | ||||
| 				size_t pos = args[argidx+1].find(':'); | ||||
| 			if (args[argidx] == "-run" && argidx + 1 < args.size()) { | ||||
| 				size_t pos = args[argidx + 1].find(':'); | ||||
| 				if (pos == std::string::npos) | ||||
| 					break; | ||||
| 				run_from = args[++argidx].substr(0, pos); | ||||
| 				run_to = args[argidx].substr(pos+1); | ||||
| 				run_to = args[argidx].substr(pos + 1); | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (args[argidx] == "-flatten") { | ||||
|  | @ -227,11 +225,11 @@ struct SynthMchpPass : public ScriptPass | |||
| 		} | ||||
| 		extra_args(args, argidx, design); | ||||
| 
 | ||||
| 		if (family == "pf") { | ||||
| 		if (family == "polarfire") { | ||||
| 			lut_size = 4; | ||||
| 		} else { | ||||
| 			log_cmd_error("Invalid Microchip -family setting: '%s'.\n", family.c_str()); | ||||
|         } | ||||
| 		} | ||||
| 
 | ||||
| 		if (!design->full_selection()) | ||||
| 			log_cmd_error("This command only operates on fully selected designs!\n"); | ||||
|  | @ -239,8 +237,7 @@ struct SynthMchpPass : public ScriptPass | |||
| 		if (abc9 && retime) | ||||
| 			log_cmd_error("-retime option not currently compatible with -abc9!\n"); | ||||
| 
 | ||||
| 
 | ||||
| 		log_header(design, "Executing SYNTH_MCHP pass.\n"); | ||||
| 		log_header(design, "Executing SYNTH_MICROCHIP pass.\n"); | ||||
| 		log_push(); | ||||
| 
 | ||||
| 		run_script(design, run_from, run_to); | ||||
|  | @ -256,7 +253,7 @@ struct SynthMchpPass : public ScriptPass | |||
| 
 | ||||
| 		if (check_label("begin")) { | ||||
| 			std::string read_args; | ||||
| 			read_args += " -lib -specify +/mchp/cells_sim.v"; | ||||
| 			read_args += " -lib -specify +/microchip/cells_sim.v"; | ||||
| 			run("read_verilog" + read_args); | ||||
| 
 | ||||
| 			run(stringf("hierarchy -check %s", top_opt.c_str())); | ||||
|  | @ -286,29 +283,29 @@ struct SynthMchpPass : public ScriptPass | |||
| 
 | ||||
| 		if (check_label("map_dsp", "(skip if '-nodsp')")) { | ||||
| 			if (!nodsp || help_mode) { | ||||
| 				run("memory_dff"); // mchp_dsp will merge registers, reserve memory port registers first
 | ||||
| 				run("memory_dff"); // microchip_dsp will merge registers, reserve memory port registers first
 | ||||
| 				if (help_mode) | ||||
| 					run("techmap -map +/mul2dsp.v -map +/mchp/{family}_dsp_map.v {options}"); | ||||
| 				else if (family == "pf") // Microchip - map multipliers to DSP
 | ||||
| 					run("techmap -map +/mul2dsp.v -map +/mchp/pf_dsp_map.v -D DSP_A_MAXWIDTH=18 -D DSP_B_MAXWIDTH=18 " | ||||
| 						"-D DSP_A_MAXWIDTH_PARTIAL=18 "	// Partial multipliers are intentionally
 | ||||
| 										// limited to 18x18 in order to take
 | ||||
| 										// advantage of the (PCOUT >> 17) -> PCIN
 | ||||
| 										// dedicated cascade chain capability
 | ||||
| 						"-D DSP_A_MINWIDTH=2 -D DSP_B_MINWIDTH=2 " // Blocks Nx1 multipliers
 | ||||
| 						"-D DSP_Y_MINWIDTH=9 " | ||||
| 						"-D DSP_SIGNEDONLY=1 -D DSP_NAME=$__MUL18X18"); | ||||
| 				 | ||||
| 					run("techmap -map +/mul2dsp.v -map +/microchip/{family}_dsp_map.v {options}"); | ||||
| 				else if (family == "polarfire") // Microchip - map multipliers to DSP
 | ||||
| 					run("techmap -map +/mul2dsp.v -map +/microchip/polarfire_dsp_map.v -D DSP_A_MAXWIDTH=18 -D DSP_B_MAXWIDTH=18 " | ||||
| 					    "-D DSP_A_MAXWIDTH_PARTIAL=18 " // Partial multipliers are intentionally
 | ||||
| 									    // limited to 18x18 in order to take
 | ||||
| 									    // advantage of the (PCOUT >> 17) -> PCIN
 | ||||
| 									    // dedicated cascade chain capability
 | ||||
| 					    "-D DSP_A_MINWIDTH=2 -D DSP_B_MINWIDTH=2 " // Blocks Nx1 multipliers
 | ||||
| 					    "-D DSP_Y_MINWIDTH=9 " | ||||
| 					    "-D DSP_SIGNEDONLY=1 -D DSP_NAME=$__MUL18X18"); | ||||
| 
 | ||||
| 				run("select a:mul2dsp"); | ||||
| 				run("setattr -unset mul2dsp"); | ||||
| 				run("opt_expr -fine"); | ||||
| 				run("wreduce"); | ||||
| 				run("select -clear"); | ||||
| 				if (help_mode) | ||||
| 					run("mchp_dsp -family <family>"); | ||||
| 				else if (family == "pf") // Microchip - absorb cells into DSP
 | ||||
| 					run("mchp_dsp -family " + family); | ||||
| 				 | ||||
| 					run("microchip_dsp -family <family>"); | ||||
| 				else if (family == "polarfire") // Microchip - absorb cells into DSP
 | ||||
| 					run("microchip_dsp -family " + family); | ||||
| 
 | ||||
| 				run("chtype -set $mul t:$__soft_mul"); | ||||
| 			} | ||||
| 		} | ||||
|  | @ -324,41 +321,44 @@ struct SynthMchpPass : public ScriptPass | |||
| 
 | ||||
| 		if (check_label("map_memory")) { | ||||
| 			std::string params = ""; | ||||
| 			std::string LSRAM_map = "+/mchp/LSRAM_map.v"; | ||||
| 			std::string uSRAM_map = "+/mchp/uSRAM_map.v"; | ||||
| 			if (debug_memory) run("write_verilog -noexpr memory_map_pre.vm"); | ||||
| 			std::string LSRAM_map = "+/microchip/LSRAM_map.v"; | ||||
| 			std::string uSRAM_map = "+/microchip/uSRAM_map.v"; | ||||
| 			if (debug_memory) | ||||
| 				run("write_verilog -noexpr memory_map_pre.vm"); | ||||
| 			if (help_mode) { | ||||
| 				params = " [...]"; | ||||
| 			} else { | ||||
| 
 | ||||
| 				if (family == "pf") { | ||||
| 				if (family == "polarfire") { | ||||
| 					// cost of a single bit for memory lowered to soft logic
 | ||||
| 					params += " -logic-cost-rom 0.015625";  | ||||
| 					params += " -logic-cost-rom 0.015625"; | ||||
| 
 | ||||
| 					params += " -lib +/mchp/LSRAM.txt"; | ||||
| 					params += " -lib +/mchp/uSRAM.txt"; | ||||
| 					LSRAM_map = "+/mchp/LSRAM_map.v"; | ||||
| 					uSRAM_map = "+/mchp/uSRAM_map.v"; | ||||
| 					params += " -lib +/microchip/LSRAM.txt"; | ||||
| 					params += " -lib +/microchip/uSRAM.txt"; | ||||
| 					LSRAM_map = "+/microchip/LSRAM_map.v"; | ||||
| 					uSRAM_map = "+/microchip/uSRAM_map.v"; | ||||
| 				} | ||||
| 				if (nobram) params += " -no-auto-block"; | ||||
| 				if (nobram) | ||||
| 					params += " -no-auto-block"; | ||||
| 			} | ||||
| 
 | ||||
| 			// transform memories into intermediate cells
 | ||||
| 			// Cost based transformation. The cost is assigned by us for each cell.
 | ||||
| 			run("memory_libmap" + params); | ||||
| 			if (debug_memory) run("write_verilog -noexpr memory_map_libmap.vm"); | ||||
| 			if (debug_memory) | ||||
| 				run("write_verilog -noexpr memory_map_libmap.vm"); | ||||
| 
 | ||||
| 			// map intermediate cells to actual RAM macros
 | ||||
| 			// NOTE: order doesnt matter here
 | ||||
| 			run("techmap -map " + LSRAM_map); | ||||
| 			run("techmap -map " + uSRAM_map); | ||||
| 			if (debug_memory)  run("write_verilog -noexpr memory_map_final.vm"); | ||||
| 			if (debug_memory) | ||||
| 				run("write_verilog -noexpr memory_map_final.vm"); | ||||
| 		} | ||||
| 
 | ||||
| 		if (check_label("map_ffram")) { | ||||
| 			run("opt -fast -full"); | ||||
| 
 | ||||
| 
 | ||||
| 			// blast unmapped RAM to flops or LUTs
 | ||||
| 			run("memory_map"); | ||||
| 		} | ||||
|  | @ -366,7 +366,8 @@ struct SynthMchpPass : public ScriptPass | |||
| 		if (check_label("fine")) { | ||||
| 			run("opt -full"); | ||||
| 
 | ||||
| 			if (debug_carry) run("write_verilog -noexpr ARI1_cells.vm"); | ||||
| 			if (debug_carry) | ||||
| 				run("write_verilog -noexpr ARI1_cells.vm"); | ||||
| 
 | ||||
| 			if (!nocarry) { | ||||
| 				// converts $mux -> $_MUX_ to allow muxcover to work
 | ||||
|  | @ -376,21 +377,24 @@ struct SynthMchpPass : public ScriptPass | |||
| 				run("simplemap t:$xor"); // only mapping reduce_xor
 | ||||
| 
 | ||||
| 				// mapping based on Yosys internal gates
 | ||||
| 				if (debug_carry) run("write_verilog -noexpr ARI1_pre.vm"); | ||||
| 				if (debug_carry) | ||||
| 					run("write_verilog -noexpr ARI1_pre.vm"); | ||||
| 
 | ||||
| 				// collapse $_AND_/$_OR_/$_XOR_ chains into reduction cells
 | ||||
| 				run("extract_reduce"); | ||||
| 
 | ||||
| 				if (debug_carry) run("write_verilog -noexpr ARI1_extract_reduce.vm"); | ||||
| 				 | ||||
| 				if (debug_carry) | ||||
| 					run("write_verilog -noexpr ARI1_extract_reduce.vm"); | ||||
| 
 | ||||
| 				// pack mux trees into $_MUX4_
 | ||||
| 				run("muxcover -nodecode -mux4=220"); | ||||
| 
 | ||||
| 				if (debug_carry) run("write_verilog -noexpr ARI1_muxcover.vm"); | ||||
| 				 | ||||
| 				run("techmap -map +/mchp/arith_map.v"); | ||||
| 				if (debug_carry) run("write_verilog -noexpr ARI1_post.vm"); | ||||
| 				 | ||||
| 				if (debug_carry) | ||||
| 					run("write_verilog -noexpr ARI1_muxcover.vm"); | ||||
| 
 | ||||
| 				run("techmap -map +/microchip/arith_map.v"); | ||||
| 				if (debug_carry) | ||||
| 					run("write_verilog -noexpr ARI1_post.vm"); | ||||
| 			} | ||||
| 
 | ||||
| 			// convert all remaining cells to gates
 | ||||
|  | @ -403,10 +407,11 @@ struct SynthMchpPass : public ScriptPass | |||
| 			// Needs to be done before logic optimization, so that inverters (inserted
 | ||||
| 			// 			here because of negative-polarity output enable) are handled.
 | ||||
| 			if (help_mode || !noiopad) { | ||||
| 				run("iopadmap -bits -inpad INBUF Y:PAD -outpad OUTBUF D:PAD -toutpad TRIBUFF E:D:PAD -tinoutpad BIBUF E:Y:D:PAD", "(unless -noiobs)"); | ||||
| 				run("iopadmap -bits -inpad INBUF Y:PAD -outpad OUTBUF D:PAD -toutpad TRIBUFF E:D:PAD -tinoutpad BIBUF E:Y:D:PAD", | ||||
| 				    "(unless -noiobs)"); | ||||
| 			} | ||||
| 				 | ||||
| 			std::string techmap_args = "-map +/techmap.v -map +/mchp/cells_map.v"; | ||||
| 
 | ||||
| 			std::string techmap_args = "-map +/techmap.v -map +/microchip/cells_map.v"; | ||||
| 			run("techmap " + techmap_args); | ||||
| 			run("clean"); | ||||
| 		} | ||||
|  | @ -447,14 +452,12 @@ struct SynthMchpPass : public ScriptPass | |||
| 			// $_DLATCH_[NP][NP][01]_			(D-latch + reset to 0/1)
 | ||||
| 			// $_DLATCHSR_[NP][NP][NP]_			(D-latch + set + reset)
 | ||||
| 
 | ||||
| 			 | ||||
| 			if (family == "pf") { | ||||
| 			if (family == "polarfire") { | ||||
| 				std::string params = ""; | ||||
| 				 | ||||
| 
 | ||||
| 				// D-flop with async reset and enable
 | ||||
| 				// posedge CLK, active low reset to 1 or 0, active high EN
 | ||||
| 				params += " -cell $_DFFE_PN?P_ 01";  | ||||
| 				params += " -cell $_DFFE_PN?P_ 01"; | ||||
| 
 | ||||
| 				// D-flop with sync reset and enable, enable takes priority over reset
 | ||||
| 				// posedge CLK, active low reset to 1 or 0, active high EN
 | ||||
|  | @ -466,12 +469,11 @@ struct SynthMchpPass : public ScriptPass | |||
| 
 | ||||
| 				run("dfflegalize" + params, "(Converts FFs to supported types)"); | ||||
| 			} | ||||
| 				 | ||||
| 
 | ||||
| 			if (abc9 || help_mode) { | ||||
| 				if (dff || help_mode) | ||||
| 					run("zinit -all w:* t:$_SDFFCE_*", "('-dff' only)"); | ||||
| 				run("techmap -D NO_LUT -map +/mchp/cells_map.v", "('-abc9' only)"); | ||||
| 				run("techmap -D NO_LUT -map +/microchip/cells_map.v", "('-abc9' only)"); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
|  | @ -482,10 +484,10 @@ struct SynthMchpPass : public ScriptPass | |||
| 			if (help_mode) | ||||
| 				run("abc -luts 2:2,3,6:5[,10,20] [-dff] [-D 1]", "(option for '-nowidelut', '-dff', '-retime')"); | ||||
| 			else if (abc9) { | ||||
|                  | ||||
| 
 | ||||
| 				std::string abc9_opts; | ||||
| 				// for the if command in abc to specify wire delay between adjects LUTs (default = 0)
 | ||||
| 				// NOTE: should not have 0 wire delay between LUTs, 
 | ||||
| 				// NOTE: should not have 0 wire delay between LUTs,
 | ||||
| 				//		 otherwise abc might use LUT2+LUT3 instead of single LUT4
 | ||||
| 				abc9_opts += " -W 300"; | ||||
| 				if (nowidelut) | ||||
|  | @ -493,8 +495,7 @@ struct SynthMchpPass : public ScriptPass | |||
| 				if (dff) | ||||
| 					abc9_opts += " -dff"; | ||||
| 				run("abc9" + abc9_opts); | ||||
| 			} | ||||
| 			else { | ||||
| 			} else { | ||||
| 				std::string abc_opts = " -lut " + lut_size_s; | ||||
| 				if (dff) | ||||
| 					abc_opts += " -dff"; | ||||
|  | @ -505,21 +506,18 @@ struct SynthMchpPass : public ScriptPass | |||
| 			run("clean"); | ||||
| 
 | ||||
| 			if (help_mode || !abc9) | ||||
| 				run("techmap -D NO_LUT -map +/mchp/cells_map.v", "(only if not '-abc9')"); | ||||
| 			std::string techmap_args = "-map +/mchp/cells_map.v -D FINAL_MAP"; | ||||
| 				run("techmap -D NO_LUT -map +/microchip/cells_map.v", "(only if not '-abc9')"); | ||||
| 			std::string techmap_args = "-map +/microchip/cells_map.v -D FINAL_MAP"; | ||||
| 			techmap_args += " -D LUT_WIDTH=" + lut_size_s; | ||||
| 			run("techmap " + techmap_args); | ||||
|              | ||||
| 			if (help_mode || lut_size == 4) | ||||
| 				run("mchp_dffopt"); | ||||
| 
 | ||||
|              | ||||
| 			if (help_mode || lut_size == 4) | ||||
| 				run("microchip_dffopt"); | ||||
| 		} | ||||
| 
 | ||||
| 			run("clkbufmap -buf CLKINT Y:A -inpad CLKBUF Y:PAD"); | ||||
| 
 | ||||
| 			run("clean -purge"); | ||||
| 		run("clkbufmap -buf CLKINT Y:A -inpad CLKBUF Y:PAD"); | ||||
| 
 | ||||
| 		run("clean -purge"); | ||||
| 
 | ||||
| 		if (check_label("check")) { | ||||
| 			run("hierarchy -check"); | ||||
|  | @ -538,6 +536,6 @@ struct SynthMchpPass : public ScriptPass | |||
| 				run(stringf("write_blif %s", blif_file.c_str())); | ||||
| 		} | ||||
| 	} | ||||
| } SynthMchpPass; | ||||
| } SynthMicrochipPass; | ||||
| 
 | ||||
| PRIVATE_NAMESPACE_END | ||||
|  | @ -17,7 +17,7 @@ | |||
| # read verilog files | ||||
| read_verilog Registers.v | ||||
| 
 | ||||
| synth_mchp -top Registers -abc9 -family pf -noiopad | ||||
| synth_microchip -top Registers -abc9 -family polarfire -noiopad | ||||
| 
 | ||||
| # write final outputfile | ||||
| write_verilog -noexpr Registers.vm | ||||
|  | @ -16,6 +16,6 @@ | |||
| 
 | ||||
| read_verilog carryout.v | ||||
| 
 | ||||
| synth_mchp -top carryout -abc9 -family pf -noiopad | ||||
| synth_microchip -top carryout -abc9 -family polarfire -noiopad | ||||
| 
 | ||||
| write_verilog -noexpr carryout.vm | ||||
|  | @ -16,6 +16,6 @@ | |||
| 
 | ||||
| read_verilog cascade.v | ||||
| 
 | ||||
| synth_mchp -top cascade -abc9 -family pf -noiopad | ||||
| synth_microchip -top cascade -abc9 -family polarfire -noiopad | ||||
| 
 | ||||
| write_verilog -noexpr cascade.vm | ||||
|  | @ -15,7 +15,7 @@ | |||
| # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
| read_verilog dff_opt.v  | ||||
| 
 | ||||
| synth_mchp -top dff_opt -abc9 -family pf -noiopad | ||||
| synth_microchip -top dff_opt -abc9 -family polarfire -noiopad | ||||
| 
 | ||||
| # write final outputfile | ||||
| write_verilog -noexpr dff_opt.vm | ||||
|  | @ -16,6 +16,6 @@ | |||
| 
 | ||||
| read_verilog full_dsp.v | ||||
| 
 | ||||
| synth_mchp -top full_dsp -abc9 -family pf -noiopad | ||||
| synth_microchip -top full_dsp -abc9 -family polarfire -noiopad | ||||
| 
 | ||||
| write_verilog -noexpr full_dsp.vm | ||||
|  | @ -16,6 +16,6 @@ | |||
| 
 | ||||
| read_verilog large_mult.v | ||||
| 
 | ||||
| synth_mchp -top large_mult -abc9 -family pf -noiopad | ||||
| synth_microchip -top large_mult -abc9 -family polarfire -noiopad | ||||
| 
 | ||||
| write_verilog -noexpr large_mult.vm | ||||
|  | @ -18,7 +18,7 @@ | |||
| read_verilog mac.v | ||||
| 
 | ||||
| # run the synth flow, specifies top module and additional parameters | ||||
| synth_mchp -top mac -abc9 -family pf -noiopad | ||||
| synth_microchip -top mac -abc9 -family polarfire -noiopad | ||||
| 
 | ||||
| # write final outputfile | ||||
| write_verilog -noexpr mac.vm | ||||
|  | @ -16,6 +16,6 @@ | |||
| 
 | ||||
| read_verilog postAdd_mult.v | ||||
| 
 | ||||
| synth_mchp -top postAdd_mult -abc9 -family pf -noiopad | ||||
| synth_microchip -top postAdd_mult -abc9 -family polarfire -noiopad | ||||
| 
 | ||||
| write_verilog -noexpr postAdd_mult.vm | ||||
|  | @ -16,6 +16,6 @@ | |||
| 
 | ||||
| read_verilog post_adder.v | ||||
| 
 | ||||
| synth_mchp -top post_adder -abc9 -family pf | ||||
| synth_microchip -top post_adder -abc9 -family polarfire | ||||
| 
 | ||||
| write_verilog -noexpr post_adder.vm | ||||
|  | @ -16,6 +16,6 @@ | |||
| 
 | ||||
| read_verilog pre_adder_dsp.v | ||||
| 
 | ||||
| synth_mchp -top pre_adder_dsp -abc9 -family pf -noiopad | ||||
| synth_microchip -top pre_adder_dsp -abc9 -family polarfire -noiopad | ||||
| 
 | ||||
| write_verilog -noexpr pre_adder_dsp.vm | ||||
|  | @ -16,6 +16,6 @@ | |||
| 
 | ||||
| read_verilog ram_SDP.v | ||||
| 
 | ||||
| synth_mchp -top ram_SDP -abc9 -family pf -noiopad | ||||
| synth_microchip -top ram_SDP -abc9 -family polarfire -noiopad | ||||
| 
 | ||||
| write_verilog -noexpr ram_SDP.vm | ||||
|  | @ -16,6 +16,6 @@ | |||
| 
 | ||||
| read_verilog ram_TDP.v | ||||
| 
 | ||||
| synth_mchp -top ram_TDP -abc9 -family pf -noiopad -debug_memory | ||||
| synth_microchip -top ram_TDP -abc9 -family polarfire -noiopad -debug_memory | ||||
| 
 | ||||
| write_verilog -noexpr ram_TDP.vm | ||||
|  | @ -16,6 +16,6 @@ | |||
| 
 | ||||
| read_verilog reduce.v | ||||
| 
 | ||||
| synth_mchp -top reduce -abc9 -family pf -noiopad | ||||
| synth_microchip -top reduce -abc9 -family polarfire -noiopad | ||||
| 
 | ||||
| write_verilog -noexpr reduce.vm | ||||
|  | @ -16,6 +16,6 @@ | |||
| 
 | ||||
| read_verilog reg_c.v | ||||
| 
 | ||||
| synth_mchp -top reg_c -abc9 -family pf -noiopad | ||||
| synth_microchip -top reg_c -abc9 -family polarfire -noiopad | ||||
| 
 | ||||
| write_verilog -noexpr reg_c.vm | ||||
|  | @ -16,6 +16,6 @@ | |||
| 
 | ||||
| read_verilog reg_test.v | ||||
| 
 | ||||
| synth_mchp -top reg_test -abc9 -family pf -noiopad | ||||
| synth_microchip -top reg_test -abc9 -family polarfire -noiopad | ||||
| 
 | ||||
| write_verilog -noexpr reg_test.vm | ||||
|  | @ -16,6 +16,6 @@ | |||
| 
 | ||||
| read_verilog signed_mult.v | ||||
| 
 | ||||
| synth_mchp -top signed_mult -abc9 -family pf -noiopad | ||||
| synth_microchip -top signed_mult -abc9 -family polarfire -noiopad | ||||
| 
 | ||||
| write_verilog -noexpr signed_mult.vm | ||||
|  | @ -16,6 +16,6 @@ | |||
| 
 | ||||
| read_verilog simple_ram.v | ||||
| 
 | ||||
| synth_mchp -top simple_ram -abc9 -family pf -noiopad | ||||
| synth_microchip -top simple_ram -abc9 -family polarfire -noiopad | ||||
| 
 | ||||
| write_verilog -noexpr simple_ram.vm | ||||
|  | @ -16,6 +16,6 @@ | |||
| 
 | ||||
| read_verilog unsigned_mult.v | ||||
| 
 | ||||
| synth_mchp -top unsigned_mult -abc9 -family pf -noiopad | ||||
| synth_microchip -top unsigned_mult -abc9 -family polarfire -noiopad | ||||
| 
 | ||||
| write_verilog -noexpr unsigned_mult.vm | ||||
|  | @ -16,6 +16,6 @@ | |||
| 
 | ||||
| read_verilog uram_ar.v | ||||
| 
 | ||||
| synth_mchp -top uram_ar -abc9 -family pf -noiopad | ||||
| synth_microchip -top uram_ar -abc9 -family polarfire -noiopad | ||||
| 
 | ||||
| write_verilog -noexpr uram_ar.vm | ||||
|  | @ -16,6 +16,6 @@ | |||
| 
 | ||||
| read_verilog uram_sr.v | ||||
| 
 | ||||
| synth_mchp -top uram_sr -abc9 -family pf -noiopad | ||||
| synth_microchip -top uram_sr -abc9 -family polarfire -noiopad | ||||
| 
 | ||||
| write_verilog -noexpr uram_sr.vm | ||||
|  | @ -16,6 +16,6 @@ | |||
| 
 | ||||
| read_verilog widemux.v | ||||
| 
 | ||||
| synth_mchp -top widemux -abc9 -family pf -noiopad | ||||
| synth_microchip -top widemux -abc9 -family polarfire -noiopad | ||||
| 
 | ||||
| write_verilog -noexpr widemux.vm | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue