diff --git a/src/AMGenerator.java b/src/AMGenerator.java
new file mode 100644
index 0000000000000000000000000000000000000000..7bd802ed14bca9b352cfd65d56baff4ec217905e
--- /dev/null
+++ b/src/AMGenerator.java
@@ -0,0 +1,128 @@
+package carfollowing_2024_05_02;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+
+import DEVSModel.DEVSAtomic;
+import DEVSModel.Port;
+
+public class AMGenerator extends DEVSAtomic {
+	
+	Port carGen;
+	
+	enum Phase {generate, stop};
+	Phase phase;
+	
+	private float sigma, time;
+	
+	static int numCar = 10;
+	static int numTestFile = 9;
+	
+	static String test = "input/input";
+	static String filePath = test+String.valueOf(numCar)+"_"+String.valueOf(numTestFile)+".txt";
+	
+	String line = "";
+	BufferedReader reader = null;
+	
+	public AMGenerator(String name) {
+		this.name = name;
+		carGen = new Port(this, "car_generated");
+		this.addOutPort(carGen);
+		
+		// 2024_04_17 read input from file
+		try {
+			reader = new BufferedReader(new FileReader(filePath));
+			reader.readLine();				// Read header line
+		} catch (IOException ex) {
+				ex.printStackTrace();
+		} 
+	}
+	
+	@Override
+	public void deltaExt(Port arg0, Object arg1, float arg2) {
+		// nothing to do
+		
+	}
+	
+	@Override
+	public void deltaInt() {		
+//		if (countCar < numCar) {
+//			countCar ++;
+//		}
+//		else phase = Phase.stop;		
+		
+		// 2024_04_17 
+		System.out.println("---deltaInt---" + this.name);
+		
+		try {
+			line = reader.readLine();				
+		} catch (IOException ex) {
+				ex.printStackTrace();
+		}	
+		
+		if (line == null)
+			phase = Phase.stop;
+		
+		System.out.println(phase);
+	}
+
+	@Override
+	public float getDuration() {
+		// 2024_04_17 edit for input duration time
+//		System.out.println("---getDuration---" + this.name);
+		
+		if (phase == Phase.stop) return Float.POSITIVE_INFINITY;
+		else {
+			String[] fields = line.split(" ");
+			return Integer.parseInt(fields[0]);
+		}
+	}
+
+	@Override
+	public void init() {
+		/* Init state: Generate */
+		
+		phase = Phase.generate;
+		time = 0;
+		sigma = 0;
+		
+		try {
+			line = reader.readLine();				
+		} catch (IOException ex) {
+				ex.printStackTrace();
+		} 
+		
+		if (line != null) {
+			String[] fields = line.split(" ");
+			sigma = Integer.parseInt(fields[0]);
+		}
+	}
+
+	@Override
+	public Object[] lambda() {
+		/* Output an object include:
+		 * obj[0] : port
+		 * obj[1] : carGen object with id, init speed, departure time */
+		
+		// Test 2024_04_17 read input from files
+		time += getDuration();
+		System.out.println("---lamda---" + this.name);
+		System.out.println("Time: " + time);
+		
+		String id = "";
+		int speed = 0;
+		
+		String[] fields = line.split(" ");
+
+		id = fields[1];
+		speed = Integer.parseInt(fields[2]);
+				
+		System.out.println("*** Car("+id+") generated");
+		Object[] obj = new Object[2];
+		obj[0] = this.carGen; 	
+		obj[1] = new Car(id, speed, time);
+			
+		return obj;
+	}
+}