The WYSIWYG primitives really only control the synthesis of the LUT, not the input usage. 99% of the time that's what you want, since you don't want synthesis forcing specific LUT usage when it has no idea how it's going to place/route. (Remember that WYSIWYG are used by 3rd party synthesis, and probably internally). Forcing specific input usage would greatly restrict routability and hurt timing.
In essence, there would need to be two WYSIWYG primitives, one that has fixed inputs or one that lets them rotate(actually, an attribute would make more sense, but there isn't one).
In general, it makes sense to control this in the router .rcf, since fixing the inputs without fixing the routes is usually pretty useless. The router has more variation than the path through the LUT. Note that you can wildcard the .rcf a lot. Here's some examples:
A global routing can be input to Quartus as an .rcf file where only the channels to be used to complete the router are specified. This is done by using wildcarding, choice and the zero_or_more keyword to allow Quartus to choose the type and number of wires in each channel. For example:
signal_name = Input3 {
IO_DATAIN:*;
zero_or_more, R4:X*Y30* || R8:X*Y30* || R24:X*Y30*; # (1)
zero_or_more, C4:X7* || C8:X7* || C16:X7*; # (2)
LOCAL_INTERCONNECT:*;
dest = ( nor3, DATAA );
}
The RCF fragment above indicates we desire a route that uses as many horizontal wires in the Y = 30 channel as necessary, and then as many vertical wires in the X = 7 channel as necessary. Any set of wires that matches these constraints is acceptable.
Note that lines (1) and (2) can be re-written in more compact but slightly more general form as follows:
zero_or_more, *:X*Y30*; # (1’)
zero_or_more, *:X7*; # (2’)
The only difference between (1) and (1’) is that other routing resources, besides R4, R8, and R24, will be allowed for that step.
• Wire Type Routers
A wire type router produces somewhat more detailed output than a global router. It not only says what routing channels to use, but also what type of wire to use, and potentially, how many of each type of wire. It does not specify exactly which wires should be used to implement route, however, it simply specifies their types. For example, the RCF fragment below specifies that this net should be routed using one R8 wire, followed by one C8 wire. Quartus is free to choose which R8 and which C8 wire to use.
signal_name = Input3 {
IO_DATAIN:*;
R8:*;
C8:*;
LOCAL_INTERCONNECT:*;
dest = ( nor3, DATAA );
}
The example below specifies not only what types of wires to use, but also which channel each should be in.
signal_name = Input3 {
IO_DATAIN:*;
R8:X*Y30*;
C8:X7*;
LOCAL_INTERCONNECT:*;
dest = ( nor3, DATAA );
}
The example below is even simpler as it allows Quartus to choose how to get in and out of the function blocks, and simply specifies the types and channels of the wires to be used between the function blocks.
signal_name = Input3 {
zero_or_more, *; # Quartus can start the route as it pleases
R8:X*_Y30*; # Must use one R8 wire in the Y=30 channel.
C8:X7*; # Must use one C8 wire in the X=7 channel.
zero_or_more, *; # Quartus can end the route as it pleases.
dest = ( nor3, DATAA );
}