Home

Awesome

<div align="center"> <img src="assets/text-logo-sh.png" width="24%" height="24%"> <h1>V-based Programming Framework for Microcontrollers</h1> </div>

Aixt is a programming framework for microcontrollers which implements a subset of the V programming language, and is able to be used by low-resource devices. Aixt is composed by 3 main components:

This diagram shows the Aixt blocks and their interactions:

stateDiagram-v2

    Aixt: V
    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 json {
            setup: Setup files
        }
    }

    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 to be as modular as possible to facilitate the incorporation of new devices and boards. This is mainly possible by using a configuration files (in json format) instead of creating new source code for each new device. That .json file contains the specific parameters of each device, board or compiler such as: variable types, initialization commands, compiler paths, etc.

Aixt to C Transpiler

The transpiler is written in V and uses the V's self native compiler in order to transpile from V to C. This is implemented in the folder src\ and the main source code is the src\aixt.v file. Aixt generates code for 3 different backends:

Aixt's V Language

Aixt's V programing language implements a subset of the V language. The main differences are show as follows:

featureVAixt's V
stringsdynamic-sizedfixed-sized and dynamic-sized if supported
arraysdynamic-sizedfixed-sized and dynamic-sized if supported
default integers size32 bitsdepends on the device
structsallow functions (object-oriented)do not allow functions (only structured programming)
functionsmultiple return valuesonly one return value
text macrosnot allowedallowed by using '@[as_macro]' attribute, for functions and constants
C variables accessnot allowedallowed by using 'C.var_name' syntax
global variablesdisabled by defaultenabled by default

Example with main function

/* Turning ON by 5.5 seconds the B7 on a
PIC16F84A microcontroller (XC8 compiler) */
import time
import pin

fn main() {
    pin.setup(pin.b7, pin.output)

    pin.high(pin.b7)    //turn ON the LED on PORTB7
    time.sleep_ms(5500)
    pin.low(pin.b7)
}

Example without main function (Script mode)

// ADC value to serial port on Raspberry Pi Pico (Arduino backend)
import time
import uart
import adc

uart.setup(9600)    // baud rate
adc.setup(12)       // resolution

for { // infinite loop
	analog := adc.read(adc.ch0)
	uart.println('ADC channel 0: ${analog}') // use string interpolation
	time.sleep_ms(500)
}

Aixt API

The Aixt API is inspired by Micropython, Arduino and Tinygo. The API for all the ports includes at least functions for:

Using Aixt

Installing Aixt from source

git clone https://github.com/fermarsan/aixt.git
cd aixt
make # make.bat on Windows

Running Aixt

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>

Generating a Symbolic Link

For running the command aixt from any folder in the file system you can create a symbolic link of it in this way:

run it in a Linux-based system as:

./aixt symlink

or in Windows:

aixt.exe symlink

Running examples:

./aixt -t Emulator test.v
./aixt -b NXT ports/NXT/projects/1_motor_forward.v

Project's name

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.

Have questions?

Nice, you can contact me via mail.

Email: fmartinezsanta@gmail.com

<!-- Discord : https://discord.gg/-->

Want to contribute?

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.

License

The Aixt project is licensed under the MIT, which is attached in this repository.