nixfiles/libs/core/lib/target/architecture.nix
Sebastian Walz 860d31cee1
Tohu vaBohu
2023-04-21 00:22:52 +02:00

139 lines
8.5 KiB
Nix

{ debug, integer, intrinsics, list, set, string, type, ... }:
let
Architecture#: struct { bits: integer, endianness: Endianness, family: Family }
= type "Architecture"
{
inherit Endianness Family;
inherit all families;
from#: type -> (string | Architecture)? -> Architecture
= architecture:
if !(Architecture.isInstanceOf architecture)
then
type.matchPrimitiveOrPanic architecture
{
null = all.unknown;
string = all.${architecture} or (debug.panic "Architecture" "Unknown architecture »${architecture}«!");
}
else
architecture;
};
Endianness#: enum { big, little, none }
= type.enum "Endianness"
{
big = 1;
little = 2;
none = 3;
};
Family#: type
= type "Family"
{};#{ name = string; arch = string || null; version = integer || null; };
all#: { string -> Architecture }
= let
new#: integer -> Endianness -> Family -> Architecture
= bits:
endianness:
family:
Architecture.instanciate
{
__toString = { name, ... }: name;
inherit bits endianness family;
};
all
= {
aarch64 = new 64 Endianness.little families.arm8-a;
aarch64_be = new 64 Endianness.big families.arm8-a;
alpha = new 64 Endianness.little families.alpha;
amd64 = new 64 Endianness.little families.amd64;
arm = new 32 Endianness.little families.arm;
armv5tel = new 32 Endianness.little families.arm5t;
armv6m = new 32 Endianness.little families.arm6-m;
armv6l = new 32 Endianness.little families.arm6;
armv7a = new 32 Endianness.little families.arm7-a;
armv7r = new 32 Endianness.little families.arm7-r;
armv7m = new 32 Endianness.little families.arm7-m;
armv7l = new 32 Endianness.little families.arm7;
armv8a = new 32 Endianness.little families.arm8-a;
armv8r = new 32 Endianness.little families.arm8-a;
armv8m = new 32 Endianness.little families.arm8-m;
avr = new 8 Endianness.none families.avr;
i386 = new 32 Endianness.little families.i386;
i486 = new 32 Endianness.little families.i486;
i586 = new 32 Endianness.little families.i586;
i686 = new 32 Endianness.little families.i686;
js = new 32 Endianness.little families.js;
m68k = new 32 Endianness.big families.m68k;
microblaze = new 32 Endianness.big families.microblaze;
microblazeel = new 32 Endianness.little families.microblaze;
mips = new 32 Endianness.big families.mips;
mips64 = new 64 Endianness.big families.mips;
mips64el = new 64 Endianness.little families.mips;
mipsel = new 32 Endianness.little families.mips;
mmix = new 64 Endianness.big families.mmix;
msp430 = new 16 Endianness.little families.msp430;
or1k = new 32 Endianness.big families.or1k;
powerpc = new 32 Endianness.big families.power;
powerpc64 = new 64 Endianness.big families.power;
powerpc64le = new 64 Endianness.little families.power;
powerpcle = new 32 Endianness.little families.power;
riscv32 = new 32 Endianness.little families.riscv;
riscv64 = new 64 Endianness.little families.riscv;
rx = new 32 Endianness.little families.rx;
s390 = new 32 Endianness.big families.s390;
s390x = new 64 Endianness.big families.s390;
sparc = new 32 Endianness.big families.sparc;
sparc64 = new 64 Endianness.big families.sparc;
unknown = new null Endianness.none families.unknown;
vc4 = new 32 Endianness.little families.vc4;
wasm32 = new 32 Endianness.little families.wasm;
wasm64 = new 64 Endianness.little families.wasm;
x86_64 = all.amd64;
};
in
set.name all;
families#: { string -> Family }
= {
alpha = { name = "alpha"; };
amd64 = families.x86 // { arch = "amd64"; };
arm = { name = "arm"; };
arm5 = families.arm // { arch = "armv5"; version = 5; };
arm5t = families.arm5 // { arch = "armv5t"; };
arm6 = families.arm // { arch = "armv6"; version = 6; };
arm6-m = families.arm6 // { arch = "armv6-m"; };
arm7 = families.arm // { arch = "armv7"; version = 7; };
arm7-a = families.arm7 // { arch = "armv7-a"; };
arm7-m = families.arm7 // { arch = "armv7-m"; };
arm7-r = families.arm7 // { arch = "armv7-r"; };
arm8 = families.arm // { arch = "armv8"; version = 8; };
arm8-a = families.arm8 // { arch = "armv8-a"; };
arm8-m = families.arm8 // { arch = "armv8-m"; };
avr = { name = "avr"; };
i386 = families.x86 // { arch = "i386"; };
i486 = families.x86 // { arch = "i486"; };
i586 = families.x86 // { arch = "i586"; };
i686 = families.x86 // { arch = "i686"; };
js = { name = "js"; };
m68k = { name = "m68k"; };
microblaze = { name = "microblaze"; };
mips = { name = "mips"; };
mmix = { name = "mmix"; };
msp430 = { name = "msp430"; };
or1k = { name = "or1k"; };
power = { name = "power"; };
riscv = { name = "riscv"; };
rx = { name = "rx"; };
s390 = { name = "s390"; };
sparc = { name = "sparc"; };
unknown = { name = "unknown"; };
vc4 = { name = "vc4"; };
wasm = { name = "wasm"; };
x86 = { name = "x86"; };
x86_64 = families.amd64;
};
in
Architecture