slex (1.0-25) noble; urgency=medium

  * Modelo grafico v2, RESULTADOS/UNIDADES tipados y --graficos para
    OUTPUTS sin PARAPLOT. Sin cambios del DAT de calculo por defecto.
  * Nuevas regresiones de productor grafico y lectura concurrente.

 -- Diego Saravia <dsa@unsa.edu.ar>  Fri, 09 Oct 2026 02:00:00 -0300

slex (1.0-24) noble; urgency=medium

  * Entrega coordinada con siru 1.0-3: generacion GLM v2 adaptativa
    y SPLIT 1/2 con metadatos autosuficientes.
  * Incluye split.inc en las fuentes distribuidas y conserva las pruebas
    de los selectores, mapas y rechazos de capacidades incompatibles.
  * Las referencias de circuitoB ya reflejan el paso inicial y la
    adaptacion predeterminados actuales; no se cambia su politica.
  * No implementa aun los controles propuestos en el plan M5.

 -- Diego Saravia <dsa@unsa.edu.ar>  Tue, 06 Oct 2026 21:56:35 -0300

slex (1.0-23) noble; urgency=medium

  * d2datdinc: un valor con unidad de GNU units (10 kohm, 100 uF, -5 tempC)
    pasa al SI al leer un .d o un .ds; sin unidad ya esta en el SI.
    START/STOP TIME y los pasos de RUN CONTROLS tienen que ser tiempos.
    Build-Depends: libunidades-dev (siru/unidades).
  * slex: las regexps que empiezan con ^^ reconocen solo al comienzo de un
    renglon (el ^ de flex), y slex_ctx_unput devuelve texto al flujo (el
    unput de flex), sin mover la linea ni la columna. tests/test_renglon.

 -- Diego Saravia <dsa@unsa.edu.ar>  Tue, 06 Oct 2026 16:30:00 -0300

slex (1.0-22) noble; urgency=medium

  * din: los valores que se traducen a ExprTk y los cuerpos de FUNCTIONS los
    lee una gramatica de Bison (valor.y).
  * d2datdinc: las TABLE van como texto (#formato pares) y las lee tabular2;
    hace falta tabular2 2.0-11.

 -- Diego Saravia <dsa@unsa.edu.ar>  Tue, 06 Oct 2026 02:30:00 -0300

slex (1.0-21) noble; urgency=medium

  * d2datdinc: las expresiones de los valores las lee una gramatica de Bison
    (expresion.y); las reescrituras de SCEPTRE van sobre los valores.

 -- Diego Saravia <dsa@unsa.edu.ar>  Tue, 06 Oct 2026 01:30:00 -0300

slex (1.0-20) noble; urgency=medium

  * d2datdinc: las construcciones chicas de un .d de SCEPTRE las lee una
    gramatica de Bison (sceptre.y).

 -- Diego Saravia <dsa@unsa.edu.ar>  Tue, 06 Oct 2026 00:30:00 -0300

slex (1.0-19) noble; urgency=medium

  * d2datdinc: la cabeza de ELEMENTS de un .d la lee una gramatica de Bison
    (rama.y).

 -- Diego Saravia <dsa@unsa.edu.ar>  Tue, 06 Oct 2026 00:00:00 -0300

slex (1.0-18) noble; urgency=medium

  * d2datdinc: la forma de RUN CONTROLS la lee una gramatica de Bison
    (control.y).

 -- Diego Saravia <dsa@unsa.edu.ar>  Mon, 05 Oct 2026 23:30:00 -0300

slex (1.0-17) noble; urgency=medium

  * d2datdinc: OUTPUTS de un .d lo lee una gramatica de Bison (salidas.y).

 -- Diego Saravia <dsa@unsa.edu.ar>  Mon, 05 Oct 2026 23:00:00 -0300

slex (1.0-16) noble; urgency=medium

  * d2datdinc: DEFINED PARAMETERS y VARIABLES las lee una gramatica de Bison
    (parametros.y). Un nombre con _ vale entero; lo raro se avisa y se
    ignora.

 -- Diego Saravia <dsa@unsa.edu.ar>  Mon, 05 Oct 2026 22:30:00 -0300

slex (1.0-15) noble; urgency=medium

  * d2datdinc: CONSTANTS y FUNCTIONS las lee una gramatica de Bison
    (declaraciones.y). Lo bien escrito da lo mismo que el 1.0-14; lo raro se
    avisa y se ignora.
  * make check: probar pasa a 82 pruebas (pruebas/declaraciones.ds).

 -- Diego Saravia <dsa@unsa.edu.ar>  Mon, 05 Oct 2026 22:00:00 -0300

slex (1.0-14) noble; urgency=medium

  * d2datdinc: EQUATIONS y CONTROL EQUATIONS las lee una gramatica de Bison
    (ecuacion.y). Lo bien escrito da lo mismo que el 1.0-13 en los 1210
    circuitos del arbol; lo raro se avisa y se ignora.
  * make check: probar pasa de 75 a 78 pruebas (pruebas/ecuaciones.ds).

 -- Diego Saravia <dsa@unsa.edu.ar>  Mon, 05 Oct 2026 21:30:00 -0300

slex (1.0-13) noble; urgency=medium

  * d2datdinc: la seccion DATA la lee una gramatica de Bison (data.y). Lo
    bien escrito da lo mismo que el 1.0-12 en los 1207 circuitos del arbol;
    lo raro se avisa y se ignora. Build-Depends: bison.
  * make check: probar pasa de 72 a 75 pruebas (pruebas/data.ds).

 -- Diego Saravia <dsa@unsa.edu.ar>  Mon, 05 Oct 2026 21:00:00 -0300

slex (1.0-12) noble; urgency=medium

  * d2datdinc: lo que lleva la lectura de un circuito deja de estar en
    variables del programa y pasa a ser de cada lectura (struct dato_ctx,
    struct lector, y el cursor de dato/expr como parametro). Da lo mismo que
    el 1.0-11 en los 1207 circuitos del arbol: el dato, los avisos, el estado
    de salida y los .din.
  * make check: d2datdinc/varios, que lee 48 circuitos en un proceso, en fila
    y desde cuatro hilos.
  * Los ejemplos 01 a 04 y 06 a 08 piden los tokens con slex_next (no se
    instalan).

 -- Diego Saravia <dsa@unsa.edu.ar>  Mon, 05 Oct 2026 17:10:00 -0300

slex (1.0-11) noble; urgency=medium

  * d2datdinc: los dos mensajes que mandan a leer LLAVES.md dicen donde esta
    ahora, siruviejo/LLAVES.md (Simul/ paso a siruviejo/ y el corpus a
    siru/corpus). Lo mismo en los comentarios de la biblioteca que se instala.
    No cambia nada de lo que hace.

 -- Diego Saravia <dsa@unsa.edu.ar>  Mon, 05 Oct 2026 16:45:00 -0300

slex (1.0-10) noble; urgency=medium

  * d2datdinc: las claves del paso en el dato pasan de SIMUL2_* a SIRU_*, y
    los controles propios de un .d, de "SIMUL2 ..." a "SIRU ...": Simul2
    ahora se llama siru. Los nombres de antes se siguen aceptando al leer
    un .d, un .ds o un .dat, y con -v se avisa.

 -- Diego Saravia <dsa@unsa.edu.ar>  Mon, 05 Oct 2026 13:15:00 -0300

slex (1.0-9) noble; urgency=medium

  * slex por contexto: el estado del lexer pasa de variables globales a un
    struct slex_ctx que crea y libera quien lo usa. Varios lexers
    independientes en un proceso, uno adentro de la accion de otro, y
    contextos distintos desde hilos del sistema distintos. API nueva en
    slex.h (slex_ctx_new, slex_ctx_register, slex_ctx_ini_file, slex_next,
    slex_ctx_free...); doc/API-CONTEXTO.md.
  * La API de siempre no cambia: un programa escrito para ella compila sin
    tocarlo y da la misma salida. libslex.so.0 conserva su nombre (pasa a
    libslex.so.0.1.0: se agregan funciones). vectorize_usr_func deja de ser
    obligatoria.
  * Un error ya no termina el proceso en un contexto nuevo: se anota y se
    devuelve. slex_ctx_free libera todo.
  * La memoria: cada intento de cada regexp pedia un bloque a PCRE2 y una
    copia del buffer y no los devolvia. d2datdinc usaba 275 MB para un
    circuito de 15 KB; ahora 5.
  * Errores arreglados: la marca de un def reconocia tokens mientras se leia
    la configuracion; una definicion que se nombra a si misma dejaba a la
    biblioteca girando; un segundo ini_slex terminaba en violacion de
    segmento; la funcion de una regla recibia use en 0.
  * d2datdinc usa un contexto propio. Su salida es la misma.
  * make check corre ademas test_ctx (99 pruebas), test_hilos y test_azar.

 -- Diego Saravia <dsa@unsa.edu.ar>  Mon, 05 Oct 2026 04:40:00 -0300

slex (1.0-8) noble; urgency=medium

  * Los numeros del dato van con 17 cifras y no con las 15 que escribe Perl.
    Quince no alcanzan para volver a leer un doble: el coeficiente 1/6 de una
    tabla de Butcher iba al .dat como 0.166666666666667 y volvia como
    0.16666666666666699, cuando el doble es 0.16666666666666666.
  * Lo encontro la comparacion de los dos caminos: el .din que sale directo
    del arbol y el que sale pasando por el .dat tenian que dar lo mismo y
    coincidian en 23 de 36, difiriendo solo en los coeficientes de Butcher.
    Ahora coinciden en los 36, byte a byte. La diferencia era de un ulp y no
    cambiaba ningun resultado, pero un formato que dice llevar el dato tiene
    que llevarlo entero.
  * Los 191 .dat congelados del corpus, regenerados: cambian todos. Y las dos
    referencias .esperado.dat de probar, que venian de ds2dat, pasan a ser
    referencias propias; el cruce contra el otro parser sigue siendo
    pruebas/contra-ds2dat, que lo corre en vivo.
  * probar pasa de 12 a 19 pruebas: siete nuevas del .din, que no tenia
    ninguna. Comprueban que circuitoB.ds da su .din base y el del metodo 3
    contra referencias congeladas, que sin -v no se escribe nada por stderr,
    que la configuracion de simul2 nombra los estados y el .din, que las
    tablas del .d van adentro del .din, y que sin estados diferenciales se
    dice por que no hay .din de un metodo.

 -- Diego Saravia <dsa@unsa.edu.ar>  Mon, 28 Sep 2026 05:30:00 -0300

slex (1.0-7) noble; urgency=medium

  * d2datc pasa a llamarse d2datdinc y escribe tambien el .din. Con --dat el
    dato JSON de Simul, con --din el sistema que resuelve Calcula, o los dos:
    las dos opciones se pueden pedir juntas. Sin pedir nada escribe el .dat,
    como siempre.
  * Con --din el sistema sale del arbol JSON que quedo en memoria al leer la
    entrada: no se escribe ni se vuelve a leer ningun .dat. Es la razon de ser
    del cambio, y de ahi el nombre. Escribe NOMBRE.din, NOMBRE-ED<NRO>.din y,
    si el dato no deja nada pendiente, NOMBRE-ED<NRO>.json con la
    configuracion de simul2. --directorio dice donde, y sin NRO usa el metodo
    que elige el dato.
  * El camino directo resulto ser mas preciso que el que pasa por el .dat, y
    eso dejo a la vista un defecto del formato: j_escribir escribe los numeros
    con %.15g, como los escribe Perl, que no alcanza para volver a leer un
    doble. El coeficiente 1/6 de una tabla de Butcher va al .dat como
    0.166666666666667 y vuelve como 0.16666666666666699, cuando el doble es
    0.16666666666666666. Son 13 de los 18 circuitos, y la diferencia es de un
    ulp: no cambia ningun resultado. Queda anotado sin arreglar, porque pasar
    a %.17g cambiaria 171 de los 191 .dat del corpus y alejaria el formato del
    de Perl.
  * El paquete Debian pasa a llamarse d2datdinc, e instala
    /usr/share/slex/d2datdinc.slex.

 -- Diego Saravia <dsa@unsa.edu.ar>  Mon, 28 Sep 2026 04:30:00 -0300

slex (1.0-6) noble; urgency=medium

  * El .din sale para 155 de los 184 datos del corpus, de los 107 de 1.0-5.
    Se resolvio una categoria por vez, comprobando en cada paso que los 36
    .din de los 18 que el Perl tambien traduce siguieran iguales byte a byte.
  * Las tablas del .d llegan al .din con sus filas adentro. Tres reglas de
    nombre demasiado estrechas lo impedian, y estaban en tres lugares
    distintos: la regla d_tabla de d2datc.slex no admitia un nombre numerico,
    asi que TABLE 1 no se reconocia y su contenido se perdia; d2datc se negaba
    a traducir esa referencia suponiendo que era de un MODEL de SCEPTRE, lo
    que en a02.d es falso porque TABLE 1 esta definida en la seccion FUNCTIONS
    de la corrida principal, y ahora se mira si la tabla esta en el dato; y la
    validacion del nombre en din, copiada del Perl, exigia que empezara con
    letra.
  * En el dato una tabla es {columnas, filas, origen} y el de Perl esperaba un
    texto por tabla, de modo que no podia con las que salen de un .d. Ahora se
    rinde el objeto al formato que espera Calcula --tabla NOMBRE y despues las
    filas en formato de tabular2-- y se aceptan las dos formas.
  * T1(punto) y XTABLE(tabla, punto), las dos formas de nombrar una tabla en
    el valor de una rama, salen como tabla('1.txt','X','Y',punto,1), que es la
    funcion que provee Calcula. El punto se traduce como cualquier otra
    expresion. Son 31 archivos. Y Table(...) es esa misma funcion, que en
    castellano se llama tabla: el traductor no la reconocia porque su lista
    estaba en castellano, y eran 9 archivos mas.
  * Ramas con varios parametros y varias ecuaciones. variab puede ser mas de 1
    y entonces el valor trae las partes separadas por comas de arriba: ESIN
    vale "1,T", o sea x1 = 1 y x2 = T. Y lista[0] puede traer mas de una
    expresion, y entonces la rama aporta una ecuacion por cada una. Con esto
    entran ESIN, MER, MQER y MHER sin nombrar ninguno.
  * La derivada de una rama es estado de integracion solo cuando su modelo
    tiene una sola expresion. Con dos, la segunda da la derivada en lugar de
    relacionarla --ESIN es una fuente y su derivada es dato-- y no hay nada
    que integrar. La variable existe igual, porque la segunda ecuacion la
    nombra, pero no entra en la lista de estados. Ademas de ser lo fisico, es
    lo que hace cerrar los grados de libertad.
  * din/README.md documenta todas las reglas de traduccion, lo que viaja
    comentado, las tres diferencias con el de Perl y los 29 casos que faltan.
  * Los 191 .dat congelados, regenerados: la referencia a la tabla sale
    traducida y la tabla viaja con sus filas. make check sigue en 4 de 4.

 -- Diego Saravia <dsa@unsa.edu.ar>  Mon, 28 Sep 2026 03:30:00 -0300

slex (1.0-5) noble; urgency=medium

  * Directorio din/ nuevo, con libdin.la: del dato de Simul al sistema del
    modulo dinamico de Calcula (el .din). Es la traduccion a C de
    Simul2/lib/Simul2/DesdeDat.pm, que sigue en Perl y es el oraculo. Parte
    del arbol JSON en memoria y no de un archivo .dat, que es lo que le va a
    permitir a d2datdinc ir del .d al .din sin nada intermedio. Las reglas de
    traduccion estan en din/README.md.
  * Verificado contra el Perl: los 18 circuitos del corpus que las dos
    implementaciones traducen dan los 36 .din iguales byte a byte --base y
    ampliado de cada uno-- y los 2 .json de configuracion tambien.
  * El alcance crecio de 18 a 107 de los 184 datos del corpus, resolviendo
    una categoria por vez y comprobando en cada paso que los 36 siguieran
    iguales. El tipo de rama ya no se enumera: lo que importa es su modelo en
    dato->{TIPO}, y si ese modelo deriva la corriente o la tension la rama
    aporta un estado diferencial. El valor de una rama puede ser el nombre de
    un parametro de defpar, que entonces lo comparten todas las ramas que lo
    nombren, o una expresion que se traduce simbolo por simbolo. Un dato sin
    ramas da un .din con solo la carga comentada. Y los 30 archivos que
    numeran sus nodos desde 1 eligen masa, anotada con  # @masa N .
  * X1(expresion) es EXPRESSION 1 de SCEPTRE y no una funcion: se le saca el
    nombre. Tabla de intrinsecas de FORTRAN a ExprTk (DSIN -> sin). Las
    expresiones viajan como estan: los .d que se escriban de ahora en
    adelante van en notacion de ExprTk.
  * d2datc: la seccion FUNCTIONS ya no se pierde con argumentos de mas de un
    caracter, y la lista de argumentos se guarda en el dato como cuarto
    elemento de la entrada, porque el postparser de Siru la tiraba y sin ella
    no se puede volver a escribir la funcion. Los 191 .dat congelados del
    corpus, regenerados.
  * dato/json.c: j_leer y j_leer_archivo, el lector que le faltaba al modulo,
    verificado con ida y vuelta sobre los 191 .dat del corpus; y
    j_escribir_bonito, que reproduce el pretty de JSON::PP, que es el formato
    del archivo de configuracion de Simul2/bin/simul2.
  * make check sigue en 4 de 4, con contra-dods en 191 iguales y 0 distintos.

 -- Diego Saravia <dsa@unsa.edu.ar>  Mon, 28 Sep 2026 02:00:00 -0300

slex (1.0-4) noble; urgency=medium

  * Paquete d2datc nuevo, el tercero de este arbol: el programa que lleva un
    .d, un .ds o un .ds2 al dato JSON de Simul. Era examples/10, y pasa a
    programa instalable porque es una etapa de produccion del pipeline de
    Simul2 (.d -> .dat -> .din -> calcula) y no un ejemplo. El nombre lleva
    la c de C para no pisar el ds2dat de Simulparser, que queda en el arbol.
  * No le agrega ninguna dependencia al paquete: enlaza libslex y la
    libdato.la de este mismo arbol, PCRE2, mem_util y -lm. No usa tabular2.
  * Instala dos cosas que antes salian del arbol de fuentes:
    /usr/share/slex/d2datc.slex, la tabla de regexps que lee ini_slex (era
    examples/10/slex.slex, con la ruta compilada al directorio de trabajo), y
    /usr/share/slex/biblioteca/{libraryori.siru,rk.siru}, que un .d necesita
    porque SCEPTRE no trae include y que antes se buscaban en
    Simulparser/biblioteca por una ruta absoluta al home del autor. Las
    pruebas del arbol se los pasan con -c y -b.
  * Las 12 pruebas de d2datc y la regresion del corpus completo entran al
    make check: son 4 pruebas en total con las dos de tests/, todas pasan.
    contra-dods se saltea solo (estado 77) si no esta la copia de trabajo de
    siru, como en el build de este paquete. Para saltearla a mano:
    make check TESTS=probar
  * El .dat anota en OTHERINFO el programa que lo produjo, y ahora dice
    d2datc. Los 191 .dat congelados del corpus siguen diciendo example10,
    que es lo que los produjo; no importa para la comparacion, que descarta
    OTHERINFO porque tiene rutas.

 -- Diego Saravia <dsa@unsa.edu.ar>  Sun, 27 Sep 2026 23:35:00 -0300

slex (1.0-3) noble; urgency=medium

  * Directorio dato/ nuevo, con la capa que no sabe nada del formato que se
    lee: json.[ch] (el arbol JSON), texto.[ch] (avisos, normalizar,
    recortar, sin_espacios, agregar, vec_agregar, cmp_str, relativa) y
    expr.[ch] (numeros, expresiones y listas como los escribe Perl). Salio
    de examples/10/dato.c, que queda en 1439 lineas y era 1638.
  * Es una biblioteca de conveniencia, noinst_LTLIBRARIES libdato.la: se
    compila y se comprueba, pero no se instala. Un .so nuevo pide su propio
    par de paquetes, que es ceremonia para 320 lineas con un solo
    consumidor, y una API diseñada contra un unico consumidor casi siempre
    sale mal. Se promueve cuando aparezca el segundo.
  * Lo que dejo de ser estatico lleva prefijo, porque ahora es API: dp a
    expr_p, blancos a expr_blancos, expr a expr_numero, valor_data a
    expr_valor, evaluar_lista a expr_lista, d_agregar a vec_agregar. El
    cursor expr_p queda expuesto a proposito, porque dato_data lee los
    caminos {'clave'}->[N] de DATA con el mismo cursor y sigue desde donde
    el evaluador termino.
  * aviso ya no nombra a ningun programa: el prefijo es aviso_programa, que
    pone quien la usa. La salida por stderr no cambio.
  * examples/10/pruebas/contra-dods nuevo: la regresion del corpus completo
    contra los 191 .dat congelados en el r1472 de siru, sin Perl ni
    Simulparser. Verificado despues de la mudanza: 191 iguales, 0 distintos.
  * Aviso para quien mire el historial: el r1481 de siru, con el mensaje
    "k", commiteo el arbol a mitad de esta mudanza y no compila. El r1482 lo
    deja andando.

 -- Diego Saravia <dsa@unsa.edu.ar>  Sun, 27 Sep 2026 23:45:00 -0300

slex (1.0-2) noble; urgency=medium

  * El paquete corre sus pruebas al construirse. Hasta ahora debian/rules
    las salteaba con un override_dh_auto_test vacio, porque no habia
    "make check": las pruebas eran tests/run_tests.sh, con el prefijo
    cableado y archivos buscados afuera del paquete.
  * tests/Makefile.am nuevo: test_api (38 comprobaciones de la API) y badini
    (config invalida) se compilan contra la biblioteca de este arbol,
    $(top_builddir)/src/libslex.la, y no contra una instalada. corre-badini
    los para en el directorio que cada uno necesita.
  * examples/10/probar ya no busca nada en Simulparser: sus archivos de
    prueba estan en examples/10/pruebas (12 pruebas, todas bien).
  * Sigue afuera del paquete tests/run_tests.sh, que compila los ejemplos
    07, 08 y 10. Lo que lo deja afuera son el 07 y el 08, que interpolan
    tablas y necesitan tabular2; el 10 no la usa.

 -- Diego Saravia <dsa@unsa.edu.ar>  Sun, 27 Sep 2026 23:30:00 -0300

slex (1.0-1) noble; urgency=medium

  * Primer empaquetado Debian/Ubuntu. Se empaqueta porque slex pasa a ser
    la base de los lexers de todos los programas: Simulparser, el parser
    en Perl, se retira, y el ejemplo 10 ya reproduce su salida sobre el
    corpus entero.
  * Dos paquetes: libslex0 con la biblioteca compartida y libslex-dev con
    los encabezados, el enlace de desarrollo, el .a y el slex.pc.
  * libslex declara ahora sus dependencias, PCRE2 y mem_util, en lugar de
    dejar los simbolos sin resolver para que los enlazara cada programa:
    libslex.so.0 tiene los NEEDED y el slex.pc los pide con Requires.

 -- Diego Saravia <dsa@unsa.edu.ar>  Sun, 27 Sep 2026 12:00:00 -0300
