The problem is the structure you need to use to represent this kind of thing. A programmable logic controller can do this because it is interpretive and therefore can handle complex nesting. However, Access wants that in a different and less free-form structure.
Making a report out of it involves the possibility of recursion, which almost instantly rules out SQL-based queries because the math model on which SQL is based doesn't understand iteration and recursion. Only code can do that. And in turn, that kills the ability to use anything normally based on a recordset, which is implicitly formed from an SQL operation. Topologically, I can't see it.
You could do this in VBA code and create files that you build dynamically. But to do it straight-out from "ordinary" Access methods requires you to SEVERELY restrict your model. I can see one way to do single-layer grouping, but a second layer would be impossible without recursive calls.
Have your Assembly s/w table contain two kinds of entries. (A) single items and (B) packages. Use an IndividualItems table that actually enumerates the individual names of items independent of assembly membership. You will have an assembly members table that lists elements of an assembly.
The Assembly table has a name and a primary key. Maybe a flag that says Single or Package. That's all.
The AssemblyComponents table is a junction table that lists every IndividualItem member of the given assembly. PK of Assembly is one column, PK of IndividualItem table is another column. An assembly with one item that is self-contained has one record in the assembly components table. An assembly with two items has two records in the components table, and so on.
One last table - the prerequisites. This lists an element from the Assembly table and one or more OTHER MEMBERS OF THE SAME TABLE as prerequisites. A self-contained package has zero prerequisites. The logic of this table must be such that it is an OR table. I.e. if you have three listed prerequisites, you only need one of them to be complete in order to run the package.
Now to do the case for #1 requires (#2 AND #3) OR #4... (and #5 is a stand-alone case)
Assembly record #1 has component items SW#1
Assembly record #2 has component items SW#2 and SW#3
Assembly record #4 has component items SW#4
Assembly record #5 has component items SW#5
The prerequisite tables show:
Record for assembly #1 shows assembly #4
Record for assembly #1 shows assembly #2
No entry for assembly #5
Assembly #2 shows the AND of end-items #2 and #3. Prerequisite table shows that #1 requires assembly #4 or #1 requires assembly #2. Assembly #5 doesn't need anything.
You can continue to nest recursively by making assembles of assemblies. At some point you will get disgusted with the gyrations required, but this might do the job for you.