Port of MicroPython to the mbed platform. See micropython-repl for an interactive program.

Dependents:   micropython-repl

This a port of MicroPython to the mbed Classic platform.

This provides an interpreter running on the board's USB serial connection.

Getting Started

Import the micropython-repl program into your IDE workspace on developer.mbed.org. Compile and download to your board. Connect to the USB serial port in your usual manner. You should get a startup message similar to the following:

  MicroPython v1.7-155-gdddcdd8 on 2016-04-23; K64F with ARM
  Type "help()" for more information.
  >>>

Then you can start using micropython. For example:

  >>> from mbed import DigitalOut
  >>> from pins import LED1
  >>> led = DigitalOut(LED1)
  >>> led.write(1)

Requirements

You need approximately 100K of flash memory, so this will be no good for boards with smaller amounts of storage.

Caveats

This can be considered an alpha release of the port; things may not work; APIs may change in later releases. It is NOT an official part part the micropython project, so if anything doesn't work, blame me. If it does work, most of the credit is due to micropython.

  • Only a few of the mbed classes are available in micropython so far, and not all methods of those that are.
  • Only a few boards have their full range of pin names available; for others, only a few standard ones (USBTX, USBRX, LED1) are implemented.
  • The garbage collector is not yet implemented. The interpreter will gradually consume memory and then fail.
  • Exceptions from the mbed classes are not yet handled.
  • Asynchronous processing (e.g. events on inputs) is not supported.

Credits

  • Damien P. George and other contributors who created micropython.
  • Colin Hogben, author of this port.
Committer:
Colin Hogben
Date:
Wed Apr 27 22:11:29 2016 +0100
Revision:
10:33521d742af1
Parent:
0:5868e8752d44
Update README and version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pythontech 0:5868e8752d44 1 /*
pythontech 0:5868e8752d44 2 * This file is part of the Micro Python project, http://micropython.org/
pythontech 0:5868e8752d44 3 *
pythontech 0:5868e8752d44 4 * The MIT License (MIT)
pythontech 0:5868e8752d44 5 *
pythontech 0:5868e8752d44 6 * Copyright (c) 2013, 2014 Damien P. George
pythontech 0:5868e8752d44 7 *
pythontech 0:5868e8752d44 8 * Permission is hereby granted, free of charge, to any person obtaining a copy
pythontech 0:5868e8752d44 9 * of this software and associated documentation files (the "Software"), to deal
pythontech 0:5868e8752d44 10 * in the Software without restriction, including without limitation the rights
pythontech 0:5868e8752d44 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
pythontech 0:5868e8752d44 12 * copies of the Software, and to permit persons to whom the Software is
pythontech 0:5868e8752d44 13 * furnished to do so, subject to the following conditions:
pythontech 0:5868e8752d44 14 *
pythontech 0:5868e8752d44 15 * The above copyright notice and this permission notice shall be included in
pythontech 0:5868e8752d44 16 * all copies or substantial portions of the Software.
pythontech 0:5868e8752d44 17 *
pythontech 0:5868e8752d44 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
pythontech 0:5868e8752d44 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
pythontech 0:5868e8752d44 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
pythontech 0:5868e8752d44 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
pythontech 0:5868e8752d44 22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
pythontech 0:5868e8752d44 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
pythontech 0:5868e8752d44 24 * THE SOFTWARE.
pythontech 0:5868e8752d44 25 */
pythontech 0:5868e8752d44 26
pythontech 0:5868e8752d44 27 #include "py/builtin.h"
pythontech 0:5868e8752d44 28 #include "py/nlr.h"
pythontech 0:5868e8752d44 29
pythontech 0:5868e8752d44 30 #if MICROPY_PY_BUILTINS_FLOAT && MICROPY_PY_MATH
pythontech 0:5868e8752d44 31
pythontech 0:5868e8752d44 32 #include <math.h>
pythontech 0:5868e8752d44 33
pythontech 0:5868e8752d44 34 /// \module math - mathematical functions
pythontech 0:5868e8752d44 35 ///
pythontech 0:5868e8752d44 36 /// The `math` module provides some basic mathematical funtions for
pythontech 0:5868e8752d44 37 /// working with floating-point numbers.
pythontech 0:5868e8752d44 38
pythontech 0:5868e8752d44 39 STATIC NORETURN void math_error(void) {
pythontech 0:5868e8752d44 40 nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "math domain error"));
pythontech 0:5868e8752d44 41 }
pythontech 0:5868e8752d44 42
pythontech 0:5868e8752d44 43 #define MATH_FUN_1(py_name, c_name) \
pythontech 0:5868e8752d44 44 STATIC mp_obj_t mp_math_ ## py_name(mp_obj_t x_obj) { return mp_obj_new_float(MICROPY_FLOAT_C_FUN(c_name)(mp_obj_get_float(x_obj))); } \
pythontech 0:5868e8752d44 45 STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_math_## py_name ## _obj, mp_math_ ## py_name);
pythontech 0:5868e8752d44 46
pythontech 0:5868e8752d44 47 #define MATH_FUN_2(py_name, c_name) \
pythontech 0:5868e8752d44 48 STATIC mp_obj_t mp_math_ ## py_name(mp_obj_t x_obj, mp_obj_t y_obj) { return mp_obj_new_float(MICROPY_FLOAT_C_FUN(c_name)(mp_obj_get_float(x_obj), mp_obj_get_float(y_obj))); } \
pythontech 0:5868e8752d44 49 STATIC MP_DEFINE_CONST_FUN_OBJ_2(mp_math_## py_name ## _obj, mp_math_ ## py_name);
pythontech 0:5868e8752d44 50
pythontech 0:5868e8752d44 51 #define MATH_FUN_1_TO_BOOL(py_name, c_name) \
pythontech 0:5868e8752d44 52 STATIC mp_obj_t mp_math_ ## py_name(mp_obj_t x_obj) { return mp_obj_new_bool(c_name(mp_obj_get_float(x_obj))); } \
pythontech 0:5868e8752d44 53 STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_math_## py_name ## _obj, mp_math_ ## py_name);
pythontech 0:5868e8752d44 54
pythontech 0:5868e8752d44 55 #define MATH_FUN_1_TO_INT(py_name, c_name) \
pythontech 0:5868e8752d44 56 STATIC mp_obj_t mp_math_ ## py_name(mp_obj_t x_obj) { mp_int_t x = MICROPY_FLOAT_C_FUN(c_name)(mp_obj_get_float(x_obj)); return mp_obj_new_int(x); } \
pythontech 0:5868e8752d44 57 STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_math_## py_name ## _obj, mp_math_ ## py_name);
pythontech 0:5868e8752d44 58
pythontech 0:5868e8752d44 59 #define MATH_FUN_1_ERRCOND(py_name, c_name, error_condition) \
pythontech 0:5868e8752d44 60 STATIC mp_obj_t mp_math_ ## py_name(mp_obj_t x_obj) { \
pythontech 0:5868e8752d44 61 mp_float_t x = mp_obj_get_float(x_obj); \
pythontech 0:5868e8752d44 62 if (error_condition) { \
pythontech 0:5868e8752d44 63 math_error(); \
pythontech 0:5868e8752d44 64 } \
pythontech 0:5868e8752d44 65 return mp_obj_new_float(MICROPY_FLOAT_C_FUN(c_name)(x)); \
pythontech 0:5868e8752d44 66 } \
pythontech 0:5868e8752d44 67 STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_math_## py_name ## _obj, mp_math_ ## py_name);
pythontech 0:5868e8752d44 68
pythontech 0:5868e8752d44 69 #if MP_NEED_LOG2
pythontech 0:5868e8752d44 70 // 1.442695040888963407354163704 is 1/_M_LN2
pythontech 0:5868e8752d44 71 #define log2(x) (log(x) * 1.442695040888963407354163704)
pythontech 0:5868e8752d44 72 #endif
pythontech 0:5868e8752d44 73
pythontech 0:5868e8752d44 74 /// \function sqrt(x)
pythontech 0:5868e8752d44 75 /// Returns the square root of `x`.
pythontech 0:5868e8752d44 76 MATH_FUN_1_ERRCOND(sqrt, sqrt, (x < (mp_float_t)0.0))
pythontech 0:5868e8752d44 77 /// \function pow(x, y)
pythontech 0:5868e8752d44 78 /// Returns `x` to the power of `y`.
pythontech 0:5868e8752d44 79 MATH_FUN_2(pow, pow)
pythontech 0:5868e8752d44 80 /// \function exp(x)
pythontech 0:5868e8752d44 81 MATH_FUN_1(exp, exp)
pythontech 0:5868e8752d44 82 #if MICROPY_PY_MATH_SPECIAL_FUNCTIONS
pythontech 0:5868e8752d44 83 /// \function expm1(x)
pythontech 0:5868e8752d44 84 MATH_FUN_1(expm1, expm1)
pythontech 0:5868e8752d44 85 /// \function log2(x)
pythontech 0:5868e8752d44 86 MATH_FUN_1_ERRCOND(log2, log2, (x <= (mp_float_t)0.0))
pythontech 0:5868e8752d44 87 /// \function log10(x)
pythontech 0:5868e8752d44 88 MATH_FUN_1_ERRCOND(log10, log10, (x <= (mp_float_t)0.0))
pythontech 0:5868e8752d44 89 /// \function cosh(x)
pythontech 0:5868e8752d44 90 MATH_FUN_1(cosh, cosh)
pythontech 0:5868e8752d44 91 /// \function sinh(x)
pythontech 0:5868e8752d44 92 MATH_FUN_1(sinh, sinh)
pythontech 0:5868e8752d44 93 /// \function tanh(x)
pythontech 0:5868e8752d44 94 MATH_FUN_1(tanh, tanh)
pythontech 0:5868e8752d44 95 /// \function acosh(x)
pythontech 0:5868e8752d44 96 MATH_FUN_1(acosh, acosh)
pythontech 0:5868e8752d44 97 /// \function asinh(x)
pythontech 0:5868e8752d44 98 MATH_FUN_1(asinh, asinh)
pythontech 0:5868e8752d44 99 /// \function atanh(x)
pythontech 0:5868e8752d44 100 MATH_FUN_1(atanh, atanh)
pythontech 0:5868e8752d44 101 #endif
pythontech 0:5868e8752d44 102 /// \function cos(x)
pythontech 0:5868e8752d44 103 MATH_FUN_1(cos, cos)
pythontech 0:5868e8752d44 104 /// \function sin(x)
pythontech 0:5868e8752d44 105 MATH_FUN_1(sin, sin)
pythontech 0:5868e8752d44 106 /// \function tan(x)
pythontech 0:5868e8752d44 107 MATH_FUN_1(tan, tan)
pythontech 0:5868e8752d44 108 /// \function acos(x)
pythontech 0:5868e8752d44 109 MATH_FUN_1(acos, acos)
pythontech 0:5868e8752d44 110 /// \function asin(x)
pythontech 0:5868e8752d44 111 MATH_FUN_1(asin, asin)
pythontech 0:5868e8752d44 112 /// \function atan(x)
pythontech 0:5868e8752d44 113 MATH_FUN_1(atan, atan)
pythontech 0:5868e8752d44 114 /// \function atan2(y, x)
pythontech 0:5868e8752d44 115 MATH_FUN_2(atan2, atan2)
pythontech 0:5868e8752d44 116 /// \function ceil(x)
pythontech 0:5868e8752d44 117 MATH_FUN_1_TO_INT(ceil, ceil)
pythontech 0:5868e8752d44 118 /// \function copysign(x, y)
pythontech 0:5868e8752d44 119 MATH_FUN_2(copysign, copysign)
pythontech 0:5868e8752d44 120 /// \function fabs(x)
pythontech 0:5868e8752d44 121 MATH_FUN_1(fabs, fabs)
pythontech 0:5868e8752d44 122 /// \function floor(x)
pythontech 0:5868e8752d44 123 MATH_FUN_1_TO_INT(floor, floor) //TODO: delegate to x.__floor__() if x is not a float
pythontech 0:5868e8752d44 124 /// \function fmod(x, y)
pythontech 0:5868e8752d44 125 MATH_FUN_2(fmod, fmod)
pythontech 0:5868e8752d44 126 /// \function isfinite(x)
pythontech 0:5868e8752d44 127 MATH_FUN_1_TO_BOOL(isfinite, isfinite)
pythontech 0:5868e8752d44 128 /// \function isinf(x)
pythontech 0:5868e8752d44 129 MATH_FUN_1_TO_BOOL(isinf, isinf)
pythontech 0:5868e8752d44 130 /// \function isnan(x)
pythontech 0:5868e8752d44 131 MATH_FUN_1_TO_BOOL(isnan, isnan)
pythontech 0:5868e8752d44 132 /// \function trunc(x)
pythontech 0:5868e8752d44 133 MATH_FUN_1_TO_INT(trunc, trunc)
pythontech 0:5868e8752d44 134 /// \function ldexp(x, exp)
pythontech 0:5868e8752d44 135 MATH_FUN_2(ldexp, ldexp)
pythontech 0:5868e8752d44 136 #if MICROPY_PY_MATH_SPECIAL_FUNCTIONS
pythontech 0:5868e8752d44 137 /// \function erf(x)
pythontech 0:5868e8752d44 138 /// Return the error function of `x`.
pythontech 0:5868e8752d44 139 MATH_FUN_1(erf, erf)
pythontech 0:5868e8752d44 140 /// \function erfc(x)
pythontech 0:5868e8752d44 141 /// Return the complementary error function of `x`.
pythontech 0:5868e8752d44 142 MATH_FUN_1(erfc, erfc)
pythontech 0:5868e8752d44 143 /// \function gamma(x)
pythontech 0:5868e8752d44 144 /// Return the gamma function of `x`.
pythontech 0:5868e8752d44 145 MATH_FUN_1(gamma, tgamma)
pythontech 0:5868e8752d44 146 /// \function lgamma(x)
pythontech 0:5868e8752d44 147 /// return the natural logarithm of the gamma function of `x`.
pythontech 0:5868e8752d44 148 MATH_FUN_1(lgamma, lgamma)
pythontech 0:5868e8752d44 149 #endif
pythontech 0:5868e8752d44 150 //TODO: factorial, fsum
pythontech 0:5868e8752d44 151
pythontech 0:5868e8752d44 152 // Function that takes a variable number of arguments
pythontech 0:5868e8752d44 153
pythontech 0:5868e8752d44 154 // log(x[, base])
pythontech 0:5868e8752d44 155 STATIC mp_obj_t mp_math_log(size_t n_args, const mp_obj_t *args) {
pythontech 0:5868e8752d44 156 mp_float_t x = mp_obj_get_float(args[0]);
pythontech 0:5868e8752d44 157 if (x <= (mp_float_t)0.0) {
pythontech 0:5868e8752d44 158 math_error();
pythontech 0:5868e8752d44 159 }
pythontech 0:5868e8752d44 160 mp_float_t l = MICROPY_FLOAT_C_FUN(log)(x);
pythontech 0:5868e8752d44 161 if (n_args == 1) {
pythontech 0:5868e8752d44 162 return mp_obj_new_float(l);
pythontech 0:5868e8752d44 163 } else {
pythontech 0:5868e8752d44 164 mp_float_t base = mp_obj_get_float(args[1]);
pythontech 0:5868e8752d44 165 if (base <= (mp_float_t)0.0) {
pythontech 0:5868e8752d44 166 math_error();
pythontech 0:5868e8752d44 167 }
pythontech 0:5868e8752d44 168 return mp_obj_new_float(l / MICROPY_FLOAT_C_FUN(log)(base));
pythontech 0:5868e8752d44 169 }
pythontech 0:5868e8752d44 170 }
pythontech 0:5868e8752d44 171 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_math_log_obj, 1, 2, mp_math_log);
pythontech 0:5868e8752d44 172
pythontech 0:5868e8752d44 173 // Functions that return a tuple
pythontech 0:5868e8752d44 174
pythontech 0:5868e8752d44 175 /// \function frexp(x)
pythontech 0:5868e8752d44 176 /// Converts a floating-point number to fractional and integral components.
pythontech 0:5868e8752d44 177 STATIC mp_obj_t mp_math_frexp(mp_obj_t x_obj) {
pythontech 0:5868e8752d44 178 int int_exponent = 0;
pythontech 0:5868e8752d44 179 mp_float_t significand = MICROPY_FLOAT_C_FUN(frexp)(mp_obj_get_float(x_obj), &int_exponent);
pythontech 0:5868e8752d44 180 mp_obj_t tuple[2];
pythontech 0:5868e8752d44 181 tuple[0] = mp_obj_new_float(significand);
pythontech 0:5868e8752d44 182 tuple[1] = mp_obj_new_int(int_exponent);
pythontech 0:5868e8752d44 183 return mp_obj_new_tuple(2, tuple);
pythontech 0:5868e8752d44 184 }
pythontech 0:5868e8752d44 185 STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_math_frexp_obj, mp_math_frexp);
pythontech 0:5868e8752d44 186
pythontech 0:5868e8752d44 187 /// \function modf(x)
pythontech 0:5868e8752d44 188 STATIC mp_obj_t mp_math_modf(mp_obj_t x_obj) {
pythontech 0:5868e8752d44 189 mp_float_t int_part = 0.0;
pythontech 0:5868e8752d44 190 mp_float_t fractional_part = MICROPY_FLOAT_C_FUN(modf)(mp_obj_get_float(x_obj), &int_part);
pythontech 0:5868e8752d44 191 mp_obj_t tuple[2];
pythontech 0:5868e8752d44 192 tuple[0] = mp_obj_new_float(fractional_part);
pythontech 0:5868e8752d44 193 tuple[1] = mp_obj_new_float(int_part);
pythontech 0:5868e8752d44 194 return mp_obj_new_tuple(2, tuple);
pythontech 0:5868e8752d44 195 }
pythontech 0:5868e8752d44 196 STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_math_modf_obj, mp_math_modf);
pythontech 0:5868e8752d44 197
pythontech 0:5868e8752d44 198 // Angular conversions
pythontech 0:5868e8752d44 199
pythontech 0:5868e8752d44 200 /// \function radians(x)
pythontech 0:5868e8752d44 201 STATIC mp_obj_t mp_math_radians(mp_obj_t x_obj) {
pythontech 0:5868e8752d44 202 return mp_obj_new_float(mp_obj_get_float(x_obj) * M_PI / 180.0);
pythontech 0:5868e8752d44 203 }
pythontech 0:5868e8752d44 204 STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_math_radians_obj, mp_math_radians);
pythontech 0:5868e8752d44 205
pythontech 0:5868e8752d44 206 /// \function degrees(x)
pythontech 0:5868e8752d44 207 STATIC mp_obj_t mp_math_degrees(mp_obj_t x_obj) {
pythontech 0:5868e8752d44 208 return mp_obj_new_float(mp_obj_get_float(x_obj) * 180.0 / M_PI);
pythontech 0:5868e8752d44 209 }
pythontech 0:5868e8752d44 210 STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_math_degrees_obj, mp_math_degrees);
pythontech 0:5868e8752d44 211
pythontech 0:5868e8752d44 212 STATIC const mp_rom_map_elem_t mp_module_math_globals_table[] = {
pythontech 0:5868e8752d44 213 { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_math) },
pythontech 0:5868e8752d44 214 { MP_ROM_QSTR(MP_QSTR_e), mp_const_float_e },
pythontech 0:5868e8752d44 215 { MP_ROM_QSTR(MP_QSTR_pi), mp_const_float_pi },
pythontech 0:5868e8752d44 216 { MP_ROM_QSTR(MP_QSTR_sqrt), MP_ROM_PTR(&mp_math_sqrt_obj) },
pythontech 0:5868e8752d44 217 { MP_ROM_QSTR(MP_QSTR_pow), MP_ROM_PTR(&mp_math_pow_obj) },
pythontech 0:5868e8752d44 218 { MP_ROM_QSTR(MP_QSTR_exp), MP_ROM_PTR(&mp_math_exp_obj) },
pythontech 0:5868e8752d44 219 #if MICROPY_PY_MATH_SPECIAL_FUNCTIONS
pythontech 0:5868e8752d44 220 { MP_ROM_QSTR(MP_QSTR_expm1), MP_ROM_PTR(&mp_math_expm1_obj) },
pythontech 0:5868e8752d44 221 #endif
pythontech 0:5868e8752d44 222 { MP_ROM_QSTR(MP_QSTR_log), MP_ROM_PTR(&mp_math_log_obj) },
pythontech 0:5868e8752d44 223 #if MICROPY_PY_MATH_SPECIAL_FUNCTIONS
pythontech 0:5868e8752d44 224 { MP_ROM_QSTR(MP_QSTR_log2), MP_ROM_PTR(&mp_math_log2_obj) },
pythontech 0:5868e8752d44 225 { MP_ROM_QSTR(MP_QSTR_log10), MP_ROM_PTR(&mp_math_log10_obj) },
pythontech 0:5868e8752d44 226 { MP_ROM_QSTR(MP_QSTR_cosh), MP_ROM_PTR(&mp_math_cosh_obj) },
pythontech 0:5868e8752d44 227 { MP_ROM_QSTR(MP_QSTR_sinh), MP_ROM_PTR(&mp_math_sinh_obj) },
pythontech 0:5868e8752d44 228 { MP_ROM_QSTR(MP_QSTR_tanh), MP_ROM_PTR(&mp_math_tanh_obj) },
pythontech 0:5868e8752d44 229 { MP_ROM_QSTR(MP_QSTR_acosh), MP_ROM_PTR(&mp_math_acosh_obj) },
pythontech 0:5868e8752d44 230 { MP_ROM_QSTR(MP_QSTR_asinh), MP_ROM_PTR(&mp_math_asinh_obj) },
pythontech 0:5868e8752d44 231 { MP_ROM_QSTR(MP_QSTR_atanh), MP_ROM_PTR(&mp_math_atanh_obj) },
pythontech 0:5868e8752d44 232 #endif
pythontech 0:5868e8752d44 233 { MP_ROM_QSTR(MP_QSTR_cos), MP_ROM_PTR(&mp_math_cos_obj) },
pythontech 0:5868e8752d44 234 { MP_ROM_QSTR(MP_QSTR_sin), MP_ROM_PTR(&mp_math_sin_obj) },
pythontech 0:5868e8752d44 235 { MP_ROM_QSTR(MP_QSTR_tan), MP_ROM_PTR(&mp_math_tan_obj) },
pythontech 0:5868e8752d44 236 { MP_ROM_QSTR(MP_QSTR_acos), MP_ROM_PTR(&mp_math_acos_obj) },
pythontech 0:5868e8752d44 237 { MP_ROM_QSTR(MP_QSTR_asin), MP_ROM_PTR(&mp_math_asin_obj) },
pythontech 0:5868e8752d44 238 { MP_ROM_QSTR(MP_QSTR_atan), MP_ROM_PTR(&mp_math_atan_obj) },
pythontech 0:5868e8752d44 239 { MP_ROM_QSTR(MP_QSTR_atan2), MP_ROM_PTR(&mp_math_atan2_obj) },
pythontech 0:5868e8752d44 240 { MP_ROM_QSTR(MP_QSTR_ceil), MP_ROM_PTR(&mp_math_ceil_obj) },
pythontech 0:5868e8752d44 241 { MP_ROM_QSTR(MP_QSTR_copysign), MP_ROM_PTR(&mp_math_copysign_obj) },
pythontech 0:5868e8752d44 242 { MP_ROM_QSTR(MP_QSTR_fabs), MP_ROM_PTR(&mp_math_fabs_obj) },
pythontech 0:5868e8752d44 243 { MP_ROM_QSTR(MP_QSTR_floor), MP_ROM_PTR(&mp_math_floor_obj) },
pythontech 0:5868e8752d44 244 { MP_ROM_QSTR(MP_QSTR_fmod), MP_ROM_PTR(&mp_math_fmod_obj) },
pythontech 0:5868e8752d44 245 { MP_ROM_QSTR(MP_QSTR_frexp), MP_ROM_PTR(&mp_math_frexp_obj) },
pythontech 0:5868e8752d44 246 { MP_ROM_QSTR(MP_QSTR_ldexp), MP_ROM_PTR(&mp_math_ldexp_obj) },
pythontech 0:5868e8752d44 247 { MP_ROM_QSTR(MP_QSTR_modf), MP_ROM_PTR(&mp_math_modf_obj) },
pythontech 0:5868e8752d44 248 { MP_ROM_QSTR(MP_QSTR_isfinite), MP_ROM_PTR(&mp_math_isfinite_obj) },
pythontech 0:5868e8752d44 249 { MP_ROM_QSTR(MP_QSTR_isinf), MP_ROM_PTR(&mp_math_isinf_obj) },
pythontech 0:5868e8752d44 250 { MP_ROM_QSTR(MP_QSTR_isnan), MP_ROM_PTR(&mp_math_isnan_obj) },
pythontech 0:5868e8752d44 251 { MP_ROM_QSTR(MP_QSTR_trunc), MP_ROM_PTR(&mp_math_trunc_obj) },
pythontech 0:5868e8752d44 252 { MP_ROM_QSTR(MP_QSTR_radians), MP_ROM_PTR(&mp_math_radians_obj) },
pythontech 0:5868e8752d44 253 { MP_ROM_QSTR(MP_QSTR_degrees), MP_ROM_PTR(&mp_math_degrees_obj) },
pythontech 0:5868e8752d44 254 #if MICROPY_PY_MATH_SPECIAL_FUNCTIONS
pythontech 0:5868e8752d44 255 { MP_ROM_QSTR(MP_QSTR_erf), MP_ROM_PTR(&mp_math_erf_obj) },
pythontech 0:5868e8752d44 256 { MP_ROM_QSTR(MP_QSTR_erfc), MP_ROM_PTR(&mp_math_erfc_obj) },
pythontech 0:5868e8752d44 257 { MP_ROM_QSTR(MP_QSTR_gamma), MP_ROM_PTR(&mp_math_gamma_obj) },
pythontech 0:5868e8752d44 258 { MP_ROM_QSTR(MP_QSTR_lgamma), MP_ROM_PTR(&mp_math_lgamma_obj) },
pythontech 0:5868e8752d44 259 #endif
pythontech 0:5868e8752d44 260 };
pythontech 0:5868e8752d44 261
pythontech 0:5868e8752d44 262 STATIC MP_DEFINE_CONST_DICT(mp_module_math_globals, mp_module_math_globals_table);
pythontech 0:5868e8752d44 263
pythontech 0:5868e8752d44 264 const mp_obj_module_t mp_module_math = {
pythontech 0:5868e8752d44 265 .base = { &mp_type_module },
pythontech 0:5868e8752d44 266 .name = MP_QSTR_math,
pythontech 0:5868e8752d44 267 .globals = (mp_obj_dict_t*)&mp_module_math_globals,
pythontech 0:5868e8752d44 268 };
pythontech 0:5868e8752d44 269
pythontech 0:5868e8752d44 270 #endif // MICROPY_PY_BUILTINS_FLOAT && MICROPY_PY_MATH