python

Dependencies:   TSI mbed

Fork of pymite by Norimasa Okamoto

Revision:
0:65f1469d6bfb
Child:
1:28afb064a41c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/platform/mbed/main_nat.cpp	Sat Mar 02 11:54:20 2013 +0000
@@ -0,0 +1,1472 @@
+#undef __FILE_ID__
+#define __FILE_ID__ 0x0A
+/**
+ * PyMite usr native function file
+ *
+ * automatically created by pmImgCreator.py
+ * on Sat Mar 02 20:27:03 2013
+ *
+ * DO NOT EDIT THIS FILE.
+ * ANY CHANGES WILL BE LOST.
+ *
+ * @file    main_nat.cpp
+ */
+
+#define __IN_LIBNATIVE_C__
+#include "pm.h"
+
+/* From: mbed.py */
+#include "mbed.h"
+
+static DigitalOut led1(LED1);
+static DigitalOut led2(LED2);
+static DigitalOut led3(LED3);
+static DigitalOut led4(LED4);
+
+/* PinName lookup table.  Converts pin number to PinName. */
+static PinName const pinNumToName[] = {
+    NC, LED1, LED2, LED3, LED4, p5, p6, p7, p8, p9,
+    p10, p11, p12, p13, p14, p15, p16, p17, p18, p19,
+    p20, p21, p22, p23, p24, p25, p26, p27, p28, p29,
+    p30
+};
+
+PmReturn_t
+nat_placeholder_func(pPmFrame_t *ppframe)
+{
+
+    /*
+     * Use placeholder because an index 
+     * value of zero denotes the stdlib.
+     * This function should not be called.
+     */
+    PmReturn_t retval;
+    PM_RAISE(retval, PM_RET_EX_SYS);
+    return retval;
+
+}
+
+PmReturn_t
+nat_01_mbed___init__(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        AnalogIn *adc;
+        uint8_t objid;
+
+        /* Raise TypeError if wrong number of args */
+        if (NATIVE_GET_NUM_ARGS() != 2)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Raise TypeError if arg is not the right type */
+        pn = NATIVE_GET_LOCAL(1);
+        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_INT)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+
+        /* Instantiate the C++ object */
+        adc = new AnalogIn(pinNumToName[((pPmInt_t)pn)->val]);
+
+        /* Save the pointer to adc as an inaccessible attribute */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = int_new((uint32_t)adc, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        heap_gcPushTempRoot(pn, &objid);
+        retval = dict_setItem(pattrs, PM_NONE, pn);
+        heap_gcPopTempRoot(objid);
+        PM_RETURN_IF_ERROR(retval);
+
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+        
+}
+
+PmReturn_t
+nat_02_mbed_read_u16(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        AnalogIn *adc;
+        int32_t n;
+
+        /* If wrong number of args, throw type exception */
+        if (NATIVE_GET_NUM_ARGS() != 1)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Get the the C++ instance */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = dict_getItem(pattrs, PM_NONE, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        adc = (AnalogIn *)((pPmInt_t)pn)->val;
+
+        /* Return input value on the stack */
+        n = adc->read_u16();
+        retval = int_new(n, &pn);
+        NATIVE_SET_TOS(pn);
+
+        return retval;
+        
+}
+
+PmReturn_t
+nat_03_mbed_read(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        AnalogIn *adc;
+        float n;
+
+        /* Raise TypeError if wrong number of args */
+        if (NATIVE_GET_NUM_ARGS() != 1)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Get the the C++ instance */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = dict_getItem(pattrs, PM_NONE, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        adc = (AnalogIn *)((pPmInt_t)pn)->val;
+
+        /* Return input value on the stack */
+        n = adc->read();
+        retval = float_new(n, &pn);
+        NATIVE_SET_TOS(pn);
+
+        return retval;
+        
+}
+
+PmReturn_t
+nat_04_mbed___init__(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        AnalogOut *dac;
+        uint8_t objid;
+
+
+        /* Raise TypeError if wrong number of args */
+        if (NATIVE_GET_NUM_ARGS() != 2)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Raise TypeError if arg is not the right type */
+        pn = NATIVE_GET_LOCAL(1);
+        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_INT)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+
+        /* Instantiate the object */
+        dac = new AnalogOut(pinNumToName[((pPmInt_t)pn)->val]);
+
+        /* Save the pointer to adc as an inaccessible attribute */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = int_new((uint32_t)dac, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        heap_gcPushTempRoot(pn, &objid);
+        retval = dict_setItem(pattrs, PM_NONE, pn);
+        heap_gcPopTempRoot(objid);
+        PM_RETURN_IF_ERROR(retval);
+
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+        
+}
+
+PmReturn_t
+nat_05_mbed_write_u16(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        AnalogOut *dac;
+
+        /* Raise TypeError if wrong number of args */
+        if (NATIVE_GET_NUM_ARGS() != 2)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Raise TypeError if arg is not the right type */
+        pn = NATIVE_GET_LOCAL(1);
+        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_INT)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+
+        /* Get the the C++ instance */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = dict_getItem(pattrs, PM_NONE, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        dac = (AnalogOut *)((pPmInt_t)pn)->val;
+
+        /* Write value to DAC */
+        pn = NATIVE_GET_LOCAL(1);
+        dac->write_u16(((pPmInt_t)pn)->val);
+
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+        
+}
+
+PmReturn_t
+nat_06_mbed_write(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        AnalogOut *dac;
+        float n;
+
+        /* Raise TypeError if wrong number of args */
+        if (NATIVE_GET_NUM_ARGS() != 2)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Raise TypeError if arg is not the right type */
+        pn = NATIVE_GET_LOCAL(1);
+        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_FLT)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+
+        /* Get the the C++ instance */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = dict_getItem(pattrs, PM_NONE, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        dac = (AnalogOut *)((pPmInt_t)pn)->val;
+
+        /* Saturate and write value to DAC */
+        pn = NATIVE_GET_LOCAL(1);
+        n = ((pPmFloat_t)pn)->val;
+        if (n < 0.0)
+        {
+            n = 0.0;
+        }
+        else if (n > 1.0)
+        {
+            n = 1.0;
+        }
+        dac->write(n);
+
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+        
+}
+
+PmReturn_t
+nat_07_mbed_read(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        AnalogOut *dac;
+        float n;
+
+        /* Raise TypeError if wrong number of args */
+        if (NATIVE_GET_NUM_ARGS() != 1)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Get the the C++ instance */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = dict_getItem(pattrs, PM_NONE, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        dac = (AnalogOut *)((pPmInt_t)pn)->val;
+
+        /* Return output value on the stack */
+        n = dac->read();
+        retval = float_new(n, &pn);
+        NATIVE_SET_TOS(pn);
+
+        return retval;
+        
+}
+
+PmReturn_t
+nat_08_mbed___init__(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        DigitalIn *din;
+        uint8_t objid;
+
+        /* Raise TypeError if wrong number of args */
+        if (NATIVE_GET_NUM_ARGS() != 2)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Raise TypeError if arg is not the right type */
+        pn = NATIVE_GET_LOCAL(1);
+        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_INT)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+
+        /* Instantiate the C++ object */
+        din = new DigitalIn(pinNumToName[((pPmInt_t)pn)->val]);
+
+        /* Save the pointer to adc as an inaccessible attribute */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = int_new((uint32_t)din, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        heap_gcPushTempRoot(pn, &objid);
+        retval = dict_setItem(pattrs, PM_NONE, pn);
+        heap_gcPopTempRoot(objid);
+        PM_RETURN_IF_ERROR(retval);
+
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+        
+}
+
+PmReturn_t
+nat_09_mbed_read(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        DigitalIn *din;
+        int32_t n;
+
+        /* If wrong number of args, throw type exception */
+        if (NATIVE_GET_NUM_ARGS() != 1)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Get the the C++ instance */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = dict_getItem(pattrs, PM_NONE, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        din = (DigitalIn *)((pPmInt_t)pn)->val;
+
+        /* Return input value on the stack */
+        n = din->read();
+        retval = int_new(n, &pn);
+        NATIVE_SET_TOS(pn);
+
+        return retval;
+        
+}
+
+PmReturn_t
+nat_10_mbed___init__(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        DigitalOut *dout;
+        uint8_t objid;
+
+        /* Raise TypeError if wrong number of args */
+        if (NATIVE_GET_NUM_ARGS() != 2)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Raise TypeError if arg is not the right type */
+        pn = NATIVE_GET_LOCAL(1);
+        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_INT)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+
+        /* Instantiate the C++ object */
+        dout = new DigitalOut(pinNumToName[((pPmInt_t)pn)->val]);
+
+        /* Save the pointer to adc as an inaccessible attribute */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = int_new((uint32_t)dout, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        heap_gcPushTempRoot(pn, &objid);
+        retval = dict_setItem(pattrs, PM_NONE, pn);
+        heap_gcPopTempRoot(objid);
+        PM_RETURN_IF_ERROR(retval);
+
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+        
+}
+
+PmReturn_t
+nat_11_mbed_read(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        DigitalOut *dout;
+        int32_t n;
+
+        /* If wrong number of args, throw type exception */
+        if (NATIVE_GET_NUM_ARGS() != 1)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Get the the C++ instance */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = dict_getItem(pattrs, PM_NONE, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        dout = (DigitalOut *)((pPmInt_t)pn)->val;
+
+        /* Return input value on the stack */
+        n = dout->read();
+        retval = int_new(n, &pn);
+        NATIVE_SET_TOS(pn);
+
+        return retval;
+        
+}
+
+PmReturn_t
+nat_12_mbed_write(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        DigitalOut *dout;
+
+        /* Raise TypeError if wrong number of args */
+        if (NATIVE_GET_NUM_ARGS() != 2)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Raise TypeError if arg is not the right type */
+        pn = NATIVE_GET_LOCAL(1);
+        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_INT)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+
+        /* Get the the C++ instance */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = dict_getItem(pattrs, PM_NONE, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        dout = (DigitalOut *)((pPmInt_t)pn)->val;
+
+        /* Write value to DAC */
+        pn = NATIVE_GET_LOCAL(1);
+        dout->write(((pPmInt_t)pn)->val);
+
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+        
+}
+
+PmReturn_t
+nat_13_mbed___init__(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        PwmOut *pwm;
+        uint8_t objid;
+
+        /* Raise TypeError if wrong number of args */
+        if (NATIVE_GET_NUM_ARGS() != 2)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Raise TypeError if arg is not the right type */
+        pn = NATIVE_GET_LOCAL(1);
+        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_INT)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+
+        /* Instantiate the C++ object */
+        pwm = new PwmOut(pinNumToName[((pPmInt_t)pn)->val]);
+
+        /* Save the pointer to pwm as an inaccessible attribute */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = int_new((uint32_t)pwm, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        heap_gcPushTempRoot(pn, &objid);
+        retval = dict_setItem(pattrs, PM_NONE, pn);
+        heap_gcPopTempRoot(objid);
+        PM_RETURN_IF_ERROR(retval);
+
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+        
+}
+
+PmReturn_t
+nat_14_mbed_read(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        DigitalOut *dout;
+        int32_t n;
+
+        /* If wrong number of args, throw type exception */
+        if (NATIVE_GET_NUM_ARGS() != 1)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Get the the C++ instance */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = dict_getItem(pattrs, PM_NONE, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        dout = (DigitalOut *)((pPmInt_t)pn)->val;
+
+        /* Return input value on the stack */
+        n = dout->read();
+        retval = int_new(n, &pn);
+        NATIVE_SET_TOS(pn);
+
+        return retval;
+        
+}
+
+PmReturn_t
+nat_15_mbed_period(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        PwmOut *pwm;
+
+        /* Raise TypeError if wrong number of args */
+        if (NATIVE_GET_NUM_ARGS() != 2)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Raise TypeError if arg is not the right type */
+        pn = NATIVE_GET_LOCAL(1);
+        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_INT)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+
+        /* Get the the C++ instance */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = dict_getItem(pattrs, PM_NONE, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        pwm = (PwmOut *)((pPmInt_t)pn)->val;
+
+        /* Write value to DAC */
+        pn = NATIVE_GET_LOCAL(1);
+        pwm->period(((pPmInt_t)pn)->val);
+
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+        
+}
+
+PmReturn_t
+nat_16_mbed_period_ms(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        PwmOut *pwm;
+
+        /* Raise TypeError if wrong number of args */
+        if (NATIVE_GET_NUM_ARGS() != 2)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Raise TypeError if arg is not the right type */
+        pn = NATIVE_GET_LOCAL(1);
+        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_INT)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+
+        /* Get the the C++ instance */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = dict_getItem(pattrs, PM_NONE, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        pwm = (PwmOut *)((pPmInt_t)pn)->val;
+
+        /* Write value to DAC */
+        pn = NATIVE_GET_LOCAL(1);
+        pwm->period_ms(((pPmInt_t)pn)->val);
+
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+        
+}
+
+PmReturn_t
+nat_17_mbed_period_us(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        PwmOut *pwm;
+
+        /* Raise TypeError if wrong number of args */
+        if (NATIVE_GET_NUM_ARGS() != 2)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Raise TypeError if arg is not the right type */
+        pn = NATIVE_GET_LOCAL(1);
+        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_INT)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+
+        /* Get the the C++ instance */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = dict_getItem(pattrs, PM_NONE, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        pwm = (PwmOut *)((pPmInt_t)pn)->val;
+
+        /* Write value to DAC */
+        pn = NATIVE_GET_LOCAL(1);
+        pwm->period_us(((pPmInt_t)pn)->val);
+
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+        
+}
+
+PmReturn_t
+nat_18_mbed_pulsewidth(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        PwmOut *pwm;
+
+        /* Raise TypeError if wrong number of args */
+        if (NATIVE_GET_NUM_ARGS() != 2)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Raise TypeError if arg is not the right type */
+        pn = NATIVE_GET_LOCAL(1);
+        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_INT)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+
+        /* Get the the C++ instance */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = dict_getItem(pattrs, PM_NONE, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        pwm = (PwmOut *)((pPmInt_t)pn)->val;
+
+        /* Write value to DAC */
+        pn = NATIVE_GET_LOCAL(1);
+        pwm->pulsewidth(((pPmInt_t)pn)->val);
+
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+        
+}
+
+PmReturn_t
+nat_19_mbed_puslewidth_ms(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        PwmOut *pwm;
+
+        /* Raise TypeError if wrong number of args */
+        if (NATIVE_GET_NUM_ARGS() != 2)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Raise TypeError if arg is not the right type */
+        pn = NATIVE_GET_LOCAL(1);
+        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_INT)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+
+        /* Get the the C++ instance */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = dict_getItem(pattrs, PM_NONE, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        pwm = (PwmOut *)((pPmInt_t)pn)->val;
+
+        /* Write value to DAC */
+        pn = NATIVE_GET_LOCAL(1);
+        pwm->pulsewidth_ms(((pPmInt_t)pn)->val);
+
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+        
+}
+
+PmReturn_t
+nat_20_mbed_pulsewidth_us(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        PwmOut *pwm;
+
+        /* Raise TypeError if wrong number of args */
+        if (NATIVE_GET_NUM_ARGS() != 2)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Raise TypeError if arg is not the right type */
+        pn = NATIVE_GET_LOCAL(1);
+        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_INT)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+
+        /* Get the the C++ instance */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = dict_getItem(pattrs, PM_NONE, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        pwm = (PwmOut *)((pPmInt_t)pn)->val;
+
+        /* Write value to DAC */
+        pn = NATIVE_GET_LOCAL(1);
+        pwm->pulsewidth_us(((pPmInt_t)pn)->val);
+
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+        
+}
+
+PmReturn_t
+nat_21_mbed___init__(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t ptx;
+        pPmObj_t prx;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        Serial *ser;
+        uint8_t objid;
+
+        /* Raise TypeError if wrong number of args */
+        if (NATIVE_GET_NUM_ARGS() != 3)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Raise TypeError if arg is not the right type */
+        ptx = NATIVE_GET_LOCAL(1);
+        prx = NATIVE_GET_LOCAL(2);
+        if ((OBJ_GET_TYPE(ptx) != OBJ_TYPE_INT)
+            || (OBJ_GET_TYPE(prx) != OBJ_TYPE_INT))
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+
+        /* Instantiate the C++ object */
+        ser = new Serial(pinNumToName[((pPmInt_t)ptx)->val],
+                         pinNumToName[((pPmInt_t)prx)->val]);
+
+        /* Save the pointer to ser as an inaccessible attribute */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = int_new((uint32_t)ser, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        heap_gcPushTempRoot(pn, &objid);
+        retval = dict_setItem(pattrs, PM_NONE, pn);
+        heap_gcPopTempRoot(objid);
+        PM_RETURN_IF_ERROR(retval);
+
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+        
+}
+
+PmReturn_t
+nat_22_mbed_putc(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        Serial *ser;
+
+        /* Raise TypeError if wrong number of args */
+        if (NATIVE_GET_NUM_ARGS() != 2)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Raise TypeError if arg is not the right type */
+        pn = NATIVE_GET_LOCAL(1);
+        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_STR)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+
+        /* Get the the C++ instance */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = dict_getItem(pattrs, PM_NONE, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        ser = (Serial *)((pPmInt_t)pn)->val;
+
+        /* Write value to DAC */
+        pn = NATIVE_GET_LOCAL(1);
+        ser->putc(((pPmString_t)pn)->val[0]);
+
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+        
+}
+
+PmReturn_t
+nat_23_mbed_puts(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        Serial *ser;
+
+        /* Raise TypeError if wrong number of args */
+        if (NATIVE_GET_NUM_ARGS() != 2)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Raise TypeError if arg is not the right type */
+        pn = NATIVE_GET_LOCAL(1);
+        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_STR)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+
+        /* Get the the C++ instance */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = dict_getItem(pattrs, PM_NONE, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        ser = (Serial *)((pPmInt_t)pn)->val;
+
+        /* Write value to DAC */
+        pn = NATIVE_GET_LOCAL(1);
+        ser->puts((const char *)((pPmString_t)pn)->val);
+
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+        
+}
+
+PmReturn_t
+nat_24_mbed_getc(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        Serial *ser;
+        int32_t n;
+
+        /* If wrong number of args, throw type exception */
+        if (NATIVE_GET_NUM_ARGS() != 1)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Get the the C++ instance */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = dict_getItem(pattrs, PM_NONE, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        ser = (Serial *)((pPmInt_t)pn)->val;
+
+        /* Return char (as string) on the stack */
+        n = ser->getc();
+        retval = string_newFromChar((uint8_t)n, &pn);
+        NATIVE_SET_TOS(pn);
+
+        return retval;
+        
+}
+
+PmReturn_t
+nat_25_mbed___init__(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t pmosi;
+        pPmObj_t pmiso;
+        pPmObj_t psclk;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        SPI *spi;
+        uint8_t objid;
+
+        /* Raise TypeError if wrong number of args */
+        if (NATIVE_GET_NUM_ARGS() != 4)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Raise TypeError if arg is not the right type */
+        pmosi = NATIVE_GET_LOCAL(1);
+        pmiso = NATIVE_GET_LOCAL(2);
+        psclk = NATIVE_GET_LOCAL(3);
+        if ((OBJ_GET_TYPE(pmosi) != OBJ_TYPE_INT)
+            || (OBJ_GET_TYPE(pmiso) != OBJ_TYPE_INT)
+            || (OBJ_GET_TYPE(psclk) != OBJ_TYPE_INT))
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+
+        /* Instantiate the C++ object */
+        spi = new SPI(pinNumToName[((pPmInt_t)pmosi)->val],
+                      pinNumToName[((pPmInt_t)pmiso)->val],
+                      pinNumToName[((pPmInt_t)psclk)->val]);
+
+        /* Save the pointer to ser as an inaccessible attribute */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = int_new((uint32_t)spi, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        heap_gcPushTempRoot(pn, &objid);
+        retval = dict_setItem(pattrs, PM_NONE, pn);
+        heap_gcPopTempRoot(objid);
+        PM_RETURN_IF_ERROR(retval);
+
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+        
+}
+
+PmReturn_t
+nat_26_mbed_format(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t pbits;
+        pPmObj_t pmode;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        SPI *spi;
+
+        /* Raise TypeError if wrong number of args */
+        if ((NATIVE_GET_NUM_ARGS() < 2) || (NATIVE_GET_NUM_ARGS() > 3))
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Raise TypeError if arg is not the right type */
+        pbits = NATIVE_GET_LOCAL(1);
+        if (OBJ_GET_TYPE(pbits) != OBJ_TYPE_INT)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+
+        /* Get the mode arg if it exists */
+        pmode = PM_ZERO;
+        if (NATIVE_GET_NUM_ARGS() == 3)
+        {
+            pmode = NATIVE_GET_LOCAL(3);
+        }
+
+        /* Get the the C++ instance */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = dict_getItem(pattrs, PM_NONE, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        spi = (SPI *)((pPmInt_t)pn)->val;
+
+        /* Set format args */
+        spi->format(((pPmInt_t)pbits)->val, ((pPmInt_t)pmode)->val);
+
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+        
+}
+
+PmReturn_t
+nat_27_mbed_frequency(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t phz;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        SPI *spi;
+
+        /* Raise TypeError if wrong number of args */
+        if (NATIVE_GET_NUM_ARGS() != 2)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Raise TypeError if arg is not the right type */
+        phz = NATIVE_GET_LOCAL(1);
+        if (OBJ_GET_TYPE(phz) != OBJ_TYPE_INT)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+
+        /* Get the the C++ instance */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = dict_getItem(pattrs, PM_NONE, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        spi = (SPI *)((pPmInt_t)pn)->val;
+
+        /* Set frequency */
+        spi->frequency(((pPmInt_t)phz)->val);
+
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+        
+}
+
+PmReturn_t
+nat_28_mbed_write(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t pv;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        SPI *spi;
+        int32_t r;
+
+        /* Raise TypeError if wrong number of args */
+        if (NATIVE_GET_NUM_ARGS() != 2)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Raise TypeError if arg is not the right type */
+        pv = NATIVE_GET_LOCAL(1);
+        if (OBJ_GET_TYPE(pv) != OBJ_TYPE_INT)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+
+        /* Get the the C++ instance */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = dict_getItem(pattrs, PM_NONE, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        spi = (SPI *)((pPmInt_t)pn)->val;
+
+        /* Write the value and return the response */
+        r = spi->write(((pPmInt_t)pv)->val);
+        retval = int_new(r, &pn);
+        NATIVE_SET_TOS(pn);
+        return retval;
+        
+}
+
+PmReturn_t
+nat_29_mbed___init__(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t psda;
+        pPmObj_t pscl;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        I2C *i2c;
+        uint8_t objid;
+
+        /* Raise TypeError if wrong number of args */
+        if (NATIVE_GET_NUM_ARGS() != 3)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Raise TypeError if arg is not the right type */
+        psda = NATIVE_GET_LOCAL(1);
+        pscl = NATIVE_GET_LOCAL(2);
+        if ((OBJ_GET_TYPE(psda) != OBJ_TYPE_INT)
+            || (OBJ_GET_TYPE(pscl) != OBJ_TYPE_INT))
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+
+        /* Instantiate the C++ object */
+        i2c = new I2C(pinNumToName[((pPmInt_t)psda)->val],
+                      pinNumToName[((pPmInt_t)pscl)->val]);
+
+        /* Save the pointer to ser as an inaccessible attribute */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = int_new((uint32_t)i2c, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        heap_gcPushTempRoot(pn, &objid);
+        retval = dict_setItem(pattrs, PM_NONE, pn);
+        heap_gcPopTempRoot(objid);
+        PM_RETURN_IF_ERROR(retval);
+
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+        
+}
+
+PmReturn_t
+nat_30_mbed_frequency(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t phz;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        I2C *i2c;
+
+        /* Raise TypeError if wrong number of args */
+        if (NATIVE_GET_NUM_ARGS() != 2)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Raise TypeError if arg is not the right type */
+        phz = NATIVE_GET_LOCAL(1);
+        if (OBJ_GET_TYPE(phz) != OBJ_TYPE_INT)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+
+        /* Get the the C++ instance */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = dict_getItem(pattrs, PM_NONE, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        i2c = (I2C *)((pPmInt_t)pn)->val;
+
+        /* Set frequency */
+        i2c->frequency(((pPmInt_t)phz)->val);
+
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+        
+}
+
+PmReturn_t
+nat_31_mbed_read(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t paddr;
+        pPmObj_t pdata;
+        pPmObj_t plen;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        I2C *i2c;
+
+        /* Raise TypeError if wrong number of args */
+        if (NATIVE_GET_NUM_ARGS() != 4)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Raise TypeError if arg is not the right type */
+        paddr = NATIVE_GET_LOCAL(1);
+        pdata = NATIVE_GET_LOCAL(2);
+        plen = NATIVE_GET_LOCAL(3);
+        if ((OBJ_GET_TYPE(paddr) != OBJ_TYPE_INT)
+            || (OBJ_GET_TYPE(pdata) != OBJ_TYPE_STR)
+            || (OBJ_GET_TYPE(plen) != OBJ_TYPE_INT))
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+
+        /* Get the the C++ instance */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = dict_getItem(pattrs, PM_NONE, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        i2c = (I2C *)((pPmInt_t)pn)->val;
+
+        /* Read the bytes into the string */
+        /* WARNING: Changing the bytes of a string object is BAD. */
+        i2c->read(((pPmInt_t)paddr)->val,
+                  (char *)((pPmString_t)pdata)->val,
+                  ((pPmInt_t)plen)->val);
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+        
+}
+
+PmReturn_t
+nat_32_mbed_write(pPmFrame_t *ppframe)
+{
+
+        pPmObj_t pself;
+        pPmObj_t pn;
+        pPmObj_t paddr;
+        pPmObj_t pdata;
+        pPmObj_t plen;
+        pPmObj_t pattrs;
+        PmReturn_t retval = PM_RET_OK;
+        I2C *i2c;
+
+        /* Raise TypeError if wrong number of args */
+        if (NATIVE_GET_NUM_ARGS() != 4)
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+        pself = NATIVE_GET_LOCAL(0);
+
+        /* Raise TypeError if arg is not the right type */
+        paddr = NATIVE_GET_LOCAL(1);
+        pdata = NATIVE_GET_LOCAL(2);
+        plen = NATIVE_GET_LOCAL(3);
+        if ((OBJ_GET_TYPE(paddr) != OBJ_TYPE_INT)
+            || (OBJ_GET_TYPE(pdata) != OBJ_TYPE_STR)
+            || (OBJ_GET_TYPE(plen) != OBJ_TYPE_INT))
+        {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+
+        /* Get the the C++ instance */
+        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        retval = dict_getItem(pattrs, PM_NONE, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        i2c = (I2C *)((pPmInt_t)pn)->val;
+
+        /* Write the value and return the response */
+        i2c->write(((pPmInt_t)paddr)->val,
+                   (char *)((pPmString_t)pdata)->val,
+                   ((pPmInt_t)plen)->val);
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+        
+}
+
+PmReturn_t
+nat_33_mbed_set_led(pPmFrame_t *ppframe)
+{
+
+    pPmObj_t pled;
+    pPmObj_t pval;
+    int32_t nled;
+    int32_t nval;
+    PmReturn_t retval = PM_RET_OK;
+
+    /* If wrong number of args, raise TypeError */
+    if (NATIVE_GET_NUM_ARGS() > 2)
+    {
+        PM_RAISE(retval, PM_RET_EX_TYPE);
+        return retval;
+    }
+
+    /* If arg is not an int, raise TypeError */
+    pled = NATIVE_GET_LOCAL(0);
+    pval = NATIVE_GET_LOCAL(1);
+    if ((OBJ_GET_TYPE(pled) != OBJ_TYPE_INT)
+        || (OBJ_GET_TYPE(pval) != OBJ_TYPE_INT))
+    {
+        PM_RAISE(retval, PM_RET_EX_TYPE);
+        return retval;
+    }
+
+    /* Get int value from the arg */
+    nled = ((pPmInt_t)pled)->val;
+    nval = ((pPmInt_t)pval)->val;
+
+    /* Set the LED to the given value */
+    switch (nled)
+    {
+        case 1: led1 = nval; break;
+        case 2: led2 = nval; break;
+        case 3: led3 = nval; break;
+        case 4: led4 = nval; break;
+    }
+
+    NATIVE_SET_TOS(PM_NONE);
+    return retval;
+    
+}
+
+/* Native function lookup table */
+pPmNativeFxn_t const usr_nat_fxn_table[] =
+{
+    nat_placeholder_func,
+    nat_01_mbed___init__,
+    nat_02_mbed_read_u16,
+    nat_03_mbed_read,
+    nat_04_mbed___init__,
+    nat_05_mbed_write_u16,
+    nat_06_mbed_write,
+    nat_07_mbed_read,
+    nat_08_mbed___init__,
+    nat_09_mbed_read,
+    nat_10_mbed___init__,
+    nat_11_mbed_read,
+    nat_12_mbed_write,
+    nat_13_mbed___init__,
+    nat_14_mbed_read,
+    nat_15_mbed_period,
+    nat_16_mbed_period_ms,
+    nat_17_mbed_period_us,
+    nat_18_mbed_pulsewidth,
+    nat_19_mbed_puslewidth_ms,
+    nat_20_mbed_pulsewidth_us,
+    nat_21_mbed___init__,
+    nat_22_mbed_putc,
+    nat_23_mbed_puts,
+    nat_24_mbed_getc,
+    nat_25_mbed___init__,
+    nat_26_mbed_format,
+    nat_27_mbed_frequency,
+    nat_28_mbed_write,
+    nat_29_mbed___init__,
+    nat_30_mbed_frequency,
+    nat_31_mbed_read,
+    nat_32_mbed_write,
+    nat_33_mbed_set_led,
+};