Documentos de Académico
Documentos de Profesional
Documentos de Cultura
MEMORIA DE JUSTIFICACIÓN
12 de julio de 2020
Autor: Gabriel Villarrubia Gonzalez
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
Índice
MIEMBROS DEL EQUIPO DE TRABAJO: ...................................................................................... 2
MOTIVACIÓN DE ESTE TRABAJO:............................................................................................ 3
OBJETIVOS CONSEGUIDOS DURANTE LA REALIZACIÓN DE ESTE PROYECTO: ......................................... 8
TEMPORIZACIÓN DE TAREAS REALIZADAS .............................................................................. 10
PUNTO DE PARTIDA, ENCUESTA A ESTUDIANTES: ...................................................................... 10
FUNCIONAMIENTO DEL ALGORITMO: ................................................................................... 15
PUESTA EN FUNCIONAMIENTO: ........................................................................................... 31
CONCLUSIONES: ............................................................................................................ 35
CODIGO ADJUNTADO ................................................................................................. 38
1
Minecraft para diseños HDL: Flujo de
Síntesis de Verilog para Circuitos de
Redstone - ID2019/076
PROGRAMA DE MEJORA DE LA CALIDAD
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
NIF Nombre y apellidos E-mail
2
Motivación de este trabajo:
El encanto de minecraft es que cada elemento que aparece está compuesto por
cubos de tres dimensiones y, a partir de distintos utensilios, puede cimentar
lugares en los que refugiarse dependiendo de las necesidades del juego.
Las 7 ventajas de jugar al Minecraft en el ámbito educativo son enumeradas a
continuación:
1. Creatividad. Minecraft es ante todo un juego creativo. Quien juegue a esta
actividad debe estar dispuesto a llevar a cabo construcciones en momentos de
supervivencia, además, gracias a los bloques de materiales, podrán establecerse
todo tipo de estructuras. Los niños podrán llevar a cabo casas de varios pisos,
habitaciones, pasadizos o pasillos, gestionando ellos mismos los bienes que
aparecen, utilizando su imaginación.
2. Visión espacial. Conceptos como el espacio, la longitud, el volumen o la
superficie van ligados a la fisionomía de los juegos de minecraft. Además de ser
divertidos y especiales para niños, incluyen este tipo de conceptos en las
construcciones online que irán haciendo los niños, que al fin y al cabo son
fundamentales para su desarrollo.
3. Relajación. Como todo juego, uno de sus principales beneficios es la
capacidad que tiene en los niños para relajarles. Nuestros hijos estarán
tranquilos con un juego como minecraft porque carece de violencia y no les
alterará, además, algunas partes del juego, como la recolección de herramientas,
pueden hacerse de forma automática y no hará que se pongan nerviosos.
4. Concentración. Aunque jugar a una actividad como minecraft ayuda a que la
mente esté despejada, también es cierto que requiere una concentración
especial. Los niños que lleven a cabo desarrollos dentro de este juego, tendrán
que estar muy atentos a la hora de crear su proyecto y de construir el refugio o la
casa que estén pensando en ese momento. Aunque el hecho de acumular o
colocar herramientas sea distendido, su capacidad de concentración
aumentará porque deberá estar muy pendiente de la construcción para que
funcione.
5. Capacidad de razonamiento. Para jugar a minecraft los niños tendrán que
aprender a discurrir rápidamente y con tiento, es decir, para establecer la
construcción y no equivocarse no vale con dejarse llevar, sino que los niños
3
tienen que pensar concienzudamente si cada paso es correcto y si merece la
pena para la estructura que están llevando a cabo.
6. Gestión de recursos. Otro de los beneficios de jugar a minecraft es que los
niños aprenderán a gestionar los recursos disponibles, ya que éstos no se
reproducen de forma mágica. Para llevar a cabo sus construcciones, se instruirán
en la necesidad de poder llevar a cabo las actividades con los bienes
disponibles que les da el propio juego en su versión de supervivencia, que va
más allá de la creatividad. Además de la gestión de estos recursos, también
aprenderán a descubrir la eficacia de estos para dotarles de mayor creatividad.
7. Superación personal. Teniendo en cuenta que los retos de minecraft se van
complicando conforme avanza el usuario, esto ayuda al niño a aumentar su
marca personal a la hora de establecer las construcciones. Los niños se
querrán superar a sí mismos para afrontar nuevos obstáculos según se vaya
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
complicando la actividad.
Minecraft es motivador y despierta el interés de los alumnos, que aprenden
mientras se divierten. Permite potenciar multitud de habilidades, desde
la creatividad, la imaginación, la resolución de problemas o la competencia
digital hasta nociones de ingeniería, matemáticas, historia o arte, según el
enfoque que le dé el profesor. Además, promueve el aprendizaje activo, el
esfuerzo, el afán de superación, el pensamiento crítico y la cooperación.
La clave de utilizar Minecraft en el ámbito educativo reside en utilizar un
videojuego que resulta divertido para los estudiantes y aprovechar esa
motivación para impulsar el aprendizaje. Partiendo de esta base, las opciones
son tan variadas como la creatividad del docente y el objetivo que busque.
Por sus características y su condición de videojuego online , mejora la
competencia digital y la creatividad, siendo adecuado para que los alumnos
aprendan a desenvolverse y utilizar las TIC, poniendo en práctica toda su
creatividad e imaginación.
Otra de las aplicaciones frecuentes de Minecraft en el aula es el practicar con la
arquitectura y diseñar mejores espacios y ciudades, espacios respetuosos con el
medio ambiente, nuevas soluciones arquitectónicas… Además, permite
comprender de forma gráfica las características de un movimiento arquitectónico
o las claves de la ingeniería y los materiales.
El juego también mejora la lectura y la expresión escrita permitiendo incluir
mensajes, expresarse y comunicarse con otros jugadores en el entorno virtual a
través del chat textual incorporado e incluso escribir libros o guías en el propio
juego con el objeto Libro y pluma.
La propia web de Minecraft Education Edition permite descargarse lecciones con
las que los alumnos pueden recorrer el templo de Artemisa o las pirámides de
Egipto, crear obras de arte o conocer las construcciones de la II Guerra Mundial.
También se puede aplicar el role-playing en los escenarios de Minecraft para
profundizar en culturas o civilizaciones.
Minecraft permite estudiar cualquier asignatura por muy específica que sea, por
ejemplo, estudiar química, ciencias… o cualquier otra materia. El blog Proyectos
de Ciencia y Tecnología recopila las numerosas aplicaciones que puede tener
Minecraft en la educación. Por ejemplo, los profesores Mark Lorch y Joel Millsy.
4
Sus alumnos crearon MolCraft http://hipertextual.com/2015/11/molcraft, un
mundo con representaciones de moléculas químicas que ahora cualquier usuario
puede descargar como paquete y agregarlo a su juego. Es una de las muchas
modificaciones, mods, que se añaden a Minecraft y suman nuevas opciones al
juego, resultando muy útiles para el ámbito educativo. El
propio MinecraftEdu nació como mod para docentes y ahora se está adaptando
para crear Minecraft Education Edition, en cuya web también pueden verse y
compartirse propuestas educativas con este videojuego.
Debido a lo mencionado anteriormente, el grupo de trabajo decide poner en
marcha este novedoso proyecto centrado en desarrollar contenidos relacionados
con las asignaturas de electrónica del Grado de Ingeniería Informática.
El objetivo de este proyecto es crear un espacio virtual mediante la
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
5
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
I LUSTRACIÓN 1. E JEMPLO C IRCUITO ELECTRÓNICO BÁSICO CON DISPLAY
6
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
7
I LUSTRACIÓN 3. P RÁCTICA F INAL C OMPUTADORES R EALIZADA CON M INECRAFT
Objetivos conseguidos durante la realización de este proyecto:
# OBJETIVO DESCRIPCIÓN
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
incorporación en una clase.
Resultado: Conjunto de requisitos no funcionales y
medidas para la correcta incorporación del sistema
en cualquier clase.
02.3 Investigación y estudio acerca del desarrollo de Descripción: Análisis de diferente documentación
plugins y mods para Minecraft para desarrollar módulos para Minecraft.
Resultado: Elección del framework y tecnologías de
implementación.
8
prueba de circuitos digitales.
04.1 Generación de contenido de ejemplo para clases Descripción: Diseño del contenido multimedia y
de electrónica. manuales para formar a los profesores.
Resultado: Contenido de pruebas.
04.2 Instalación de la aplicación en las Oculus Rift Descripción: Instalación de la aplicación en las
para las pruebas. Oculus Rift.
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
05.2 Medición del impacto mediante indicadores de Descripción: Medir si la herramienta presenta una
eficiencia. eficiencia en el rendimiento de los alumnos.
Resultado: Obtención de resultados académico
gracias a la implantación del proyecto.
9
06.1 Recogida y evaluación de la implantación del Descripción: Evaluación de todos los resultados
sistema. obtenidos mediante el desarrollo e implantación del
sistema.
Resultado: Documentar todos los resultados
obtenidos a nivel de usabilidad, desarrollo software,
empleo de los alumnos y beneficios académicos.
06.2 Publicación de los resultados obtenidos en Descripción: Exposición de los resultados
revistas científicas. obtenidos en Congreso y revistas del proyecto para
la difusión de los beneficios de este tipo de
herramientas.
Resultado: Publicación de artículo en congreso
internacional.
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
Temporización de Tareas Realizadas
10
1. ¿Conoces Minecraft?
¿Conoces Minecraft?
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
SI No
SI No
11
3. ¿Crees que la utilización de Minecraft en el grado de Ingeniería
Informática podría facilitar la adquisición de conocimientos?
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
SI No
SI No
12
5. ¿Conoces RedStone?
¿Conoces RedStone?
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
SI No
SI No
13
7. ¿Te gustaría que en la asignatura de Computadores I, los profesores
utilizasen Minecraft en alguna sesión?
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
SI No
14
Funcionamiento Del Algoritmo:
El funcionamiento del sistema de conversión de circuitos de verilog a redstone se
ha implementado mediante el siguiente algoritmo:
15
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
16
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
17
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
18
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
19
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
20
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
21
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
22
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
23
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
24
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
25
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
26
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
27
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
28
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
29
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
30
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
31
Puesta en funcionamiento:
32
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
33
I LUSTRACIÓN 9. I NSTALACIÓN DE
MINECRAFT
I LUSTRACIÓN 8. I NSTALACIÓN D EL SISTEMA VR
I LUSTRACIÓN 11. EJEMPLO ALUMNO JUGANDO
I LUSTRACIÓN 10. F INALIZACIÓN DE INSTALACIÓN
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
34
Conclusiones:
Vistos muchas veces como una pérdida de tiempo, los “juegos tienen más
beneficios que desventajas en la educación universitaria”. La idea de jugar o
divertirse jugando es una actividad que a menudo se relaciona con los niños. Los
adultos difícilmente podrían asociar en una primera instancia el juego a la vida
adulta. Al mismo tiempo, la consideración de que “jugar es perder el tiempo” se
encuentra largamente extendida en entornos educativos y profesionales de la
educación. Estos prejuicios y limitaciones iniciales cuando se aplican al mundo
educativo no hacen más que prohibir el pasaje al aula de una herramienta
sumamente útil tanto para docentes como para estudiantes de todos los niveles.
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
35
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
36
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
I LUSTRACIÓN 12. N OTICIA EL MUNDO : HTTPS :// DIARIODECASTILLAYLEON . ELMUNDO . ES / ARTICULO / INNOVADORES / LECCION -
UNIVERSITARIA - BASE - CUBOS - PIXELES /20200519120412009801. HTML
37
CODIGO ADJUNTADO
Minecraft para diseños HDL: Flujo de Síntesis de Verilog para Circuitos de Redstone - ID2019/076 | 12 de julio de 2020
38
File: /home/gabri/MinecraftHDL/src/…crafthdl/block/BasicBlock.java Page 1 of 1
package minecrafthdl.block;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
}
File: /home/gabri/MinecraftHDL/src/…locks/BlockRenderRegister.java Page 1 of 1
package minecrafthdl.client.render.blocks;
import minecrafthdl.MinecraftHDL;
import minecrafthdl.block.ModBlocks;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
package minecrafthdl.synthesis.routing;
import minecrafthdl.Utils;
import minecrafthdl.synthesis.Circuit;
import minecrafthdl.synthesis.routing.pins.Pin;
import minecrafthdl.synthesis.routing.pins.PinPair;
import minecrafthdl.synthesis.routing.pins.PinsArray;
import minecrafthdl.synthesis.routing.vcg.VerticalConstraintGraph;
import net.minecraft.init.Blocks;
import net.minecraft.util.EnumFacing;
import java.util.ArrayList;
} catch (Exception e) {
e.printStackTrace();
}
width += 1;
if (n.isOutpath()){
circuit.setBlock(n.x_max, 0, n.trackZ() + 1,
Blocks.WOOL.getDefaultState());
circuit.setBlock(n.x_max, 1, n.trackZ() + 1,
Blocks.REDSTONE_WIRE.getDefaultState());
}
this.wireColumns(circuit, n);
this.repeatNets(circuit, n);
}
}
return circuit;
}
}
} else {
for(int i = n.track + 1; i < height - 1; i++){
chars[p.xPos()/2][i] = "│";
}
}
}
}
}
if(n.isOutpath()){
chars[n.x_max / 2][n.track+1] = "┐";
chars[n.x_max / 2][n.out_partner.track+1] = "┘";
}
boolean up = false;
boolean down = false;
boolean left = n.x_min / 2 < x;
boolean right = n.x_max / 2 > x;
if (p.top){
up = true;
for (Pin p2 : n.getpins()){
if (p2 != p && p.xPos() == p2.xPos()) down = true;
}
} else {
down = true;
for (Pin p2 : n.getpins()){
if (p2 != p && p.xPos() == p2.xPos()) up = true;
}
}
if (up){
if (down){
if (left){
if (right) chars[x][n.track + 1] = "┼";
else chars[x][n.track + 1] = "┤";
} else {
if (right) chars[x][n.track + 1] = "├";
//else chars[x][n.track + 1] = "│";
File: /home/gabri/MinecraftHDL/src/…synthesis/routing/Channel.java Page 4 of 7
}
} else {
if (left){
if (right) chars[x][n.track + 1] = "┴";
else chars[x][n.track + 1] = "┘";
} else {
if (right) chars[x][n.track + 1] = "└";
else chars[x][n.track + 1] = "?";
}
}
} else {
if (down){
if (left){
if (right) chars[x][n.track + 1] = "┬";
else chars[x][n.track + 1] = "┐";
} else {
if (right) chars[x][n.track + 1] = "┌";
else chars[x][n.track + 1] = "?";
}
} else {
if (left){
//if (right) chars[x][n.track + 1] = "─";
//else chars[x][n.track + 1] = "?";
} else {
if (right) chars[x][n.track + 1] = "?";
else chars[x][n.track + 1] = "?";
}
}
}
}
}
}
public void placeTrack(Circuit channel, int track_number, int xmin, int xmax,
ArrayList<Pin> pins){
int z_min = 1 + (3 * track_number);
int z_track = z_min + 1;
}
}
}
if (n.isOutpath()){
for (int z = n.trackZ() + 2; z < n.out_partner.trackZ() - 1; z++){
channel.setBlock(n.x_max, 0, z,
Blocks.REDSTONE_WIRE.getDefaultState());
}
}
}
if (n.isOutpath()){
if (n.out_partner.trackZ() - n.trackZ() > 14) {
for (int z = n.trackZ() + 3; z < n.out_partner.trackZ() - 2; z +=
13){
channel.setBlock(n.x_max, 0, z,
Blocks.UNPOWERED_REPEATER.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.UNPOWERED
"facing"), EnumFacing.NORTH));
}
}
channel.setBlock(n.x_max - 1, 2, n.trackZ(),
Blocks.UNPOWERED_REPEATER.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.UNPOWERED
"facing"), EnumFacing.WEST));
}
}
}
}
}
return x_max;
}
}
File: /home/gabri/MinecraftHDL/src/…rafthdl/synthesis/Circuit.java Page 1 of 3
package minecrafthdl.synthesis;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntitySign;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3i;
import net.minecraft.util.text.TextComponentString;
import net.minecraft.world.World;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
ArrayList<ArrayList<ArrayList<IBlockState>>> blocks;
HashMap<Vec3i, TileEntity> te_map = new HashMap<Vec3i, TileEntity>();
if (direction == EnumFacing.NORTH){
start_z += 2;
} else if (direction == EnumFacing.SOUTH) {
start_z -= length + 1;
} else if (direction == EnumFacing.EAST){
start_x -= width + 1;
} else if (direction == EnumFacing.WEST) {
start_x -= width + 1;
}
File: /home/gabri/MinecraftHDL/src/…rafthdl/synthesis/Circuit.java Page 2 of 3
int y = start_y - 1;
for (int z = start_z - 1; z < start_z + length + 1; z ++){
for (int x = start_x - 1; x < start_x + width + 1; x++){
worldIn.setBlockState(new BlockPos(x, y, z),
Blocks.STONEBRICK.getDefaultState());
}
}
}
}
}
}
File: /home/gabri/MinecraftHDL/src/…hdl/synthesis/CircuitTest.java Page 1 of 1
package minecrafthdl.synthesis;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import java.util.ArrayList;
package minecrafthdl;
import minecrafthdl.client.render.blocks.BlockRenderRegister;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
@Override
public void preInit(FMLPreInitializationEvent e) {
super.preInit(e);
}
@Override
public void init(FMLInitializationEvent e) {
super.init(e);
BlockRenderRegister.registerBlockRenderer();
}
@Override
public void postInit(FMLPostInitializationEvent e) {
super.postInit(e);
}
}
File: /home/gabri/MinecraftHDL/src/…/minecrafthdl/CommonProxy.java Page 1 of 1
package minecrafthdl;
import minecrafthdl.block.BasicBlock;
import minecrafthdl.block.ModBlocks;
import minecrafthdl.block.blocks.Synthesizer;
import minecrafthdl.gui.MinecraftHDLGuiHandler;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.network.NetworkRegistry;
import net.minecraftforge.fml.common.registry.ForgeRegistries;
}
File: /home/gabri/MinecraftHDL/src/…in/java/minecrafthdl/Demo.java Page 1 of 2
package minecrafthdl;
import MinecraftGraph.*;
mux.addVertex(i);
mux.addVertex(j);
mux.addVertex(not_1);
mux.addVertex(not_2);
mux.addVertex(a);
mux.addVertex(b);
mux.addVertex(c);
mux.addVertex(d);
mux.addVertex(and_1);
mux.addVertex(and_2);
mux.addVertex(and_3);
mux.addVertex(and_4);
mux.addVertex(or_1);
mux.addVertex(o);
mux.addEdge(i, not_1);
mux.addEdge(j, not_2);
mux.addEdge(i, and_2);
mux.addEdge(i, and_4);
mux.addEdge(not_1, and_1);
mux.addEdge(not_1, and_3);
mux.addEdge(j, and_3);
mux.addEdge(j, and_4);
mux.addEdge(not_2, and_1);
mux.addEdge(not_2, and_2);
mux.addEdge(a, and_1);
mux.addEdge(b, and_2);
File: /home/gabri/MinecraftHDL/src/…in/java/minecrafthdl/Demo.java Page 2 of 2
mux.addEdge(c, and_3);
mux.addEdge(d, and_4);
mux.addEdge(and_1, or_1);
mux.addEdge(and_2, or_1);
mux.addEdge(and_3, or_1);
mux.addEdge(and_4, or_1);
mux.addEdge(or_1, o);
return mux;
}
}
File: /home/gabri/MinecraftHDL/src/…sis/routing/pins/EmptyPin.java Page 1 of 1
package minecrafthdl.synthesis.routing.pins;
import minecrafthdl.MHDLException;
package MinecraftGraph;
super.type=VertexType.FUNCTION;
super.bits_n=x;
id=i;
this.func_type=f_t;
}
@Override
public void addToNext(Vertex v){
super.addToNext(v);
}
@Override
public void addToBefore(Vertex v){
super.addToBefore(v);
}
@Override
public String getID(){
return String.valueOf(id);
package MinecraftGraph;
package minecrafthdl.synthesis;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.Vec3d;
import java.util.HashMap;
public Gate(int sizeX, int sizeY, int sizeZ, int num_inputs, int num_outputs,
int input_spacing, int output_spacing, int[] output_lines) {
super(sizeX, sizeY, sizeZ);
this.num_inputs = num_inputs;
this.num_outputs = num_outputs;
this.input_spacing = input_spacing;
this.output_spacing = output_spacing;
this.output_lines = output_lines;
}
}
File: /home/gabri/MinecraftHDL/src/…sis/routing/pins/GatePins.java Page 1 of 2
package minecrafthdl.synthesis.routing.pins;
import MinecraftGraph.Vertex;
import minecrafthdl.MHDLException;
import minecrafthdl.synthesis.Gate;
import java.util.ArrayList;
if (top){
for(int i = 0; i < g.num_outputs; i++){
pins.add(new Pin(offset + (i * (1 + g.output_spacing)), true));
}
} else {
for(int i = 0; i < g.num_inputs; i++){
pins.add(new Pin(offset + (i * (1 + g.input_spacing)), false));
}
}
}
this.next_free_input_pin += 1;
return pins.get(this.next_free_input_pin - 1);
}
for(Pin p : pins){
if(p.x - offset == 0) str = 'x' + str.substring(p.x - offset + 1);
else if (p.x - offset == gate_width - 1) str = str.substring(0, p.x -
offset) + 'x';
else str = str.substring(0, p.x - offset) + 'x' + str.substring(p.x
- offset + 1);
}
return str;
}
}
File: /home/gabri/MinecraftHDL/src/…java/MinecraftGraph/Graph.java Page 1 of 2
package MinecraftGraph;
import java.util.ArrayList;
public Graph(){
vertices=new ArrayList<Vertex>();
}
if (v2.type == VertexType.FUNCTION){
Function f = (Function) v2;
if (f.func_type == FunctionType.MUX){
MuxVertex m = (MuxVertex) f;
}
}
v1.addToNext(v2);
v2.addToBefore(v1);
//This function takes the inputs to the first vertex v1 and adds them to v2
public void mergeVertices(Vertex v1, Vertex v2){
//v1 is to be merged(source)
for(Vertex v: v1.getBefore()){
v2.addToBefore(v);
v.addToNext(v2);
}
}
File: /home/gabri/MinecraftHDL/src/…java/MinecraftGraph/Graph.java Page 2 of 2
return vertices;
package GraphBuilder;
import GraphBuilder.json_representations.JCell;
import GraphBuilder.json_representations.JPort;
import GraphBuilder.json_representations.JsonFile;
import GraphBuilder.json_representations.Module;
import MinecraftGraph.*;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.stream.JsonReader;
import minecrafthdl.MHDLException;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
//main class
//json file->javaObject->Vertex->graph
public class GraphBuilder {
private static ArrayList<String> ports_names=new ArrayList<String>();
private static ArrayList<String> cells_names=new ArrayList<String>();
private static ArrayList<Port> ports=new ArrayList<Port>();
private static ArrayList<Cell> cells=new ArrayList<Cell>();
if (i == 0) {
high_low_nets--;
Function f = new Function(cell_ids++, FunctionType.LOW, 0);
from_net.put(high_low_nets, f);
to_net.put(high_low_nets, new ArrayList<Vertex>());
to_net.get(high_low_nets).add(v);
g.addVertex(f);
return high_low_nets;
} else if (i == 1){
high_low_nets--;
Function f = new Function(cell_ids++, FunctionType.HIGH,
0);
from_net.put(high_low_nets, f);
to_net.put(high_low_nets, new ArrayList<Vertex>());
to_net.get(high_low_nets).add(v);
g.addVertex(f);
return high_low_nets;
} else {
if (l == null) to_net.put(i, new ArrayList<Vertex>());
to_net.get(i).add(v);
return i;
}
}
File: /home/gabri/MinecraftHDL/src/…GraphBuilder/GraphBuilder.java Page 2 of 15
jf.postInit();
Module m = jf.modules.values().iterator().next();
In_output io;
if (p.direction.equals("input")){
io = new In_output(p.bits.size(),
VertexType.INPUT, p_name);
} else {
io = new In_output(p.bits.size(),
VertexType.OUTPUT, p_name);
g.addVertex(io);
}
cell_ids = 0;
File: /home/gabri/MinecraftHDL/src/…GraphBuilder/GraphBuilder.java Page 3 of 15
Function f;
if (f_type == FunctionType.MUX){
f = new MuxVertex(cell_ids++, f_type,
c.numInputs());
} else {
f = new Function(cell_ids++, f_type,
c.numInputs());
}
if (direction.equals("input")){
for (int i : conn_nets){
conn_net = putInToNet(i, f, g);
}
} else {
for (int i : conn_nets){
conn_net = putInFromNet(i, f);
}
}
if (f_type == FunctionType.MUX){
if (conn_name.equals("S")){
((MuxVertex) f).s_net_num =
conn_net;
} else if (conn_name.equals(("A"))) {
((MuxVertex) f).a_net_num =
conn_net;
} else if (conn_name.equals(("B"))) {
((MuxVertex) f).b_net_num =
conn_net;
}
}
}
g.addVertex(f);
}
if (v.type == VertexType.FUNCTION){
Function f = ((Function) v);
if (((Function) v).func_type ==
FunctionType.MUX){
MuxVertex mux = ((MuxVertex) f);
if (i == mux.a_net_num){
mux.a_vertex = from;
File: /home/gabri/MinecraftHDL/src/…GraphBuilder/GraphBuilder.java Page 4 of 15
} else if (i == mux.b_net_num){
mux.b_vertex = from;
} else if (i == mux.s_net_num){
mux.s_vertex = from;
}
}
}
g.addEdge(from, v);
}
}
return g;
}
test_i = 1;
System.out.println(test_i++); //1
//create jsononjects
Gson gson= new com.google.gson.Gson();
JsonFile jf = null;
try {
FileReader fr = new FileReader(path);
JsonReader jreader = new JsonReader(fr);
jreader.setLenient(true);
jf = gson.fromJson(jreader, JsonFile.class);
fr.close();
jreader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(test_i++); //2
jf.postInit();
Module m = jf.modules.values().iterator().next();
for(String s: m.ports.keySet()){
JPort p = m.ports.get(s);
Port port=new Port(s, p.direction, p.bits);
ports.add(port);
}
File: /home/gabri/MinecraftHDL/src/…GraphBuilder/GraphBuilder.java Page 5 of 15
System.out.println(test_i++); //3
for(String s: m.cells.keySet()){
JCell c = m.cells.get(s);
for(JPort p : c.ports.values()){
cells.add(cell);
j++;
}
System.out.println(test_i++); //4
System.out.println(test_i++); //5
Function v = null;
if (c_sel == null) {
throw new MHDLException("MUX MUST HAVE S
INPUT");
}
File: /home/gabri/MinecraftHDL/src/…GraphBuilder/GraphBuilder.java Page 6 of 15
gates.add(v);
graph.addVertex(v);
}
System.out.println(test_i++); //6
for(In_output v:outputs){
graph.addVertex(v);
}
System.out.println(test_i++); //7
//resolve connections
for(Port port:ports){
for(Port toCom:ports){
if(!port.equals(toCom)){
int conn_count=areConnected(port.bits,
toCom.bits);
if(port.direction.equals("input")&&toCom.direction.equals("output")&&conn_count>0){
for(int h=0; h<conn_count;h++)
}
}
System.out.println(test_i++); //8
for(Port port:ports){
graph.addEdge(getVertex(graph,
port), getVertex(graph, cell));
if(port.direction.equals("output")&&c2>0){
}
}
for(Cell c:cells){
if(!c.equals(cell)){
if(areConnected(cell.outputs, c.inputs)>0)
graph.addEdge(getVertex(graph,
cell), getVertex(graph, c));
}
System.out.println(test_i++); //9
optimizeGraph(graph);
System.out.println(test_i++); //10
return graph;
}
// sb1.append(line);
// line=b_r.readLine();
//
// if(line.contains("{")){
// ports_names.add(line.replaceAll(pattern,
""));
// port_braces++;
// }
// else if (line.contains("}")){port_braces--;}
// }
// sb1.append("}");
// sb1.append("}");
// portsBlock=sb1.toString();
//
// //read gates block in the json file
// int cells_braces=1;
// line=b_r.readLine();
// sb2.append("{");
//
// while(cells_braces!= 0){
//
// sb2.append(line);
// line=b_r.readLine();
//
// if(line.contains("{")){
// cells_braces++;
// if(cells_braces==2){
// cells_names.add(line.replace(":
{", "").replaceAll("[\"\\s]", ""));
// }
// }
// else if (line.contains("}")){cells_braces--;}
//
//
//
// }
//
// sb2.append("}");
// sb2.append("}");
// cellsBlock=sb2.toString();
//
//
//
// }catch (FileNotFoundException e) {
// e.printStackTrace();
// } catch (IOException f) {
// f.printStackTrace();
// }
//
// //create jsononjects
// Gson gson= new com.google.gson.Gson();
// System.out.println(portsBlock);
//
// JsonObject ports_obj=gson.fromJson(portsBlock,
JsonElement.class).getAsJsonObject().get("ports").getAsJsonObject();
//
//
//
// //read all ports names and create port objects
//
// for(String s: ports_names){
// JsonObject js=ports_obj.get(s).getAsJsonObject();
// Port port=new Port(s, js.get("direction").getAsString(),
js.get("bits").getAsJsonArray());
// ports.add(port);
//
File: /home/gabri/MinecraftHDL/src/…GraphBuilder/GraphBuilder.java Page 9 of 15
//
// }
//
// JsonObject cells_obj=gson.fromJson(cellsBlock,
JsonElement.class).getAsJsonObject().get("cells").getAsJsonObject();
//
//
// int j=1; //count to assign ids to gates
//
// for(String c: cells_names){
//
// JsonObject js_c=cells_obj.get(c).getAsJsonObject();
// JsonObject
param_obj=js_c.get("parameters").getAsJsonObject();
// JsonObject
conn_obj=js_c.get("connections").getAsJsonObject();
// JsonObject
dir_obj=js_c.get("port_directions").getAsJsonObject();
//
//
// String[] param=param_obj.toString().replaceAll("[{]",
"").split(",");
// String[] port_dir=conn_obj.toString().replaceAll("[{]",
"").split(",");
// String[] conn=dir_obj.toString().replaceAll("[{]",
"").split(",");
// ArrayList<Connection> conn_list=new ArrayList<>();
//
// for(int k=0; k<port_dir.length;k++){
//
// String holder=port_dir[k].split(":")
[0].replaceAll("[\"]", "");
// String dir=dir_obj.get(holder).getAsString();
// JsonArray n=conn_obj.get(holder).getAsJsonArray();
//
// conn_list.add(new Connection(dir, n));
//
//
//
// }
//
//
//
// Cell cell=new
Cell(j,js_c.get("type").getAsString(),conn_list );
//
// cells.add(cell);
// j++;
// }
//
// Graph graph=new Graph();
//
// //add inputs to graph vertices
// for(Port p: ports){
// if(p.direction.equals("input")){
// In_output in=new In_output(p.bits.size(),
VertexType.INPUT, p.name);
// inputs.add(in);
// graph.addVertex(in);
// }
// else{
// outputs.add(new In_output(p.bits.size(),
VertexType.OUTPUT, p.name));
// }
//
//
File: /home/gabri/MinecraftHDL/src/…GraphBuilder/GraphBuilder.javaPage 10 of 15
// }
// //add all cells
// for(Cell c:cells){
//
// Function v=new Function(c.id, VertexType.FUNCTION,
resolveType(c.type), c.inputs.size());
// gates.add(v);
// graph.addVertex(v);
// }
//
//
// for(In_output v:outputs){
// graph.addVertex(v);
// }
//
//
// //resolve connections
// for(Port port:ports){
//
// for(Port toCom:ports){
// if(!port.equals(toCom)){
// int conn_count=areConnected(port.bits,
toCom.bits);
//
if(port.direction.equals("input")&&toCom.direction.equals("output")&&conn_count>0){
// for(int h=0; h<conn_count;h++)
//
graph.addEdge(getVertex(graph, port), getVertex(graph, toCom));
// }else
if(port.direction.equals("output")&&toCom.direction.equals("input")&&conn_count>0){
// for(int h=0; h<conn_count;h++)
//
graph.addEdge(getVertex(graph, toCom), getVertex(graph, port));
//
// }
// }
//
// }
//
// }
//
// //add cells edges
// for(Cell cell:cells){
// for(Port port:ports){
// int c1=areConnected(port.bits, cell.inputs);
// if(port.direction.equals("input")&& c1>0){
// for(int h=0; h<c1;h++)
//
// graph.addEdge(getVertex(graph,
port), getVertex(graph, cell));
// }
//
// int c2=areConnected(port.bits, cell.outputs);
//
// if(port.direction.equals("output")&&c2>0){
//
// for(int h=0; h<c2;h++)
// graph.addEdge(getVertex(graph,
cell), getVertex(graph, port));
// }
//
// }
//
// for(Cell c:cells){
//
// if(!c.equals(cell)){
File: /home/gabri/MinecraftHDL/src/…GraphBuilder/GraphBuilder.javaPage 11 of 15
// if(areConnected(cell.outputs, c.inputs)>0)
// graph.addEdge(getVertex(graph,
cell), getVertex(graph, c));
// }
//
// }
//
// }
//
// optimizeGraph(graph);
// return graph;
// }
//
private static void optimizeGraph(Graph graph){
//iterate through all the nodes of the graph
//if or or and gate check outputs
//if all outputs are of the same type
//remove lower level and reconnect its inputs with the higher level
//got back
ArrayList<Vertex> verToRemove=new ArrayList<Vertex>();
for(Vertex v: graph.getVertices()){
System.out.println("vertex for");
FunctionType f_t=f.getFunc_Type();
if(f_t==FunctionType.AND||f_t==FunctionType.OR){
if(canMerge(f)){
for(Vertex s:f.getNext()){
System.out.println("vertex
inner for");
graph.mergeVertices(f, s);
verToRemove.add(f);
}
}
}
for(Vertex t:verToRemove){
System.out.println("vertex inner 2 for");
graph.removeVertex(t);
}
}
}
Function f=(Function)x;
if(f.getFunc_Type()!=v.getFunc_Type()){
return false;
}
}
return true;
File: /home/gabri/MinecraftHDL/src/…GraphBuilder/GraphBuilder.javaPage 12 of 15
//getting vertices
for(Vertex v:g.getVertices()){
if(v.getID().equals(p.name)){
return v;
}
}
return null;
for(Vertex v:g.getVertices()){
if(v.getID().equals(String.valueOf(p.id))){
return v;
}
}
return null;
int count=0;
for(Integer x: bits){
for(Integer y: inputs2){
if(x==y){
count++;
}
}
return count;
if(type.contains("and")||type.contains("AND")){
return FunctionType.AND;
}else if(type.contains("MUX")||type.contains("mux")){
return FunctionType.MUX;
}else if(type.contains("XOR")||type.contains("xor")){
return FunctionType.XOR;
}else if(type.contains("or")||type.contains("OR")){
return FunctionType.OR;
}else if(type.contains("dlatch_p")||type.contains("DLATCH_P")) {
return FunctionType.D_LATCH;
}else if(type.contains("not")||type.contains("NOT")){
return FunctionType.INV;
}else{
throw new MHDLException("Unknown Cell:" + type);
}
class Port{
String name;
String direction;
ArrayList<Integer> bits=new ArrayList<Integer>();
class Cell{
int id;
String type;
ArrayList<Connection> connections=new ArrayList<Connection>();
for(Connection c:connections){
if(c.direction.equals("input")){
for(int j=0; j<c.IDs.length; j++){
inputs.add(c.IDs[j]);
}
}
File: /home/gabri/MinecraftHDL/src/…GraphBuilder/GraphBuilder.javaPage 14 of 15
else{
for(int j=0; j<c.IDs.length; j++){
outputs.add(c.IDs[j]);
}
}
class Connection{
String name;
String direction;
int IDs[];
//
//class Port{
// String name;
// String direction;
// ArrayList<Integer> bits=new ArrayList<>();
//
// public Port(String n, String d, JsonArray b){
// name=n;
// direction=d;
//
//
// for(int i=0; i<b.size(); i++){
// bits.add(b.get(i).getAsInt());
// }
//
// }
//
//}
//
//class Cell{
// int id;
// String type;
// ArrayList<Connection> connections=new ArrayList<>();
//
// ArrayList<Integer> inputs=new ArrayList<Integer>();
// ArrayList<Integer> outputs=new ArrayList<>();
File: /home/gabri/MinecraftHDL/src/…GraphBuilder/GraphBuilder.javaPage 15 of 15
//
// public Cell(int i, String t, ArrayList<Connection> cns){
// id=i;
// type=t;
// connections=cns;
//
//
// for(Connection c:connections){
// if(c.direction.equals("input")){
// for(int j=0; j<c.IDs.length; j++){
// inputs.add(c.IDs[j]);
// }
// }
// else{
// for(int j=0; j<c.IDs.length; j++){
// outputs.add(c.IDs[j]);
// }
// }
//
// }
//
//
// }
//
//
//}
//
//class Connection{
//
// String direction;
// int IDs[];
//
// public Connection(String d, JsonArray arr){
// direction=d;
// IDs= new int[arr.size()];
// for(int j=0; j<arr.size(); j++){
// IDs[j]=arr.get(j).getAsInt();
//
// }
//
//
// }
//
//}
//
File: /home/gabri/MinecraftHDL/src/…/MinecraftGraph/In_output.java Page 1 of 1
package MinecraftGraph;
super.bits_n=num;
super.type=v_t;
this.name=n;
@Override
public String getID(){
return name;
}
File: /home/gabri/MinecraftHDL/src/…hesis/IntermediateCircuit.java Page 1 of 5
package minecrafthdl.synthesis;
import MinecraftGraph.*;
import minecrafthdl.MHDLException;
import minecrafthdl.Utils;
import minecrafthdl.synthesis.routing.Channel;
import minecrafthdl.synthesis.routing.Net;
import minecrafthdl.synthesis.routing.Router;
import minecrafthdl.synthesis.routing.pins.GatePins;
import minecrafthdl.synthesis.routing.pins.PinsArray;
import minecrafthdl.testing.TestLogicGates;
import net.minecraft.init.Blocks;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import java.util.ArrayList;
import java.util.HashMap;
int layer_num = 0;
if (valid){
vertex_layers.get(layer_num).add(v);
process_done.add(v);
to_process.add(n);
}
}
}
for (Vertex v : process_done){
in_process.remove(v);
finished.add(v);
}
for (Vertex v : to_process){
if (!in_process.contains(v)) in_process.add(v);
}
process_done.clear();
to_process.clear();
layer_num++;
ArrayList<Vertex> last_layer =
this.vertex_layers.get(this.vertex_layers.size() - 1);
for (Vertex v : outputs_not_in_last){
last_layer.add(v);
}
next_layer.add(relay);
removeFromNext.add(next);
next.removeBefore(v);
addToNext.add(relay);
relay.addToBefore(v);
relay.addToNext(next);
next.addToBefore(relay);
next.handleRelay(v, relay);
}
File: /home/gabri/MinecraftHDL/src/…hesis/IntermediateCircuit.java Page 3 of 5
this.channels.add(Router.placeNets(nets, pins_array));
Net.num_nets = 0;
}
File: /home/gabri/MinecraftHDL/src/…hesis/IntermediateCircuit.java Page 4 of 5
int size_x = 0;
int size_y = 0;
int size_z = 0;
layers_size_z[this.gate_layers.indexOf(layer)] = this_size_z;
}
int z_offset = 0;
for (int i = 0; i < this.gate_layers.size(); i++) {
int x_offset = 0;
for (Gate g : this.gate_layers.get(i)){
circuit.insertCircuit(x_offset, 0, z_offset, g);
x_offset += 1 + g.getSizeX();
}
z_offset += layers_size_z[i];
if (i < this.gate_layers.size() - 1) {
Channel c = this.channels.get(i);
circuit.insertCircuit(0, 0, z_offset, c.genChannelCircuit());
z_offset += c.sizeZ();
}
}
File: /home/gabri/MinecraftHDL/src/…hesis/IntermediateCircuit.java Page 5 of 5
return circuit;
}
if (v.getType() == VertexType.FUNCTION) {
return ((Function) v).getFunc_Type();
} else {
if (v.getType() == VertexType.INPUT) return FunctionType.Input;
else return FunctionType.Output;
}
}
}
File: /home/gabri/MinecraftHDL/src/…son_representations/JCell.java Page 1 of 1
package GraphBuilder.json_representations;
import java.util.ArrayList;
import java.util.HashMap;
@Override
public ArrayList<Integer> getNets() {
return null;
}
package GraphBuilder.json_representations;
import java.util.ArrayList;
@Override
public ArrayList<Integer> getNets() {
return null;
}
}
File: /home/gabri/MinecraftHDL/src/…_representations/JsonFile.java Page 1 of 1
package GraphBuilder.json_representations;
import java.util.HashMap;