mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	Added more information to CodingReadme
This commit is contained in:
		
							parent
							
								
									4606addfef
								
							
						
					
					
						commit
						eceecfeb8c
					
				
					 1 changed files with 110 additions and 6 deletions
				
			
		
							
								
								
									
										116
									
								
								CodingReadme
									
										
									
									
									
								
							
							
						
						
									
										116
									
								
								CodingReadme
									
										
									
									
									
								
							|  | @ -4,19 +4,123 @@ Getting Started | ||||||
| =============== | =============== | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| Reading List | Outline of a Yosys command | ||||||
| ------------ | -------------------------- | ||||||
| 
 | 
 | ||||||
| To write Yosys C++ code you need to know at least the following classes in kernel/rtlil.h: | Here is a the C++ code for a "hello_world" Yosys command (hello.cc): | ||||||
|  | 
 | ||||||
|  | 	#include "kernel/yosys.h" | ||||||
|  | 
 | ||||||
|  | 	USING_YOSYS_NAMESPACE | ||||||
|  | 	PRIVATE_NAMESPACE_BEGIN | ||||||
|  | 
 | ||||||
|  | 	struct HelloWorldPass : public Pass { | ||||||
|  | 		HelloWorldPass() : Pass("hello_world") { } | ||||||
|  | 		virtual void execute(vector<string>, Design*) { | ||||||
|  | 			log("Hello World!\n"); | ||||||
|  | 		} | ||||||
|  | 	} HelloWorldPass; | ||||||
|  | 
 | ||||||
|  | 	PRIVATE_NAMESPACE_END | ||||||
|  | 
 | ||||||
|  | This can be built into a Yosys module using the following command: | ||||||
|  | 
 | ||||||
|  | 	yosys-config --exec --cxx --cxxflags --ldflags -o hello.so -shared hello.cc --ldlibs | ||||||
|  | 
 | ||||||
|  | And then executed using the following command: | ||||||
|  | 
 | ||||||
|  | 	yosys -m hello.so -p hello_world | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Yosys Data Structures | ||||||
|  | --------------------- | ||||||
|  | 
 | ||||||
|  | Here is a short list of data structures that you should make yourself familiar | ||||||
|  | with before you write C++ code for Yosys. The following data structures are all | ||||||
|  | defined when "kernel/yosys.h" is included and USING_YOSYS_NAMESPACE is used. | ||||||
|  | 
 | ||||||
|  |   1. Yosys Container Classes | ||||||
|  | 
 | ||||||
|  | Yosys uses dict<K, T> and pool<T> as main container classes. dict<K, T> is | ||||||
|  | essentially a replacement for std::unordered_map<K, T> and pool<T> is | ||||||
|  | essentially a replacement for std::unordered_set<T>. The main differences are: | ||||||
|  | 
 | ||||||
|  | 	- dict<K, T> and pool<T> are about 2x faster than the std containers | ||||||
|  | 
 | ||||||
|  | 	- references to elements in a dict<K, T> or pool<T> are invalidated by | ||||||
|  | 	  insert operations (just like you are used from std::vector<T>). | ||||||
|  | 
 | ||||||
|  | 	- dict<K, T> and pool<T> will have the same order of iteration across | ||||||
|  | 	  all compilers and architectures. | ||||||
|  | 
 | ||||||
|  |   2. Standard STL data types | ||||||
|  | 
 | ||||||
|  | In Yosys we use std::vector<T> and std::string whenever applicable. When | ||||||
|  | dict<K, T> and pool<T> are not suitable then std::map<K, T> and std::set<T> | ||||||
|  | are used instead. | ||||||
|  | 
 | ||||||
|  | The types std::vector<T> and std::string are also available as vector<T> | ||||||
|  | and string in the Yosys namespace. | ||||||
|  | 
 | ||||||
|  |   3. RTLIL objects | ||||||
|  | 
 | ||||||
|  | The current design (essentially a collection of modules, each defined by a | ||||||
|  | netlist) is stored in memory using RTLIL object (declared in kernel/rtlil.h, | ||||||
|  | automatically included by kernel/yosys.h). You should glance over at least | ||||||
|  | the declarations for the following types in kernel/rtlil.h: | ||||||
|  | 
 | ||||||
|  | 	RTLIL::IdString | ||||||
|  | 		This is a handle for an identifier (e.g. cell or wire name). | ||||||
|  | 		It feels a lot like a std::string, but is only a single int | ||||||
|  | 		in size. (The actual string is stored in a global lookup | ||||||
|  | 		table.) | ||||||
|  | 
 | ||||||
|  | 	RTLIL::SigBit | ||||||
|  | 		A single signal bit. I.e. either a constant (0, 1, x, z) or | ||||||
|  | 		a single bit from a wire. | ||||||
|  | 
 | ||||||
|  | 	RTLIL::SigSpec | ||||||
|  | 		Essentially a vector of SigBits. | ||||||
| 
 | 
 | ||||||
| 	RTLIL::Wire | 	RTLIL::Wire | ||||||
| 	RTLIL::Cell | 	RTLIL::Cell | ||||||
|  | 		The building blocks of the netlist in a module. | ||||||
|  | 
 | ||||||
| 	RTLIL::Module | 	RTLIL::Module | ||||||
| 	RTLIL::SigSpec | 	RTLIL::Design | ||||||
|  | 		The module is a container with connected cells and wires | ||||||
|  | 		in it. The design is a container with modules in it. | ||||||
|  | 
 | ||||||
|  | All this types are also available without the RTLIL:: prefix in the Yosys | ||||||
|  | namespace. | ||||||
|  | 
 | ||||||
|  |   4. SigMap and other Helper Classes | ||||||
|  | 
 | ||||||
|  | There are a couple of additional helper classes that are in wide use | ||||||
|  | in Yosys. Most importantly there is SigMap (declared in kernel.sigtools.h). | ||||||
|  | 
 | ||||||
|  | When a design has many wires in it that are connected to each other, then | ||||||
|  | a single signal bit can have multiple valid names. The SigMap object can | ||||||
|  | be used to map SigSpecs or SigBits to unique SigSpecs and SigBits that | ||||||
|  | consitently only uses one wire from a group of connected wires. For example: | ||||||
|  | 
 | ||||||
|  | 	SigBit a = module->addWire(NEW_ID); | ||||||
|  | 	SigBit b = module->addWire(NEW_ID); | ||||||
|  | 	module->connect(a, b); | ||||||
|  | 
 | ||||||
|  | 	log("%d\n", a == b); // will print 0 | ||||||
|  | 
 | ||||||
|  | 	SigMap sigmap(module); | ||||||
|  | 	log("%d\n", sigmap(a) == sigmap(b)); // will print 1 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Example Code | ||||||
|  | ------------ | ||||||
| 
 | 
 | ||||||
| The following yosys commands are a good starting point if you are looking for examples | The following yosys commands are a good starting point if you are looking for examples | ||||||
| of how to use the Yosys API: | of how to use the Yosys API: | ||||||
| 
 | 
 | ||||||
|  | 	manual/CHAPTER_Prog/stubnets.cc | ||||||
| 	passes/opt/wreduce.cc | 	passes/opt/wreduce.cc | ||||||
| 	passes/techmap/maccmap.cc | 	passes/techmap/maccmap.cc | ||||||
| 
 | 
 | ||||||
|  | @ -25,7 +129,7 @@ Notes on the existing codebase | ||||||
| ------------------------------ | ------------------------------ | ||||||
| 
 | 
 | ||||||
| For historical reasons not all parts of Yosys adhere to the current coding | For historical reasons not all parts of Yosys adhere to the current coding | ||||||
| styles.  When adding code to existing parts of the system, adhere to this guide | style. When adding code to existing parts of the system, adhere to this guide | ||||||
| for the new code instead of trying to mimic the style of the surrounding code. | for the new code instead of trying to mimic the style of the surrounding code. | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -62,7 +166,7 @@ gcc 4.6 is allowed in Yosys code. This will change in future releases. | ||||||
| 
 | 
 | ||||||
| In general Yosys uses "int" instead of "size_t". To avoid compiler | In general Yosys uses "int" instead of "size_t". To avoid compiler | ||||||
| warnings for implicit type casts, always use "GetSize(foobar)" instead | warnings for implicit type casts, always use "GetSize(foobar)" instead | ||||||
| of "foobar.size()". (GetSize() is defined by kernel/yosys.h) | of "foobar.size()". (GetSize() is defined in kernel/yosys.h) | ||||||
| 
 | 
 | ||||||
| Use range-based for loops whenever applicable. | Use range-based for loops whenever applicable. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue