// LPM Router - Reference Solution
// Implements Longest Prefix Match using a priority encoder structure.
// Checks prefixes from longest (most specific) to shortest.

module lpm_router (
    input  wire [31:0] ip_addr,
    output reg  [2:0]  next_hop
);

    always @(*) begin
        // Priority 1: /24 Prefixes (Mask 255.255.255.0 = FFFFFF00)
        if ((ip_addr & 32'hFFFFFF00) == 32'h0A010100) begin
            // 10.1.1.0/24
            next_hop = 3'd3;
        end
        else if ((ip_addr & 32'hFFFFFF00) == 32'hC0A80100) begin
            // 192.168.1.0/24
            next_hop = 3'd5;
        end
        else if ((ip_addr & 32'hFFFFFF00) == 32'h08080800) begin
            // 8.8.8.0/24
            next_hop = 3'd7;
        end
        
        // Priority 2: /16 Prefixes (Mask 255.255.0.0 = FFFF0000)
        else if ((ip_addr & 32'hFFFF0000) == 32'h0A010000) begin
            // 10.1.0.0/16
            next_hop = 3'd2;
        end
        else if ((ip_addr & 32'hFFFF0000) == 32'hC0A80000) begin
            // 192.168.0.0/16
            next_hop = 3'd4;
        end
        
        // Priority 3: /12 Prefixes (Mask 255.240.0.0 = FFF00000)
        else if ((ip_addr & 32'hFFF00000) == 32'hAC100000) begin
            // 172.16.0.0/12 (172 = 0xAC, 16 = 0x10)
            next_hop = 3'd6;
        end
        
        // Priority 4: /8 Prefixes (Mask 255.0.0.0 = FF000000)
        else if ((ip_addr & 32'hFF000000) == 32'h0A000000) begin
            // 10.0.0.0/8
            next_hop = 3'd1;
        end
        
        // Priority 5: Default Route (/0)
        else begin
            // 0.0.0.0/0
            next_hop = 3'd0;
        end
    end

endmodule
