Aixt is a programming framework for microcontrollers which uses a modern language syntax based on V and able to be used by low-resource devices. Aixt is composed by 3 main components:
- The Aixt programming language based on the V language syntax.
- The Aixt to C Transpiler, which translate the Aixt source code to C, for the specific C compiler of each microcontroller.
- The Aixt API, which makes the programming easy by standardizing the setup and I/O functions.
This diagram shows the Aixt blocks and their interactions:
stateDiagram-v2
Aixt: Aixt (V-based)
state Aixt {
source: Source code
API: Microcontroller API
state API {
PICs: PIC
ATM: AT
ESP
RP2040
PSoC
others2: ...
NXT: NXT brick
}
}
Aixt2C: Transpiler
state Aixt2C {
state V {
Transpiler: Transpiler
}
state TOML {
setup: Setup file
}
}
C: C
state C {
Tr_Code: Transpiled code
}
state Compiler {
XC8
XC16
Arduino
GCC
others: ...
nbc: nbc (NXC)
}
state machine {
BF: Binary file
}
source --> Aixt2C
API --> Aixt2C
Aixt2C --> C
C --> Compiler
Compiler --> machine
Aixt is designed as modular as possible to facilitate the incorporation of new devices and boards. This is mainly possible by using a configuration file (in TOML format) instead of creating new source code for each new device. That .TOML
file contains the specific parameters of each device, board or compiler such as: variable types, initialization commands, compiler paths, etc.
The transpiler is written in V and uses V's native compiler facilities to transpile from V to C. This is implemented in the folders \aixt_build
and \aixt_cgen
, and the main source code is the aixt.v
file. It generates code for 3 different backends:
- c: for the microcontroller native C compiler
- nxc: for the NXC compiler (LEGO Mindstorms NXT)
- arduino: for the Arduino IDE WIP...
Aixt programing language implements a subset of the V language. The main differences are show as follows:
feature | V | Aixt |
---|---|---|
variables | immutable by default | mutable by default |
strings | dynamic-sized | dynamic-sized (only if supported) |
arrays | dynamic-sized | dynamic-sized (only if supported) |
default integers size | 32 bits | depends on the device |
structs | allow functions (object-oriented) | don't allow functions (only structured) |
functions | multiple return values | only one return value |
C-style preprocessor commands | only V specific ones and #include |
support any command starting with # |
C.functions() |
need to explicitly include the C file | auto include function.c for C.function() |
/* Turning ON by 5.5 seconds the onboard LED 10 in the Explorer16
board with a PIC24FJ microcontroller (XC16 compiler) */
import time { sleep_ms }
import pin { high, low }
fn main() {
high(led10) //turn ON the LED 10 (PORTA7)
sleep_ms(5500)
low(led10)
}
// Blinking LEDs on the Seeeduino XIAO-SAM21 board (Arduino backend)
import time
import pin
pin.setup(2, pin.output)
pin.setup(3, pin.output)
for i in 0 .. 10 { // 10 times
pin.high(2)
time.sleep_ms(250)
pin.low(2)
time.sleep_ms(250)
}
for {
pin.high(3)
time.sleep(1)
pin.low(3)
time.sleep(2)
}
The Aixt API is inspired by Micropython, Arduino and Tinygo. The API for all the ports includes at least functions for:
- Digital input/output
- Analog inputs (ADC)
- PWM outputs
- Serial port (UART)
git clone https://github.com/fermarsan/aixt.git
cd aixt
make # make.bat on Windows
run it in a Linux-based system as:
./aixt <command> <device_or_board> <source_file>
or in Windows:
aixt.exe <command> <device_or_board> <source_file>
./aixt -t Emulator test.v
./aixt -b NXT ports/NXT/projects/1_motor_forward.v
The project's name is inspired in Veasel, the Weasel pet of V Language, and at the same time is a tribute to Ticuna people who live in the Amazon forest between the borders of Colombia, Brasil and Perú. Weasels are mustelids just like otters, so the name Aixt comes from Aixtü, which is a way to say otter in Ticuna language.
Nice, you can contact me via mail.
Email: [email protected]
Cool, go ahead and make the contributions you want, then submit a new pull request
The microcontroller or board that you use is not listed here and you know how to program it in C?... You can easily add it to Aixt, please check CONTRIBUTING.md.
Take a look at TODO.md to find a task for you.
Please check CONTRIBUTING.md to learn how you can contribute.
The Aixt project is licensed under the MIT, which is attached in this repository.